STM32 SPI通信协议2——SPI功能选项设置

发布时间:2024年01月12日

在上篇文章中,已经对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_Direction的参数值
SPI_Mode描述
SPI_Direction_2Lines_FullDuplex

SPI设置为双线双向全双工

SPI_Direction_2Lines_RxOnlySPI设置为双线单向接收
SPI_Direction_1Line_RxSPI设置为单线双向接收
SPI_Direction_1Line_TxSPI设置为单线双向发送

? ? ? ? 建议写双线双向全双工,没用到也无所谓,以后要是用到了,也不用去改。

?SPI_Mode:设置SPI的工作模式(这个SPI_Mode和上面的只是名字一样,其他完全不同)。

SPI_Mode的参数值
SPI_Mode描述
SPI_Mode_Master设置为主SPI
SPI_Mode_Slave设置为从SPI

SPI_DataSize:设置SPI的数据大小。

SPI_DataSize的参数值
SPI_DataSize描述
SPI_DataSize_16bSPI发送接收16位帧结构
SPI_DataSize_8bSPI发送接收8位帧结构

? ? ? ? 看一下连接什么样的外设,在对应的手册里可以找到是多少帧的。?

SPI_CPOL:选择串行时钟的稳态。

SPI_CPOL的参数值
SPI_CPOL描述
SPI_CPOL_High时钟悬空高
SPI_CPOL_Low时钟悬空低

?????????看外设空闲的时候是低电平还是高电平。

?SPI_CPHA:设置为捕获的时钟活动沿。

SPI_CPHA的参数值
SPI_CPHA描述
SPI_CPHA_2Edge数据捕获于第二个时钟沿
SPI_CPHA_1Edge数据捕获于第一个时钟沿

?????????CPHA已经在上一章已经详细介绍过了。

SPI_NSS:指定NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理。

SPI_NSS的参数值
SPI_NSS描述
SPI_NSS_HardNSS由外部管脚管理
SPI_NSS_Soft内部NSS信号有SSI位控制

SPI_BaudRatePrescaler:设置波特率预分配的值(用于设置发送和接收的SCK时钟)。

SPI_BaudRatePrescaler的参数值
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描述
SPI_FirstBit_MSB数据传输从MSB位开始
SPI_FirstBit_LSB数据传输从LSB位开始

????????MSB:数据的高位。

????????LSB:数据的低位。

????????外设的手册里面也有要求。

SPI_CRCPolynomial:定义了用于CRC值计算的多项式。

以下是关于SPI通信中CRC校验的计算方法:

  1. 首先,我们需要准备好要发送的数据,假设为data。

  2. 然后,我们需要定义一个生成多项式,假设为0x1021。

  3. 接下来,我们需要将data和一个16位的初始值0xFFFF进行异或运算,得到一个新的16位值。

  4. 然后,我们需要将这个16位值的最高位(即第15位)设置为0,然后将这个16位值左移一位。

  5. 如果这个16位值的最高位为1,则需要将其与生成多项式进行异或运算。

  6. 重复步骤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);

文章来源:https://blog.csdn.net/m0_73671341/article/details/134808887
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。