SPI通信

发布于:2025-05-31 ⋅ 阅读:(28) ⋅ 点赞:(0)

第一章:SPI通信协议概述

SPI(串行外设接口)协议是一种由摩托罗拉公司开发的通信协议,它支持芯片与外部设备之间进行半双工或全双工、同步、串行的数据交换。该协议允许设备配置为主模式,为主设备提供通信时钟(SCK),并能够以多主设备配置方式运行。SPI协议适用于多种应用场景,包括使用一条双向数据线的双线单工同步传输,以及采用CRC校验的可靠通信。它广泛应用于ADC、LCD等设备与MCU之间的高速通信场合。

SPI通常采用全双工通信方式,在同一时刻,两个设备之间可以同时进行数据的发送和接收,这种方式无需进行方向的切换,但需要两根数据线。

第二章:SPI物理层结构

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

SPI通信设备之间的连接方式通常包括SCK、MOSI和MISO三条信号线,以及CS(从设备选择)片选信号线。所有主设备或从设备的信号线SCK、MOSI及MISO同时并联到相同的SPI总线上,共同使用这三条总线;CS片选信号线用于从设备选择,每个从设备都有独立的这条NSS信号线,本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线。当主机要选择从设备时,把该从设备的NSS信号线设置为低电平,该从设备即被选中,主机开始与被选中的从设备进行SPI通信,则其它未被选中(NSS引脚为高电平)的从设备会忽略总线上的数据传输。SPI通信以NSS线置低电平为开始信号,以NSS线被拉高作为结束信号。

- **SCK(串行时钟)**:时钟信号线,用于通讯数据同步。只能由通讯主机产生,决定了通讯的速率,不同的设备支持的最高时钟频率不一样,STM32的SPI时钟频率最大为fpclk/2,两个设备之间通讯时,通讯速率受限于低速设备。

- **MOSI(主设备输出,从设备输入)**:主设备输出/从设备输入引脚。主机向从机发送数据,从机接收主机发送的数据。

- **MISO(主设备输入,从设备输出)**:主设备输入/从设备输出引脚。从机向主机发送数据,主机接收从机发送的数据。

第三章:SPI协议层细节

1. 通信的起始和停止信号

   NSS是每个从机各自独占的信号线。

   起始信号:NSS信号线由高变低。当从机在自己的NSS线检测到起始信号后,片选成功,开始准备与主机通讯。

   停止信号:NSS信号由低变高,是SPI通信的停止信号,表示本次通讯结束,从机的选中状态被取消。

2. 数据有效性

   SPI使用MOSI及MISO信号线来传输数据,使用SCK信号线进行数据同步。MOSI及MISO数据线在SCK的每个时钟周期传输一位数据,且数据输入输出是同时进行的,也就是说我们发送一个数据也会同时接收一个数据。数据传输时,MSB先行或LSB先行并没有作硬性规定,可以设置,但通信双向的模式要一致,一般采用MSB先行(高位先行)。

3. 时钟信号的相位和极性(重点)

   - SPI_CR寄存器的CPOL和CPHA位,能够组合成四种可能的时序关系。

   - CPOL(时钟极性)位控制在没有数据传输时时时钟的空闲状态电平,此位对主模式和从模式下的设备都有效。

   - 如果CPOL被清’0’,SCK引脚在空闲状态保持低电平;如果CPOL被置’1’,SCK引脚在空闲状态保持高电平。

   - CPHA(时钟相位)如果CPHA位被置’1’,SCK时钟的第二个边沿进行数据位的采样,数据在第二个时钟边沿被锁存(保持数据稳定)。

   - 如果CPHA位被清’0’,SCK时钟的第一个边沿进行数据位采样,数据在第一个时钟边沿被锁存(保持数据稳定)。

