打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
两片STM32使用HAL完成SPI全双工主从通信

SPI是一种非常简单易用的全双工主从式通信协议。

本文使用两片STM32F429,一个作为主机,一个作为从机完成SPI的全双工通信测试。

在STM32的HAL库中简化了SPI主机端的发送接收,但是HAL库没有提供一个简单的SPI从机代码接口,这样就需要自己拼接接口来完成全双工的通信。以下都以实现全双工通信为目的进行配置和编写:

一 主机端:

禁止使用SPI的硬件片选信号,因为这个信号是SPI使能了之后就一直为低,直到禁止了SPI之后才为高。可以使用某一个普通IO来充当片选信号。

这里选用一个较低的速率来通信,在HAL库的spi头文件中有说明各个模式下SPI的最大速度。

二 从机端:

主从的速率要一样,从机打开SPI中断

三 硬件连接:

主机                        从机

CS                          CS

CLK                        CLK

MISO                      MISO

MOSI                      MOSI

接收和发送都是直连不需要交叉。

四 主机代码:

  /* USER CODE BEGIN 3 */

HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port, SPI1_NSS_Pin, GPIO_PIN_RESET);

HAL_SPI_TransmitReceive(&hspi1, txbuf, rxbuf, 1, 0xFF);

HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port, SPI1_NSS_Pin, GPIO_PIN_SET);

HAL_Delay(500);

  }

  /* USER CODE END 3 */

五 从机代码:

现在while之前打开spi接收中断:

  /* USER CODE BEGIN 2 */

HAL_SPI_Receive_IT(&hspi1, rxbuf, 1);

  /* USER CODE END 2 */

在中断中使用阻塞函数把数据发送出去:

/* USER CODE BEGIN 4 */

void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)

{

if (hspi == &hspi1)

{

HAL_SPI_Transmit(&hspi1, txbuf, 1, 0xFFFF);

HAL_SPI_Receive_IT(&hspi1, rxbuf, 1);

}

}

/* USER CODE END 4 */

使用逻辑分析仪可以看到主机在发送的同时也收到了从机返回的数据。

可能在中断里调用阻塞发送不是很好,如果有更好的方法欢迎指正。

另外在一片stm32上使用两个SPI接口模拟主从机通信好像不能正常工作。

最后需要注意的是如果你使用了以上方法,能测试spi通信成功,但是当主程序有其他任务的时候就会非常卡顿,因为在中断中调用了阻塞发送的函数。为了让程序更加流畅一种方法是减小HAL_SPI_Transmit的等待时间,另外一种方法就是使用DMA.

因为这里我只需要用DMA回复SPI master数据,所以我只开启了从机的SPI发送DMA,而且没有使能DMA中断。配置如下图:

将spi.c中的代码更改如下:

/* USER CODE BEGIN 1 */

void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)

{

if (hspi == &hspi1)

{

HAL_SPI_Transmit_DMA(&hspi1, p_phase_buf, 1);

//HAL_SPI_Transmit(&hspi1, p_phase_buf, 1, 0xFFF);

HAL_SPI_Receive_IT(&hspi1, p_pwm_freq, 1);

}

}

/* USER CODE END 1 */

添加DMA就是这么简单,由此就看到HAL库高效的地方了,使用起来确实能大幅提高工作效率

关键字:STM32  HAL  SPI  全双工  主从通信 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/2019/ic-news010742811.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:s3c2440裸板_中断体系结构
下一篇:STM32之串口DMA接收不定长数据

  • 关注eeworld公众号
    快捷获取更多信息

  • 关注eeworld服务号
    享受更多官方福利

3

推荐阅读

