STM32(HAL)——SPI通信

6. SPI

6.1 基本概念

全称Serial Peripheral Interface,是一种全双工,同步通信

6.1.1 物理层

共四条线:MOSI、MISO、SCK、NSS

信号线作用
MOSI主机输出,从机输入
MISO主机输入,从机输出
SCK时钟信号,由主机产生,用于通讯同步
NSS从机使能信号,由主机控制(片选线)

6.1.2 协议层

通讯的起始和停止

通讯起始:NSS线信号由高变低,对应的从机被选中,开始通讯

通讯结束:NSS线信号由低变高,对应的从机取消选中状态

SPI的四种模式

四种模式的区别:总线空闲时sck的时钟状态(CPOL)及数据采样时刻(CPHA)。

CPOL:SPI通讯设备处于空闲时(NSS为高电平时)SCK的状态。CPOL=0,则SCK线在空闲时为低电平;CPOL=1,则SCK线在空闲时为高电平

CPHA:数据采样的时刻。CPHA=0,MOSI或MISO线上的信号将在SCK线的奇数个跳变沿被采样;CPHA=1,MOSI或MISO线上的信号在SCK线的偶数个个跳变沿被采样。

在这里插入图片描述

:四种模式都可以使用,但是主从设备必须采用同一种模式。

6.2 STM32的SPI

STM32中SPI个数从3到6个不等,支持Motorola和TI协议。STM32还支持I2S功能。

6.3 CubeMX配置

  1. 左侧目录>Connectivity>点SPI1/SPI2……~> 勾选模式

在这里插入图片描述

Mode含义
Full-Duplex Master全双工主模式
Full-Duplex Slave全双工从模式
Half-Duplex Master半双工主模式
Half-Duplex Slave半双工从模式
Receive Only Master仅接收主模式
Receive Only Slave仅接收从模式
Transmit Only Master仅发送主模式
  1. 参数配置

在这里插入图片描述

参数含义
Frame Format框架格式,有Motorola和TI两种
Data Size数据长度,8bit和16bit两种
First Bit对齐形式,高位先行和低位先行
Prescaler预分频,用于控制波特率,波特率=16MHz/Prescaler
Clock PolarityCPOL,前面有讲
Clock PhaseCPHA,前面有讲
CRC Calculation是否启用CRC
NSS Signal Type片选形式,硬件实现还是软件实现

6.4 编程

HAL库关于CAN的所有函数定义和结构体分别在 Drivers/STM32F4xx_HAL_Driver 文件夹下 stm32f4xx_HAL_Driver.c 和 stm32f4xx_HAL_Driver.h 中

下面列举一些基本的和常用的

6.4.1 结构体

只有SPI_InitTypeDef和SPI_HandleTypeDef,分别用于初始化定义和句柄定义。如果配合CubeMx,这两个都用不上

6.4.2 函数

SPI关于IO的定义在stm32f4xx_HAL_Driver.c文件中701-2563行

函数功能
HAL_SPI_Transmit发送数据
HAL_SPI_Receive接收数据
HAL_SPI_TransmitReceive全双工,接收和发送数据
HAL_SPI_Transmit_IT发送成功中断
HAL_SPI_Receive_IT接收成功中断
HAL_SPI_TransmitReceive_IT发送接收成功中断
HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)

功能:发送一段数据
参数:spi句柄指针

​ 发送数据数组名

​ 发送数组长度

​ timeout,超出这个时间就报错,单位是ms

返回值:返回值:HAL状态

HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)

功能:接收一段数据
参数:spi句柄指针

​ 接收数据数组名

​ 接收数组长度

​ timeout,超出这个时间就报错,单位是ms

​ 返回值:返回值:HAL状态

HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size,uint32_t Timeout)

功能:接收并发送一段数据
参数:spi句柄指针

​ 发送数据数组名

​ 接收数据数组名

​ 接收发送数组长度

