STM32 SPI对外部FLASH的访问(转载)

本文详细介绍了如何使用STM32的SPI接口与外部FLASH进行通信,包括配置SPI时钟、初始化GPIO、建立通信协议等步骤,旨在帮助读者理解并实现STM32对外部FLASH的数据读写操作。
摘要由CSDN通过智能技术生成
本帖最后由 nibutaiguai 于 2012-6-8 11:37 编辑
3.17.1 SPI 简介

SPI 是英语Serial Peripheralinterface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,STM32也有SPI接口。

SPI接口一般使用4条线:

MISO 主设备数据输入,从设备数据输出。

MOSI 主设备数据输出,从设备数据输入。

SCLK时钟信号,由主设备产生。

CS从设备片选信号,由主设备控制。

SPI主要特点有:可以同时发出和接收串行数据;可以当作主机或从机工作;提供频率可编程时钟;发送结束中断标志;写冲突保护;总线竞争保护等。

SPI总线四种工作方式 SPI 模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。如果CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。SPI主模块和与之通信的外设备时钟相位和极性应该一致。

不同时钟相位下的总线数据传输时序见下图:


图3.17.1.1不同时钟相位下的总线传输时序(CPHA=0/1)

STM32的SPI功能很强大,SPI时钟最多可以到18Mhz,支持DMA,可以配置为SPI协议或者I2S协议。

本节,我们将利用STM32的SPI来读取外部SPIFLASH芯片(W25X16),实现类似上节的功能。这里对SPI我们只简单介绍一下SPI的使用,STM32的SPI详细介绍请参考《STM32参考手册》第422页,22节。然后我们再介绍下SPIFLASH芯片。

这节,我们使用STM32的SPI1的主模式,下面就来看看SPI1部分的设置步骤吧,STM32的主模式配置步骤如下:

1)配置相关引脚的复用功能,使能SPI1时钟。

我们要用SPI1,第一步就要是能SPI1的时钟,SPI1的时钟通过APB2ENR的第12位来设置。其次要设置SPI1的相关引脚为复用输出,这样才会连接到SPI1上否则这些IO口还是默认的状态,也就是标准输入输出口。这里我们使用的是PA5、6、7这3个(SCK.、MISO、MOSI,CS使用软件管理方式),所以设置这三个为复用IO。

2)设置SPI1工作模式。

这一步全部是通过SPI1_CR1来设置,我们设置SPI1为主机模式,设置数据格式为8位,然后通过CPOL和CPHA位来设置SCK时钟极性及采样方式。并设置SPI1的时钟频率(最大18Mhz),以及数据的格式(MSB在前还是LSB在前)。

3)使能SPI1。

这一步通过SPI1_CR1的bit6来设置,以启动SPI1,在启动之后,我们就可以开始SPI通讯了。

SPI1的使用就介绍到这里,接下来介绍一下W25X16。W25X16是华邦公司推出的继W25X10/20/40/80(从1Mb~8Mb)后容量更大的FLASH产品,W25X16的容量为16Mb,还有容量更大的W25X32/64,ALIENTEK所选择的W25X16容量为16Mb,也就是2M字节,同AT45DB161是一样大小的。

W25X16将2M的容量分为32个块(Block),每个块大小为64K字节,每个块又分为16个扇区(Sector),每个扇区4K个字节。W25X16的最少擦除单位为一个扇区,也就是每次必须擦除4K个字节。这样我们需要给W25X16开辟一个至少4K的缓存区,这样对SRAM要求比较高(相对于AT45DB161来说),但是它有价格及供货上的优势。

W25X16的差些周期为10000次,具有20年的数据保存期限,支持电压为2.7~3.6V,W25X16支持标准的SPI,还支持双输出的SPI,最大SPI时钟可以到75Mhz(双输出时相当于150Mhz),更多的W25X16的介绍,请参考W25X16的DATASHEET。

3.17.2 硬件设计

本节实验功能简介:开机的时候先检测W25X16是否存在,然后在主循环里面用1个按键用来执行写入W25X16的操作,另外一个按键用来执行读出操作,在TFTLCD模块上显示相关信息。同时用DS0提示程序正在运行。

所要用到的硬件资源如下:

1)STM32F103RBT6。

2)DS0(外部LED0)。

3)KEY0和KEY2。

4)TFTLCD液晶模块。

5)W25X16。

前面4部分的资源,我们前面已经介绍了,请大家参考相关章节。这里只介绍W25X16与STM32的连接,板上的W25X16是直接连在STM32F103RBT6上的,连接关系如下图:


图3.17.2.1STM32F103RBT6与W25X16连接电路图


3.17.3 软件设计

打开上一节的工程,首先在HARDWARE文件夹下新建一个FLASH的文件夹和SPI的文件夹。然后新建一个flash.c和flash.h的文件保存在FLASH文件夹下,新建spi.c和spi.h的文件,保存在SPI文件夹下,并将这两个文件夹加入头文件包含路径。

打开spi.c文件,输入如下代码:

//这里针是对SPI1的初始化

voidSPIx_Init(void)

{   

     RCC->APB2ENR|=1<<2;       //PORTA时钟使能            

     RCC->APB2ENR|=1<<12;      //SPI1时钟使能


     //这里只针对SPI口初始化

     GPIOA->CRL&=0X000FFFFF;

     GPIOA->CRL|=0XBBB00000;//PA5.6.7复用           

     GPIOA->ODR|=0X7<<5;    //PA5.6.7上拉      

     SPI1->CR1|=0<<10;//全双工模式           

     SPI1->CR1|=1<<9; //软件nss管理

     SPI1->CR1|=1<<8;  

     SPI1->CR1|=1<<2; //SPI主机

     SPI1->CR1|=0<<11;//8bit数据格式        

     SPI1->CR1|=1<<1; //空闲模式下SCK为1 CPOL=1

     SPI1->CR1|=1<<0; //数据采样从第二个时间边沿开始,CPHA=1  

     SPI1->CR1|=7<<3; //Fsck=Fcpu/256

     SPI1->CR1|=0<<7; //MSBfirst   

     SPI1->CR1|=1<<6; //SPI设备使能

     SPIx_ReadWriteByte(0xff);//启动传输               

}   

//SPI 速度设置函数

//SpeedSet:

//SPI_SPEED_2   2分频   (SPI 36M@sys 72M)

//SPI_SPEED_8   8分频   (SPI 9M@sys 72M)

//SPI_SPEED_16  16分频  (SPI 4.5M@sys 72M)

//SPI_SPEED_256256分频 (SPI281.25K@sys 72M)

voidSPIx_SetSpeed(u8 SpeedSet)

{

     SPI1->CR1&=0XFFC7;//Fsck=Fcpu/256

     if(SpeedSet==SPI_SPEED_2)//二分频

     {

                 SPI1->CR1|=0<<3;//Fsck=Fpclk/2=36Mhz           

     }else if(SpeedSet==SPI_SPEED_8)//八分频

     {

                 SPI1->CR1|=2<<3;//Fsck=Fpclk/8=9Mhz

     }else if(SpeedSet==SPI_SPEED_16)//十六分频

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值