STM32CubMX自学笔记(七)—SPI通信实验
主要介绍
SPI通信协议主要用在ADC芯片、FLASH芯片读取与写入、LCD等设备中。
SPI物理层的介绍
SPI一共有四根线,分别是时钟信号线(SCK)、主设备输出\从设备输入(MOSI)、主设备输入\从设备输出(MISO)、片选信号线(NSS)。
需要注意的是,SPI的最高通信速率由总线上的最低速的设备决定的。
SPI协议层介绍
当SPI的NSS信号线给出一个低电平,发出了起始信号。当SPI的NSS信号线发出高电平,那么相当于是终止信号。表示本次通信结束。
之后在上升沿触发信号,表示在每次上升沿的时候发生触发信号,到下一次的下降沿的时候触发采样信号。最后拉高电平,表示完整的通信过程的结束。
SPI的工作模式
SPI的工作模式由CPOL/CPHA决定,由于每个位置有两种状态,因此,一共有四种状态。CPOL=0表示空闲状态为低电平,反之,空闲状态为高电平。CPHA=0的时候表示会在SCK的奇数边被采样,反之,则表示在偶数边被采样。常用的是模式是模式0和模式3。分别表示如下:
模式0-CPOL=0,CPHA=0。(低电平,奇数边)
模式3-CPOL=1,CPHA=1。(高电平,偶数边)。
工程配置
打开Cubmx软件,开始配置工程,首先打开时钟和调试器。打开SPI。
这里我们选择全双工的工作模式,片选信号控制选择软件控制。由软件将片选信号的电平拉低或者拉高。
然后再看下面的具体参数的配置,首先,我们将帧格式选择为摩托罗拉的格式。
数据的传输位选择8位。
第一个传输的数据选择MSB,高位先传输。
数据传输的格式和不同的外设有关可以查找具体的数据手册。
下面是时钟的设置,时钟源来自于APB2。在时钟配置的时候,我们已经将时钟拉满180Mhz,APB2产生的时钟为90Mhz,所以最高的时钟频率为45Mhz。
之后 我们把工作模式配置为工作模式0,对应的是奇数边,低电平。
默认不开启CRC校验,然后NSS使用软件调节。
全部配置完成之后,就可以看到软件自动帮我们生成了初始化的代码。
void MX_SPI1_Init(void)
{
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 10;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
}
到此,SPI工程配置完成。具体通信的使用则是用到了SPI读取串行FLASH。
详细参照野火资料。