原创
转载请注明出处,侵权必究
1、SPI介绍
1.1 SPI总体介绍
SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线。
硬件SPI内部简明图
1.2 引脚介绍:
-
MISO 主设备数据输入,从设备数据输出。
-
MOSI 主设备数据输出,从设备数据输入。
-
SCLK 时钟信号,由主设备产生。
-
CS 从设备片选信号,由主设备控制。
寄存器CPOL=0,串行同步时钟的空闲状态为低电平;CPOL=1,串行同步时钟的空闲状态为高电平;
寄存器CPHA=0,串行同步时钟频率的第一个跳变沿数据被采集;CPHA=1,串行同步时钟的第二个跳变沿数据被采集
2、SPI配置
stm32f4xx_spi.c和 stm32f4xx_spi.h中有SPI的库函数
2.1 STM32 SPI配置位主模式
1) 配置相关引脚的复用功能,使能 SPI1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);//使能 SPI1 时钟
GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_SPI1); //PB3 复用为 SPI1
GPIO_PinAFConfig(GPIOB,GPIO_PinSource4,GPIO_AF_SPI1); //PB4 复用为 SPI1
GPIO_PinAFConfig(GPIOB,GPIO_PinSource5,GPIO_AF_SPI1); //PB5 复用为 SPI1
//设置GPIO为复用模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
2)初始化SPI1, 设置SPI1工作模式等
通过设置SPI1_CR1寄存器实现
初始化函数如下:
void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct);
其中,SPI_InitTypeDef结构体指针为
typedef struct
{
uint16_t SPI_Direction; /*!< SPI通信方式,半双工、全双工、串行发和串行收方式 */
uint16_t SPI_Mode; /*!<SPI的主从模式选择 */
uint16_t SPI_DataSize; /*!<SPI8位还是16位传输 */
uint16_t SPI_CPOL; /*!< 设置时钟极性*/
uint16_t SPI_CPHA; /*!< 设置时钟相位 */
uint16_t SPI_NSS; /*!< NSS 信号由硬件(NSS 管脚)还是软件控制*/
uint16_t SPI_BaudRatePrescaler; /*!< 设置 SPI 波特率预分频值,84Mhz---2分频到256分频---分频输出 */
uint16_t SPI_FirstBit; /*!< 设置数据传输顺序是 MSB 位在前还是 LSB 位在前*/
uint16_t SPI_CRCPolynomial; /*!<设置 CRC 校验多项式,提高通信可靠性,大于 1 即可*/
}SPI_InitTypeDef;
注: NSS引脚的作用:从器件选择。这是用于选择从器件的可选引脚。此引脚用作“片选”,可让 SPI主器件与从器件进行单独通信,从而并避免数据线上的竞争。从器件的 NSS 输入可由主器件上的标准 IO 端口驱动。NSS 引脚在使能(SSOE 位)时还可用作输出,并可在SPI 处于主模式配置时驱动为低电平。通过这种方式,只要器件配置成 NSS 硬件管理模式,所有连接到该主器件 NSS 引脚的其它器件 NSS 引脚都将呈现低电平,并因此而作为从器件。当配置为主模式,且 NSS 配置为输入(MSTR=1 且 SSOE=0)时,如果NSS 拉至低电平,SPI 将进入主模式故障状态:MSTR 位自动清零,并且器件配置为从模式
3)使能SPI
//SPI_CR1的bit6
SPI_Cmd(SPI1, ENABLE); //使能 SPI1 外设
4)SPI数据传输
void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data);
uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx);
5)查看SPI的传输状态
//判断发送是否完成
SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE);
欢迎关注我的微信公众号
互联网矿工