1.SPI介绍
SPI:串行外设设备接口(Serial Peripheral Interface),是一种高速的,全双工,同步的通信总线。主要应用在存储芯片、AD转换器以及LCD中。
【注:IIC是电平协议,SPI是边沿协议】
1.1.SPI框图(以F1/F4为例,主机模式)
-
SPI外设对应的引脚
STM32芯片有多个SPI外设,每个SPI外设输出的信号会到不同的GPIO口。STM32F1有三个SPI。F4 / F7 / H7 系列芯片SPI外设都有6个,分别为SPI1、SPI2、SPI3、SPI4、SPI5和SPI6。不同系列的SPI外设用到的引脚是不一样的,具体可以查看芯片的datasheet。 -
SPI发送与接收流程
主机只向从机进行写操作,可以忽略接收到的从机数据。
主机要对从机进行读操作,需要发送一个空数据来引发从机发送数据。
1.2.SPI的工作模式
- 时钟极性(CPOL):没有数据传输时时钟线的空闲状态电平
0:SCK在空闲状态保持低电平
1:SCK在空闲状态保持高电平 - 时钟相位(CPHA):时钟线在第几个时钟边沿采样数据
0:SCK的第一(奇数)边沿进行数据位采样,数据在第一个时钟边沿被锁存
1:SCK的第二(偶数)边沿进行数据位采样,数据在第二个时钟边沿被锁存
-
模式0:CPOL=0,CPHA=0,低电平奇数边沿
-
模式1:CPOL=0,CPHA=1,低电平偶数边沿
-
模式2:CPOL=1,CPHA=0,高电平奇数边沿
-
模式3:CPOL=1,CPHA=1,高电平偶数边沿
1.3.SPI相关寄存器介绍(F1/F4/F7)
-
SPI控制寄存器1
用于配置SPI工作参数:SPI模式、SPI方向、NSS、数据帧、CPOL、CPHA、波特率、帧格式等
-
SPI状态寄存器
用于查询当前SPI传输状态(TXE、RXNE)
-
SPI数据寄存器
用于存放待发送数据或接收数据,有两个缓冲区(TX/RX)
1.4.SPI配置步骤(F1/F4/F7)
- 配置SPI工作参数:HAL_SPI_Init()
- SPI的MSP初始化:HAL_SPI_MspInit(),配置NVIC、CLOCK、GPIO等
- 使能SPI:__HAL_SPI_ENABLE
- SPI传输数据:HAL_SPI_Transmit 发送数据、HAL_SPI_Receive 接收数据、HAL_SPI_TransmitReceive 进行发送与接收
- 设置SPI传输速度(可选):操作SPI_CR1寄存器中的波特率控制位
- 关键结构体
typedef struct
{
uint32_t Mode /* SPI模式(主机) */
uint32_t Direction /* 工作方式(全双工) */
uint32_t DataSize /* 帧格式(8位) */
uint32_t CLKPolarity /* 时钟极性(CPOL = 0) */
uint32_t CLKPhase /* 时钟相位 (CPHA = 0)*/
uint32_t NSS /* SS控制方式(软件) */
uint32_t BaudRatePrescaler /* SPI波特率预分频值 */
uint32_t FirstBit /* 数据传输顺序(MSB)*/
uint32_t TIMode /* 帧格式:Motorola / TI */
uint32_t CRCCalculation /* 设置硬件CRC校验 */
uint32_t CRCPolynomial /* 设置CRC校验多项式 */
…
}SPI_InitTypeDef;
//(对于F7/H7来说,还有一些附加功能相关成员(NSS/CRC/IOSwap))
2.NOR FLASH介绍
2.1.FLASH简介
- FLASH是常用的储存器件,它具有容量大,可重复擦写、按“扇区/块”擦除、掉电后数据可继续保存的特性,属于EEPROM
- FLASH是有一个物理特性:写数据前需要擦除写操作,1->0,擦除0->1
- FLASH主要有NOR Flash和NAND Flash两种类型,NOR和NAND是两种数字门电路
【注意:NAND和NOR的0地址是不冲突的,NOR占用BANK地址,而NAND不占用BANK地址,它的0地址是内部的】
2.2.NOR FLASH举例——NM25Q128
NM25Q128,串行闪存器件,属于NOR FLASH,容量为128 Mb。擦写周期可达10W次,可以将数据保存达20年之久。
SPI数据传输时序:支持模式0(CPOL = 0 , CPHA = 0)和模式3(CPOL = 1, CPHA = 1)
数据格式:数据长度8位大小,先发高位,再发低位
传输速度:支持标准模式104M bit/s
寻址范围:0x00000000-0x00FFFFFF
读:任意读
写:页内写、页间写(擦除/不擦除)
擦:片擦、块擦、扇擦…
- 常用指令及时序
2.3.NOR Flash工作时序(NM25Q128)
NOR FLASH的指令总数比较多, 但是如果只需要实现基本操作, 还是比较简单的。一般我们只需要:5条指令即可完成对NOR FLASH的基本使用(以NM25Q128为例)
-
写使能 Write Enable (06H)
-
读状态寄存器Read Status Reg1(05H)
-
读时序 Read Data Bytes(03H)
-
页写时序 PageProgram (02H)
-
扇区擦除时序 Sector Erase(20H)
-
NM25Q128的状态寄存器
BUSY位:指示当前状态。 0:空闲状态(硬件自动清除) 1:当前处于忙碌状态
WEL位 :执行WriteEnable指令该位为1,可以页写/扇区or块or片擦除/写状态寄存器。0:写禁止,不能页编程/扇区or块or片擦除/写状态寄存器
2.4.NOR FLASH驱动步骤(NM25Q128)
- 初始化片选引脚与SPI接口:相关GPIO初始化、SPI初始化(模式、位数、分频、MSB等)
- NM25Q128 读取:0x03指令 + 24位地址 + 读取数据
- NM25Q128 扇区擦除:0x06指令 + 等待空闲 + 0x20指令 + 24位地址 + 等待空闲
- NM25Q128 写入:擦除扇区(可选)+ 0x06指令 + 0x02指令 + 24位地址 + 写入数据 + 等待空闲
NOR FLASH驱动核心在写数据,写数据需要注意:
- 是否需要擦除?
- 写入数据(是否需要换页?是否需要换扇区?)
- 遵循:读、改、写 的原则
3.STM32使用SPI协议驱动NM25Q128实验
【代码暂不贴出】