第四章:SPI特性及架构(重点

1. **通信引脚**

   - 不同型号的芯片基本都有3个SPI外设,其中SPI2,SPI3支持I2S通信因为I2S与SPI协议类似,所以他们共用一套逻辑就是上面的SPI框图。

2. **时钟控制逻辑**

   - SCK线的时钟信号,由波特率发生器根据“控制寄存器CR1”中的BR[0:2]位控制,该位是对fpclk时钟的分频因子,对fpclk的分频结果就是SCK引脚的输出时钟频率。

3. **数据控制逻辑(非常重要)**

   - 在接收时,接收到的数据被存放在一个内部的接收缓冲器中;在发送时,在被发送之前,数据将首先被存放在一个内部的发送缓冲器中。对SPI_DR寄存器的读操作,将返回接收缓冲器的内容;写入SPI_DR寄存器的数据将被写入发送缓冲器中。

4. **全双工发送和接收过程模式(超级重要)**

   - 准备工作:必须要理解下面这张图:总结一句话:主机发送一个字节数据的同时接收了一个字节数据。

5. **SPI初始化结构体**

   - SPI_Direction前面有详细介绍就不多说了。

   - SPI_Mode本成员设置SPI工作在主机模式(SPI_Mode_Master)或从机模式(SPI_Mode_Slave),由主机产生时钟信号,若被配置为从机模式STM32的SPI外设将接受外来的SCK信号。

   - SPI_DataSize本成员可以选择SPI通讯的数据帧大小是为8位(SPI_DataSize_8b)还是16位(SPI_DataSize_16b)。

   - SPI_CPOL和SPI_CPHA。

   - SPI_NSS本成员配置NSS引脚的使用模式,可以选择为硬件模(SPI_NSS_Hard)与软件模式(SPI_NSS_Soft),在硬件模式中的SPI片选信号由SPI硬件自动产生,而软件模式则需要我们亲自把相应的GPIO端口拉高或置低产生非片选和片选信号。实际中软件模式应用比较多。

   - SPI_BaudRatePrescaler。

   - SPI_FirstBit。

   - SPI_CRCPolynomial这是SPI的CRC校验中的多项式,若我们使用CRC校验时,就使用这个成员的参数(多项式),来计算CRC的值。配置完这些结构体成员后,我们要调用SPI_Init函数把这些参数写入到寄存器中,实现SPI的初始化,然后调用SPI_Cmd来使能SPI外设。

第五章:NorFLASH芯片—NM25Q64EV

FLASH简介

FLASH存储器,又称闪存,它与EEPROM都是掉电后数据不丢失的存储器,但FLASH存储器容量普遍大于EEPROM,现在基本取代了它的地位。我们生活中常用的U盘、SD卡、SSD固态硬盘以及我们STM32芯片内部用于存储程序的设备,都是FLASH类型的存储器。在存储控制上,最主要的区别是FLASH芯片只能一大片一大片地擦写,而在“I2C章节”中我们了解到EEPROM可以单个字节擦写。

NM25Q64EV芯片与W25Q64BV基本一致就是设备地址不一样而已。

硬件SPI协议逻辑

#### NorFLASH的存储特性(重点)

1. 在写入数据之前必须先擦出。

2. 擦除时把数据的位全部重置为1。

3. 写入数据时只能把为1的数据为改成0(这也是为什么写入数据前要先进行擦除的原因)。

4. 擦除的最小单位为扇区(4KB个字节)全部擦除为1。

#### FLASH指令汇总(重点)

1. 读取设备ID号:通过特定指令读取。

2. 读取状态寄存器1:判断FLASH芯片是否忙碌(在擦除数据或正在写入数据)。

3. 擦除扇区:24位地址,擦除4KB数据。

4. 写使能:向flash写入数据时或者flash擦除自己的数据时一定要先写使能才能进行。

5. 页写入数据:页写入特点:一次性写入的数据不能超过256个字节,超过256个字节后面的字节将不会写入。

6. 读取数据:该地址在每个地址之后自动递增到下一个更高的地址数据的字节被移出。因此,整个存储器可以使用单个读取数据字节进行读取(读取)命令。到达最高地址时,地址计数器将滚动到0。