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

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通信 -- 同步通信 -- 同发同收

  1. 串行外围设备接口
  2. 高速、全双工、同步通信

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

 

   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字节

  1. 分为128块         8M/128==64K
  2. 每块分为16个扇区 64K/16==4K
  3. 每个扇区分为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个字节。

     

 作业:

  1、擦除一个扇区,读取256个字节,看是否擦除成功!

  2、给flash发送一页数据,读出来,判断是否正确

  3、给flash里面存放一张图片,从flash中读取图片。

 

猜你喜欢

转载自blog.csdn.net/qq_38639426/article/details/88633340