STM32——SPI通信协议(W25Q128FLASH的通信)

目录

SPI协议

SPI物理层

SPI协议层

CPOL/CPHA 及通讯模式 

STM32的SPI外设

W25Q128 FLASH芯片介绍

附录


  • SPI协议

串行外设接口(Serial Peripheral Interface Bus,SPI),是一种用于短程通信的同步串行通信接口规范,主要应用于单片机系统中。类似I2C。 这种接口首先被Motorola(摩托罗拉)公司开发,然后发展成了一种行业规范。典型应用包含SD卡和液晶显示器。 SPI设备之间使用全双工模式通信,包含一个主机和一个或多个从机。主机产生待读或待写的帧数据,多个从机通过一个片选线路 决定哪个来响应主机的请求。

  • SPI物理层

SPI 通讯设备之间的常用连接方式 

STM32——SPI通信协议(W25Q128FLASH的通信)_第1张图片

  • SS( Slave Select):从设备选择信号线,常称为片选信号线,也称为 NSS、CS。当有多个 SPI 从设备与 SPI 主机相连时,设备的其它信号线 SCK、MOSI 及 MISO同时并联到相同的 SPI 总线上,即无论有多少个从设备,都共同只使用这 3 条总线;而每个从设备都有独立的这一条 NSS 信号线,本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线。所以SPI没有寻址
  • SCK (Serial Clock):时钟信号线,用于通讯数据同步。它由通讯主机产生,决定了通讯的速率,不同的设备支持的最高时钟频率不一样,如 STM32 的 SPI 时钟频率最大为f pclk /2,两个设备之间通讯时,通讯速率受限于低速设备。
  • MOSI (Master Output, Slave Input):主设备输出/从设备输入引脚。主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,即这条线上数据的方向为主机到从机。
  • MISO(Master Input,,Slave Output):主设备输入/从设备输出引脚。主机从这条信号线读入数据,从机的数据由这条信号线输出到主机,即在这条线上数据的方向为从机到主机。
  • SPI协议层

SPI通信时序 

STM32——SPI通信协议(W25Q128FLASH的通信)_第2张图片

  • 通讯的起始信号:NSS 信号线由高变低,是 SPI 通讯的起始信号。NSS 是每个从机各自独占的信号线,当从机在自己的NSS 线检测到起始信号后,就知道自己被主机选中了,开始准备与主机通讯。
  • 通讯的停止信号:NSS 信号由低变高,是 SPI 通讯的停止信号,表示本次通讯结束,从机的选中状态被取消。
  • 数据有效性:SPI 使用 MOSI 及 MISO 信号线来传输数据,使用 SCK 信号线进行数据同步。MOSI及 MISO 数据线在SCK 的每个时钟周期传输一位数据,且数据输入输出是同时进行的。数据传输时,MSB先行或 LSB先行并没有作硬性规定,但要保证两个 SPI 通讯设备之间使用同样的协定,一般采用MSB先行的方式。
  • CPOL/CPHA 及通讯模式 

SPI 一共有四种通讯模式,它们的主要区别是总线空闲时 SCK 的时钟状态以及数据采样时刻。为方便说明,在此引入“时钟极性 CPOL”和“时钟相位 CPHA”的概念。

  • 时钟极性 CPOL是指 SPI 通讯设备处于空闲状态时,SCK信号线的电平信号(即 SPI 通讯开始前、 NSS 线为高电平时 SCK的状态)。CPOL=0时, SCK在空闲状态时为低电平,CPOL=1 时,则相反。
  • 时钟相位 CPHA 是指数据的采样的时刻,当 CPHA=0 时,MOSI 或 MISO 数据线上的信号将会在 SCK 时钟线的“奇数边沿”被采样。当 CPHA=1 时,数据线在 SCK 的“偶数边沿”采样。

STM32——SPI通信协议(W25Q128FLASH的通信)_第3张图片

  • STM32的SPI外设

STM32——SPI通信协议(W25Q128FLASH的通信)_第4张图片

  • MISO:主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。
  • MOSI:主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。
  • SCK:串口时钟,作为主设备的输出,从设备的输入。
  • NSS:从设备选择。这是一个可选的引脚,用来选择主/从设备。它的功能是用来作为“片选引脚”,让主设备可以单独地与特定从设备通讯,避免数据线上的冲突。从设备的NSS引脚可以由主设备的一个标准I/O引脚来驱动。

