一、SPI接口
SPI 是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线(NSS、MISO、MOSI、SCK),实现一对多或者一对一的通信,主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。
SPI总线采用的环形结构,利用的是主从模式(主机-->从机)进行数据的传输,由于是同步通信,所以在主机发送数据的同时也会收到从机数据。
1.一对一模式。
从机如果检测NSS引脚出现低电平,说明从机被选中,前提是主机把NSS引脚拉低。
2.一对多模式
如果引脚上面有横杠,说明引脚是低电平有效。
主要通过片选引脚选择从机设备,如果主机不打算和从机进行数据的传输,应该让NSS引脚在空闲状态下处于高电平(表示不通信),如果打算和某个从机进行单独通信的话,要把从机对应的NSS拉低。
3.从选择(NSS)脚管理
有2种NSS模式,一般选择软件模式。
软件NSS模式:可以通过设置SPI_CR1寄存器的SSM位来使能这种模式。在这种模式下外部NSS引脚可以用作它用,而从器件选择信息在内部NSS信号电平可以通过写SPI_CR1的SSI位来驱动
4.SPI工作模式
由于SPI外设是全双工同步通信,所以时钟信号就由SCK引脚来生成,SCK引脚只能由主设备控制,从设备是无法控制的,所以SCK引脚输出的脉冲信号的极性和相位就需要进行配置。
时钟极性:指的是SPI总线空闲状态SCK引脚的电平状态。SCK空闲状态的电平可以由SPI_CR1寄存器的位来CPOL来设置。主设备极性要根据从设备设置。
时钟相位:指的是在传输数据时选择脉冲信号的边沿(上升沿/下降沿)来进行数据的采集或者修改,由SPI_CR1寄存器的位来CPHA来设置。主设备相位要根据从设备设置。
通过两位可以得到四种不用的组合,就被作为SPI总线的工作模式,到低要选择那种模式要根据从设备数据手册进行选择。
(1)CPOL=0,CPHA=0
该模式指的是SCK引脚在空闲状态下为低电平,并且在第一个时钟边沿(上升沿)采集数据,在第二个时钟边沿(下降沿)来修改数据。
(2)CPOL=0,CPHA=1
该模式指的是SCK引脚在空闲状态下为低电平,并且在第二个时钟边沿(下降沿)采集数据,在第一个时钟边沿(上升沿)来修改数据。
(3)CPOL=1,CPHA=0
该模式指的是SCK引脚在空闲状态下为高电平,并且在第一个时钟边沿(下降沿)采集数据,在第二个时钟边沿(上升沿)来修改数据。
(4)CPOL=1,CPHA=1
该模式指的是SCK引脚在空闲状态下为高电平,并且在第二个时钟边沿(上升沿)采集数据,在第一个时钟边沿(下降沿)来修改数据。
在实际开发工程中使用最多就是第一种和第四种。
5.数据帧格式
主机与从机在通信过程中传输的数据以bit为单位(串行传输),所以数据格式就十分重要,主机的数据格式要根据从机的数据格式进行设置(MSB/LSB) 。
根据SPI_CR1寄存器中的LSBFIRST位,输出数据位时可以MSB在先也可以LSB在先。
根据SPI_CR1寄存器的DFF位,每个数据帧可以是8位或是16位。所选择的数据帧格式对发送和/或接收都有效。一般都是八位。
SPI1搭载在APB1上,SPI2/SPI3搭载在APB2上。选择默认时钟初始化函数,则APB1=36MHz,APB2=72MHz。但是一般外围器件的通信速率最高也就是10Mbps左右,极少数超过10Mbps(W25Q128)。
7.中断
二、SPI相关寄存器
1. SPI控制寄存器 1(SPI_CR1)
2.SPI控制寄存器 2(SPI_CR2)
3.SPI 状态寄存器(SPI_SR)
4.SPI 数据寄存器(SPI_DR)
5.SPI_I2S配置寄存器(SPI_I2S_CFGR)
6.SPI_I2S预分频寄存器(SPI_I2SPR)
三、SPI相关库函数功能
1.void SPI_I2S_DeInit(SPI_TypeDef* SPIx);
SPI/I2S初始换函数,使用RCC_APB1PeriphResetCmd进行初始化。
2. void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct);
SPI初始化函数,1.选择SPI。2.对SPI参数进行配置:(1)SPI_Direction 设置 SPI 的通信方式, 可以选择为半双工,全双工,以及串行发和串行收方式(2)SPI_Mode 设置主机模式或者从机模式(3)SPI_DataSize数据传输大小是8位或者16位(4)SPI_CPOL设置时钟极性,是高电平还是低电平(5)SPI_CPHA设置时钟相位,选择边沿采集和修改数据的方式(6)SPI_NSS设置片选信号由硬件还是软件控制(7)SPI_BaudRatePrescaler设置数据传输速率(8)SPI_FirstBit设置数据传输顺序是 MSB 位在前还是 LSB 位在前(9)SPI_CRCPolynomial数据校验
3.void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState);
SPI使能函数,1.选择SPI。2.使能,主要通过SPI_CR1位6来设置。
4.void SPI_I2S_ITConfig(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT, FunctionalState NewState);
中断设置,1.选择SPI 。2.选择中断形式。3.使能
5.void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data);
发送数据函数, 1.选择SPI。2.数据。主要通过SPI 数据寄存器(SPI_DR) 来进行操作。
6.uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx);
获取数据函数, 1.选择SPI。主要通过SPI 数据寄存器(SPI_DR) 来进行操作
7.void SPI_DataSizeConfig(SPI_TypeDef* SPIx, uint16_t SPI_DataSize);
SPI数据大小设置,1.选择SPI。2.数据大小8位/16位
8.FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG);
获取状态标志,1.选择SPI。2.选择需要获取的状态位。主要通过SPI 状态寄存器(SPI_SR) 操作
9.void SPI_I2S_ClearFlag(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG);
清除标志,1.选择SPI。2.选择需要获取的状态位。主要通过SPI 状态寄存器(SPI_SR) 操作
10.ITStatus SPI_I2S_GetITStatus(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT);
获取中断状态,通过操作SPI控制寄存器 2(SPI_CR2)设置
11.void SPI_I2S_ClearITPendingBit(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT);
清除中断标志位。
二、串行Flash闪存芯片
1.W25Q128芯片是一个串行Flash闪存芯片,有16M存储空间,可反复擦除10万次数据可保存20年以上,供电电压2.7-3.6,该芯片一共提供了65536个编程页,每页有256字节,最小的擦除单位是4KB,一次最多可编程256字节,该芯片支持标准SPI接口。一共有256个块,每块大小64K,每个块分为16个扇区,每个扇区4K字节。