基于stm32的spi从机实验HAL库编程

基于stm32的spi从机实验HAL库编程

前言

在微控制器的世界中,串行外设接口(SPI)是一种广泛使用的接口,它允许设备之间进行快速通信。在这篇文章中,我将介绍如何使用STM32的硬件抽象层(HAL)库来编程一个SPI从机。我们将通过一个实验来理解SPI在实际应用中的运作方式,并且深入了解STM32的编程方法。

业务场景

假设有一个板子A作为主机端,通过一个接口的方式向外通讯交互,我们有一个板子B作为从机,用作接收端,现在按照主机端的协议来跟主机进行交互。

硬件设计接线

在这里插入图片描述

在我的这个硬件中,手头有一个stm32g0f6p6的板子,所以我以这个板子用作从机端进行设计。

打开STM32CubeMX进行操作

配置swd接口

在这里插入图片描述

配置spi

在这里插入图片描述

圈起来的参数要迎合主机端,不然通讯交互会出错,不知道主机端是什么配置时,则需要根据主机端底层通讯展示出来的波形来配置,用一个逻辑分析仪抓取分析一下,以我的这个场景为例,我的底层通讯呈现如下的波形:

在这里插入图片描述

按照我这里的展示,数据线1是对应MOSI,数据线2对应MISO,可以看到主机端时钟空闲电平是高电平,所以参数CPOL选择High参数,可以观察到数据1在交互时在第二边沿时电平很稳定,所以我这里CPHA的参数选择第一个边沿。至于是LSB先发,还是MSB先发,这个得双方进行约定,我这里以MSB先发为例。

配置DMA

在这里插入图片描述

配置中断

在这里插入图片描述

配置系统时钟

在这里插入图片描述

配置工程

在这里插入图片描述

在这里插入图片描述

生成代码

在这里插入图片描述

写点从机代码

在我的这个场景中,主机端每隔4ms发来一次数据,主机的数据格式如下:

在这里插入图片描述

在这里插入图片描述

从机端的代码如下:

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_SPI1_Init();
  /* USER CODE BEGIN 2 */

  HAL_SPI_TransmitReceive_DMA(&hspi1,g_tx_buff,g_rx_buff,4);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */
}

从机使用DMA的方式进行接收,接收完成之后会进入一个回调函数,在回调函数里面我重新开启DMA接收,这是因为不是使用DMA的循环模式,循环模式自己用得不是很熟,这里是收完一次在重新打开。

void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)
{
	if(hspi->Instance == SPI1)
	{
		HAL_SPI_TransmitReceive_DMA(&hspi1,g_tx_buff,g_rx_buff,4);
	}
}

至于这个回调函数在哪里,可以在对应的.h中看到相关的声明,我们把对应的函数拿出来用就行了。

在这里插入图片描述

上机现象

在这里插入图片描述

在这里插入图片描述

可以看到,从机端在正常接收数据,在回调函数里面把数据摘取出来,就可以进行下一步的数据控制了。

后记

这里我只是进行简单的交互实验,实际工程中,数据交互会按照协议来进行设计,哪些字节表示命令,哪些字节表示校验,哪些字节表示长度,哪些字节表示参数,这些字节是什么含义,只有熟悉整个系统的设计者知道。

本文记录到此,算是自己工程的一次实践,希望这篇文章能帮助到你,本文完!!感谢阅读,感谢关注。

本文使用的测试工程

https://download.csdn.net/download/weixin_44317448/89286989

STM32 HAL SPI从机通信是指使用STM32开发板的SPI接口作为从机与主机进行通信。STM32提供了HAL库,能够方便地配置和控制SPI通信。 首先,需要初始化SPI接口。通过调用HAL_SPI_Init()函数可以对SPI进行基本配置,如设置数据位宽、模式、时钟极性和相位等。 然后,配置从机的片选引脚。SPI通信中,从机需要有一个片选引脚,主机通过控制片选引脚来选中从机进行通信。通常可以通过GPIO配置相关引脚为输出模式,并设置为高电平,表示从机处于空闲状态。 接下来,在主循环中,需要监听SPI通信是否发生。可以通过调用HAL_SPI_Receive()函数来接收主机发送过来的数据。该函数参数中需要传入数据接收缓冲区和数据长度。 在接收到数据后,可以进行相应的处理。可以根据接收到的数据进行判断,执行不同的操作或返回相应的数据给主机。 在通信结束后,可以通过调用HAL_SPI_Transmit()函数发送从机的回应数据给主机。同样需要传入数据发送缓冲区和数据长度作为参数。 最后,需要在主循环中调用HAL_Delay()函数进行延时,以保证从机能够及时响应主机的命令。 总结起来,STM32 HAL SPI从机通信需要进行SPI接口的初始化配置、从机片选引脚的设置、接收主机数据并处理、发送从机回应数据以及延时等步骤。通过控制SPI接口和相关引脚,实现主机与从机之间的可靠通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独处东汉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值