基于STM32详解SPI-下
一、HAL库有关SPI操作的函数讲解
初始化流程,这一部分是通过STM32CubeMX自动生成的代码进行初始化:
① GPIO初始化
__HAL_RCC_GPIOA_CLK_ENABLE(); //打开时钟
/**SPI1 GPIO Configuration
PA5 ------> SPI1_SCK
PA7 ------> SPI1_MOSI
*/
GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; //复用推挽
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; //高速率
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); //初始化
② SPI初始化
__HAL_RCC_SPI1_CLK_ENABLE(); //打开时钟
hspi1.Instance = SPI1; //配置SPI1
hspi1.Init.Mode = SPI_MODE_MASTER; //主机模式
hspi1.Init.Direction = SPI_DIRECTION_1LINE; //半工
hspi1.Init.DataSize = SPI_DATASIZE_8BIT; //8位数据
hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH; //极性位高
hspi1.Init.CLKPhase = SPI_PHASE_2EDGE; //第2个时钟沿采样
hspi1.Init.NSS = SPI_NSS_SOFT; //软件NSS
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; //2分频
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; //高位在前
hspi1.Init.TIMode = SPI_TIMODE_DISABLE; //禁用TIMMode
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; //禁用校验
hspi1.Init.CRCPolynomial = 10; //无意义
if (HAL_SPI_Init(&hspi1) != HAL_OK) //开始初始化
{
Error_Handler();
}
HAL常用库函数:
阻塞发送,调用该函数可以通过SPI发送一一帧数据:
HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);
阻塞接收,调用该函数可以阻塞接收一帧数据:
HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);
阻塞发送并接收,调用该函数可以先发送一帧数据,然后再接收一帧数据:
HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout);
下面我们就以上面的三个函数为例,配合逻辑分析仪,看看单片机发出的数据是什么样子的。
二、SPI时序分析实验
这里通过使用逻辑分析仪读取STM32按照上一节的配置发出的数据来给大家分析。
PA5 ------> SPI1_SCK CH0
PA7 ------> SPI1_MOSI CH1
主要代码如下:
第一个参数时使用spi1发送数据的意思,第二个参数为数据的地址,第三个参数为数据大小,单位是字节,第四个参数为超时时间。
使用阻塞发送,发送0x12:
大家可以仔细观察图中的电平变化,上面的时钟,空闲时保持高电平,在第二个边缘采样,也就是上升沿,每个上升沿对应到下方的数据通道的电平就是数据。
二进制0001_0010 à16进制0x12
三、SPI协议的优缺点
优点:
① 支持全双工通信
② 不一定需要用特定的SPI外设实现,也可通过软件实现
③ 比I²C或SMBus更高的吞吐量
④ 消息大小(一帧数据不一定需要保证是1字节),内容和目的的任意选择
⑤ 从机不需要唯一的地址
⑥ 信号是单向的,允许简单的电偶分离
缺点:
① 即使是三线式SPI,也需要比I²C更多的IC封装引脚
② 没有带内寻址; 共享总线上需要带外片选信号(假设一条SPI总线上有多个SPI从机,需要单片机的其他引脚通过高低电平去控制需要被选中的外设的片选管脚)
③ 从机没有硬件流量控制 (但主机可以延迟下一个时钟边沿以降低传输速率)
④ 通常只支持一个主设备
⑤ 不支持动态添加节点
- 点赞
- 收藏
- 关注作者
评论(0)