STM32项目(三)——通用LIN控制器
需求:LIN马达控制器:AFS(DHL+AFL)——弯道辅助照明系统DHL:上极限,下极限,零位,马达老化循环;AFL:左极限,右极限,零位,马达老化循环;所有参数可配置:上极限,下极限,零位,左极限,右极限,马达循环上极限,马达循环下极限,马达循环次数,马达循环等待时间;保存至少30款产品的配置,配置界面需要有添加,读取,查找,删除功能。方案:STM32 + LIN + 串口(使用NXP的串口屏,TJA系列的LIN芯片)STM32的LIN接口作为主节点,马达作为从节点。系统设计:RTX多任务设计,串口处理任务,显示屏处理任务,LIN发送任务;(1)、串口处理任务:点击串口屏会获取到点击的坐标值,串口中断接受到数据加入到队列;任务
发表于 2020-12-09
STM32项目(二) —— 车灯测试台架
需求:(1)、点灯控制器:在线节拍,离线节拍;(2)、PWM控制盒:在线PWM,离线PWM;(3)、电流测试模块:检测车灯电流校准系数;方案:点灯控制器:STM32 + CAN + GPIO节拍:比如亮多长时间,灭多长时间;大节拍中嵌套多个小节拍,每个灯对应相同或者不同的节拍。上位机下发控制指令,表明此时是在线还是离线。(离线跑的节拍是在在线模式下下载的)在线模式:如果是直接输出,按照指定格式下发CAN消息,MCU接受消息并解析,切继电器点灯;如果是存储节拍,MCU内部Flash存储上位机通过CAN下发的点灯节拍。离线模式:从内部Flash中读取节拍,并控制继电器点灯;模式切换按钮:不仅可以通过上位机控制在线/离线模式,还可
发表于 2020-12-09
STM32项目(一) —— 展示车座椅
功能:模拟人开车时,ACR和ABL的变化。 主控制器:STM32(CAN,串口,网口,输入,输出)上位机:LibView ACR:卷收器(座椅上面的安全带)ABL:电机(座椅右下角接安全带的插孔)PUMA:控制器发送CAN给PUMA,PUMA控制ACR和ABL(DBC文件的解析);ACR通过CAN控制,ABL通过PWM控制电机。 STM32硬件接口:按键盒8路输入,网口与工控机软件通信,CAN1直接控制ACR,CAN2给PUMA信号控制ACR,串口与上位机软件通信(控制方向盘震动)。 主要有两块功能:静态模式和游戏模式。 静态模式:UC-WinRoad没工作时,STM32检测
发表于 2020-12-09
STM32——GPIO(2)
, GPIO_InitTypeDef* GPIO_InitStruct){  uint32_t currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00;  uint32_t tmpreg = 0x00, pinmask = 0x00;  /* 断言,用于检查输入的参数是否正确 */  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));  assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));  assert
发表于 2020-12-09
Octonion全新AI工业状态监测扩展软件包可在STM32 MCU完美运行
专业开发工业设备诊断边缘人工智能(AI)的深度技术软件公司Octonion 发布了一个STM32Cube扩展软件包。该软件包是针对来自横跨多重电子应用领域的全球领先的半导体供应商意法半导体(STMicroelectronics,简称ST;纽约证券交易所代码:STM)的工业级STM32L4 +微控制器开发板的优化过的状态监测解决方案。 Octonions的新软件包支持意法半导体在快速增长的工业状态监测和预测性维护市场上发起的使用STM32微控制器和微处理器开发人工智能应用的市场活动。Octonion的I-CUBE-OCTMI 软件包是一个运行在STM32 超低功耗MCU上的自我维护系统,系统
发表于 2020-12-09
STM32——流水灯
stm32f10x_conf.h:打开stm32f10x_gpio.h和stm32f10x_rcc.h;stm32f10x_gpio.c 和 stm32f10x_rcc.c加入工程模板中,只说重点。【stm32f10x_rcc.c用于配置系统时钟 和外设时钟,由于每个外设都要配置时钟,所以它是每个外设都需要用到的库文件。】// 新建led.h  led.c#ifndef  _LED_H_#define  _LED_H_ #include "stm32f10x.h" #define ON  0#define OFF 1 #define LED1
发表于 2020-12-08
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
STM32F4 HAL库 调试TDC
STM32HAL库详解及手动移植
物联网之LoRa开发与应用二(驱动移植)
【经验】使用GD32F103CBT6替换STM32F103CBT6时遇到的SPI通信问题及解决办法
U盘容量大小造假技术手段实现之8M变4G(以STM32 SPI_FLASH为例)
UC头条:STM32F0单片机入门
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服