​ timeout,超出这个时间就报错,单位是ms

​ 返回值:返回值:HAL状态

6.4.3 SPI编程示例

SPI 的编程较CAN来说方便了很多,配合Cubemx的话就不需要做初始化配置了。

然而由于实际使用过程中所使用的STM可能作为上位机也可能作为下位机,也就是主机和从机。作为从机,相当于一个部门的下属,只需要管输入输出就完事了,不需要操心片选的事。作为主机就需要协调各从机了,相当于一个部门的主管,需要给下级授意,它改接收任务或者给主机汇报

CS(片选信号)有硬件片选和软件片选两种形式。硬件片选是单片机在收发消息时自动进行了片选线拉低并抬高的步骤,软件片选则需要在每次收发前将片选线拉低,通讯结束再将片选线拉高。

硬件片选

硬件片选是硬件已经封装好了通讯时序和片选信号开始终止,所以只需要调用上述的IO类函数即可

软件片选

软件片选稍微麻烦一点。需要另外分一个单片机引脚给CS信号,GPIO输出功能,最好配置为上拉。

当需要和某从机通信时,需要给它发送片选命令,即手动将片选线的高电平置低。例如下面这个给从机的发送过程:

HAL_GPIO_WritePin(GPIOx, GPIO_PIN_x, GPIO_PIN_RESET)   //将片选线置低,告诉从机开始通信
HAL_SPI_Tramsmit(&hspix, (uint8_t*)data, len, timeout) //发送一个数据
HAL_GPIO_WritePin(GPIOx, GPIO_PIN_x, GPIO_PIN_SET)     //将片选线重新置高,告诉从机结束通信

再次强调,通讯过程一定要在片选线为低电平时才有效!!!

  • 36
    点赞
  • 176
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,我可以帮你解答关于STM32HAL库的SPI通信问题。SPI通信是一种同步的串行通信协议,它使用4根线实现通信,分别是时钟线(SCLK)、主设备输出线(MOSI)、主设备输入线(MISO)和片选线(CS)。下面是一份使用STM32HAL库进行SPI通信的示例代码,你可以参考一下: ```c #include "stm32f4xx_hal.h" // 定义SPI句柄 SPI_HandleTypeDef hspi1; // 定义数据缓冲区 uint8_t tx_buf[10]; uint8_t rx_buf[10]; int main(void) { // 初始化HALHAL_Init(); // 初始化SPI口 hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; // 主机模式 hspi1.Init.Direction = SPI_DIRECTION_2LINES; // 双线全双工 hspi1.Init.DataSize = SPI_DATASIZE_8BIT; // 8位数据位 hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; // 时钟极性为低电平 hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; // 时钟相位为第一边沿 hspi1.Init.NSS = SPI_NSS_SOFT; // 软件控制片选信号 hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; // 波特率预分频 hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; // MSB优先 hspi1.Init.TIMode = SPI_TIMODE_DISABLE; // 禁用TI模式 hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; // 禁用CRC校验 HAL_SPI_Init(&hspi1); // 发送数据 HAL_SPI_Transmit(&hspi1, tx_buf, 10, 100); // 接收数据 HAL_SPI_Receive(&hspi1, rx_buf, 10, 100); // 同时发送和接收数据 HAL_SPI_TransmitReceive(&hspi1, tx_buf, rx_buf, 10, 100); while (1) { } } ``` 在使用HAL库进行SPI通信时,需要先初始化SPI口并定义一个SPI句柄。然后可以使用HAL_SPI_Transmit、HAL_SPI_ReceiveHAL_SPI_TransmitReceive函数分别进行发送、接收和同时发送和接收数据。参数说明如下: - 第一个参数:SPI句柄 - 第二个参数:待发送数据的缓冲区指针 - 第三个参数:待发送/接收数据的长度 - 第四个参数:超时时间(单位为ms) 希望这些信息可以帮助你解决问题。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值