×
单片机 > 其他资讯 > 详情

从零开始一起学stm32(十二)---SPI协议

发布时间:2020-06-19 发布时间:
|

SPI通信  --  W25Q64 -- flash芯片的使用

1、通信协议

2、SPI通信

3、STM32中SPI控制器的使用

4、W25Q64的操作过程以及软件编程

 


1.通信协议:

协议:两个相互通信的设备之间,进行数据传输的一种规定!


1.串口通信--


物理层


所接管脚:TX(发送管脚)  RX(接收管脚)   GND(接地)


数据链接层---RS232协议


开始位+数据位+奇偶校验位+停止位


   1       5~8              1            1


1.总线在发送或接收前应处于空闲状态--没有数据传输时,总线处于高电平状态!


2.开始位:要发送数据时,先发送一个低电平信号,这个信号叫开始信号,表示开             始发送数据了


3.数据位:要发送的数据;---8位


4.奇偶校验位:奇校验、偶校验、无校验


5.停止位:表示传输数据的结束,---停止位为高电平信号


 


2.并行通信 -- 8080接口 -- intel


   STM32 -- LCD屏


   RS -- 命令/数据选择端


   CS -- 片选端


   WR -- 写使能端


   RD -- 读使能端


   DB0~DB15 -- 数据传输端


3.SPI通信 -- 同步通信 -- 同发同收


串行外围设备接口

高速、全双工、同步通信

  同步:两个设备同时发送,同时接收!


 


   CLK -- 时钟---主机控制:主机和从机相同;


   CS  -- 片选  


   MOSI - 主机发送,从机接收


   MISO - 主机接收,从机发送


 

  8位传输---先发高位(MSB),再发低位(LSB)


CLK和数据管脚 -- 在同一个时钟之下发送和接收数据


 CPHA:如果 CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果 CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。

 


 CPOL:如果 CPOL=0,串行同步时钟的空闲状态为低电平;如果 CPOL=1,串行同步时钟的空闲状态为高电平。 -- 来决定数据管脚上修改的时间。



 


  CPOL     CPHA                                  mode


   0        0    --- 上升沿采样,下降沿接收 ---    0


   0        1    --- 上升沿接收,下降沿采样 ---    1


   1        0    --- 下降沿采样,上升沿接收 ---    2


   1        1    --- 下降沿接收,上升沿采样 ---    3


 


 主机模式根据从机来改变的。


  


2、STM32 -- SPI控制器

   1、配置寄存器 -- SPI_CR1


                 -- SPI_CR2


   2、数据寄存器 -- SPI_DR


   3、状态寄存器 -- SPI_SR



 


   1、特点:


      全双工


      8位/16位数据传输


      主机/从机模式


   可编程的时钟极性和相位


      可编程的数据顺序, MSB在前或LSB在前


     CRC


   


  2、内部框图


  


3、寄存器:

   CR1 -- 


       CPHA -- 


       CPOL -- 选择


       波特率的选择


       SPI的使能


       NSS管脚的选择


       传输位数的选择


SR -- 状态:


      接受状态和发送状态


DR -- 8位/16位


 


 


4、STM32固件库:

5、W25Q64的操作:

   1、W25Q64 -- 64Mbit的flash的存储芯片


   2、通信方式 -- SPI


   3、管脚


   4、8M -- 寻址范围:2^23


      8M -- 128块  -- 每块64K


      1块 - 16个扇区 -- 每个扇区4K


      1扇区 - 16个页 -- 每页256字节


   5、写操作:


      


      CS -- 0


      数据寄存器 -- 0x06


      等待发送完成


      CS -- 1


6、页写:

      1、CS -- 0


      2、写使能(06h)


      3、页写指令(02h)


      4、24位地址


      5、发8位数据


      ……最多256个


      6、CS拉高


     判断 -- 状态寄存器中BUSY位,来代表数据是否写成功。


 


 7、FLASH在写数据之前:

      必须擦除。


      扇区擦除和块擦除。整个芯片擦除。


      


8、读数据 --- random读(发一次地址,读很多数据)

       

9、ID号 -- 

       


                        设备    存储类型   容量


                        0xEF    0x40   0x17


 


10、软件编程:

   1、SPI的GPIO口初始化


      1、查看原理图 -- 相应管脚


      2、配置GPIO口 -- 


         


      初始化SPI --- SPI_Init();


   2、编写读写函数


      STM32给W25Q64发送数据和接收数据


uint8_t sFLASH_SendByte(uint8_t byte)


{


  while(SPI_I2S_GetFlagStatus(sFLASH_SPI,SPI_I2S_FLAG_TXE)==RESET);


  SPI_I2S_SendData(sFLASH_SPI, byte);


 


  while (SPI_I2S_GetFlagStatus(sFLASH_SPI, SPI_I2S_FLAG_RXNE) == RESET);


  return SPI_I2S_ReceiveData(sFLASH_SPI);


}


   3、编写对W25Q64操作的函数


      1、写使能 -- 479


      2、页写   -- 216


 


 


W25Q64:


1、地址:


   块 -- 128      16扇区     16页  1页 -- 256


64M位==8M字节


分为128块         8M/128==64K

每块分为16个扇区 64K/16==4K

每个扇区分为16页  4K/16===256字节

 


   0000 0000   23~16


   0000 0000   15~8


   0000 0000   7~0


0x000000 -- 0块0扇区0页第0个字节


0x000001 -- 0块0扇区0页第1个字节 


0x0000ff -- 0块0扇区0页第255个字节


 


0xXXXX  XX -- 最低八位代表的是页内地址。


0xXXX X  OO -- 4位页地址


0xXX X O OO -- 扇区地址


0xXX O O OO -- 块6地址


 


0x12 3 4 04 -- 18块中第三个扇区中的第4页中第4个字节。


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何提升手机电磁兼容的性能