通信过程: 

STM32——SPI通信协议(W25Q128FLASH的通信)_第5张图片

  • 控制 NSS 信号线,产生起始信号(图中没有画出);
  • 把要发送的数据写入到“数据寄存器 DR”中,该数据会被存储到发送缓冲区;
  • 通讯开始,SCK 时钟开始运行。MOSI 把发送缓冲区中的数据一位一位地传输出去;MISO则把数据一位一位地存储进接收缓冲区中;
  • 当发送完一帧数据的时候,“状态寄存器 SR”中的“TXE 标志位”会被置 1,表示传输完一帧,发送缓冲区已空;类似地,当接收完一帧数据的时候,“RXNE标志位”会被置 1,表示传输完一帧,接收缓冲区非空;
  • 等待到“TXE 标志位”为 1 时,若还要继续发送数据,则再次往“数据寄存器DR”写入数据即可;等待到“RXNE 标志位”为 1 时,通过读取“数据寄存器DR”可以获取接收缓冲区中的内容。
  • 假如我们使能了 TXE 或 RXNE 中断,TXE 或 RXNE 置 1 时会产生 SPI 中断信号,进入同一个中断服务函数,到 SPI 中断服务程序后,可通过检查寄存器位来了解是哪一个事件,再分别进行处理。也可以使用 DMA方式来收发“数据寄存器 DR”中的数据。
  • W25Q128 FLASH芯片介绍

W25Q128是一款SPI通信的FLASH芯片,其FLASH的大小为16M,分为 256 个块(Block),每个块大小为 64K 字节,每个块又分为 16个扇区(Sector),每个扇区 4K 个字节。通过SPI通信协议即可实现MCU(STM32)和 W25Q128 之间的通信。实现W25Q128的控制需要通过SPI协议发送相应的控制指令,并满足一定的时序。

部分常用指令介绍

  1. 写使能(Write Enable) (06h)

        STM32——SPI通信协议(W25Q128FLASH的通信)_第6张图片

        向FLASH发送0x06 写使能命令即可开启写使能,首先CS片选拉低,控制写入字节函数写入命令,CS片选拉高。

     2.扇区擦除指令(Sector Erase) (20h)

        STM32——SPI通信协议(W25Q128FLASH的通信)_第7张图片

       该命令首先写入命令0x20,然后写入24为地址数据,高位先行。

     3.读命令(Read Data)  (03h)

        STM32——SPI通信协议(W25Q128FLASH的通信)_第8张图片

       该命令首先写入命令0x03,然后写入24为地址数据,高位先行。接着会返回相应地址及以后的的数据。

     4. 状态读取命令(Read Status Register)  (05h)

        STM32——SPI通信协议(W25Q128FLASH的通信)_第9张图片

       写入命令0x05,即可读取状态寄存器的值。

    5. 写入命令(Page Program)  (02h)

        STM32——SPI通信协议(W25Q128FLASH的通信)_第10张图片

       该命令首先写入命令0x02,然后写入24为地址数据,高位先行。接着依次写入要写入的数据。

  • 附录

操作时的注意事项: 

  1. 在对W25Q128 FLASH的写入数据的操作中一定要先擦出扇区,在进行写入,否则将会发生数据错误。
  2. W25Q128 FLASH一次性最大写入只有256个字节。
  3. 在进行写操作之前,一定要开启写使能(Write Enable)。
  4. 当只接收数据时不但能只检测RXNE状态 ,必须同时向发送缓冲区发送数据才能驱动SCK时钟跳变。

相关代码:

STM32硬件SPI:https://github.com/kks1234/STM32/tree/master/14.SPI%E9%80%9A%E4%BF%A1%E2%80%94%E2%80%94FLASH/%E7%A1%AC%E4%BB%B6SPI

代码结果:

STM32——SPI通信协议(W25Q128FLASH的通信)_第11张图片

 

你可能感兴趣的:(嵌入式,STM32)