在上篇文章中,已经对STM32的四个引脚进行了GPIO的基本配置,现在开始SPI外设进行配置。
SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
SPI_Direction:设置SPI单向或者双向的数据模式。参数可取值如下图:
SPI_Mode | 描述 |
SPI_Direction_2Lines_FullDuplex | SPI设置为双线双向全双工 |
SPI_Direction_2Lines_RxOnly | SPI设置为双线单向接收 |
SPI_Direction_1Line_Rx | SPI设置为单线双向接收 |
SPI_Direction_1Line_Tx | SPI设置为单线双向发送 |
? ? ? ? 建议写双线双向全双工,没用到也无所谓,以后要是用到了,也不用去改。
?SPI_Mode:设置SPI的工作模式(这个SPI_Mode和上面的只是名字一样,其他完全不同)。
SPI_Mode | 描述 |
SPI_Mode_Master | 设置为主SPI |
SPI_Mode_Slave | 设置为从SPI |
SPI_DataSize:设置SPI的数据大小。
SPI_DataSize | 描述 |
SPI_DataSize_16b | SPI发送接收16位帧结构 |
SPI_DataSize_8b | SPI发送接收8位帧结构 |
? ? ? ? 看一下连接什么样的外设,在对应的手册里可以找到是多少帧的。?
SPI_CPOL:选择串行时钟的稳态。
SPI_CPOL | 描述 |
SPI_CPOL_High | 时钟悬空高 |
SPI_CPOL_Low | 时钟悬空低 |
?????????看外设空闲的时候是低电平还是高电平。
?SPI_CPHA:设置为捕获的时钟活动沿。
SPI_CPHA | 描述 |
SPI_CPHA_2Edge | 数据捕获于第二个时钟沿 |
SPI_CPHA_1Edge | 数据捕获于第一个时钟沿 |
?????????CPHA已经在上一章已经详细介绍过了。
SPI_NSS:指定NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理。
SPI_NSS | 描述 |
SPI_NSS_Hard | NSS由外部管脚管理 |
SPI_NSS_Soft | 内部NSS信号有SSI位控制 |
SPI_BaudRatePrescaler:设置波特率预分配的值(用于设置发送和接收的SCK时钟)。
SPI_NSS | 描述 |
SPI_BaudRatePrescaler2 | 波特率预分频值为2 |
SPI_BaudRatePrescaler4 | 波特率预分频值为4 |
SPI_BaudRatePrescaler8 | 波特率预分频值为8 |
SPI_BaudRatePrescaler16 | 波特率预分频值为16 |
SPI_BaudRatePrescaler32 | 波特率预分频值为32 |
SPI_BaudRatePrescaler64 | 波特率预分频值为64 |
SPI_BaudRatePrescaler128 | 波特率预分频值为128 |
SPI_BaudRatePrescaler256 | 波特率预分频值为256 |
? ? ? ? ?凡是串行通信就肯定有波特率,因为波特率决定了串行通信的速度,而串行通信的速度越快stm32接收的速度也就越快。如果你想让32工作的快一点,采集的频率快一点,那么可以让分频系数小一些,波特率就会变大。
????????分频系数是指UART模块将时钟频率进行分频后得到的用于传输数据的实际时钟频率,其计算公式为:分频系数 = UART时钟频率 / (波特率 x 16)。例如,当UART时钟频率为16MHz,波特率为9600时,分频系数为104.1667。
?SPI_FirstBit:设置数据传输从MSB开始,还是从LSB开始。
SPI_FirstBit | 描述 |
SPI_FirstBit_MSB | 数据传输从MSB位开始 |
SPI_FirstBit_LSB | 数据传输从LSB位开始 |
????????MSB:数据的高位。
????????LSB:数据的低位。
????????外设的手册里面也有要求。
SPI_CRCPolynomial:定义了用于CRC值计算的多项式。
以下是关于SPI通信中CRC校验的计算方法:
首先,我们需要准备好要发送的数据,假设为data。
然后,我们需要定义一个生成多项式,假设为0x1021。
接下来,我们需要将data和一个16位的初始值0xFFFF进行异或运算,得到一个新的16位值。
然后,我们需要将这个16位值的最高位(即第15位)设置为0,然后将这个16位值左移一位。
如果这个16位值的最高位为1,则需要将其与生成多项式进行异或运算。
重复步骤4和5,直到左移了16次,此时得到的16位值就是CRC校验码。
下面是一个Python实现的例子:
def spi_crc(data): crc = 0xFFFF poly = 0x1021 for byte in data: crc ^= (byte << 8) for _ in range(8): if crc & 0x8000: crc = (crc << 1) ^ poly else: crc <<= 1 return crc & 0xFFFF
其中,data为要发送的数据,返回值为CRC校验码。
SPI的配置基本上全都看外设的要求是什么,照搬就可以了。?
最后使能一下SPI就可以了
SPI_Cmd(SPI1,ENABLE);