历史上的今天
返回首页

历史上的今天

今天是:2025年01月07日(星期二)

正在发生

2019年01月07日 | 两片STM32使用HAL完成SPI全双工主从通信

2019-01-07 来源:eefocus

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库高效的地方了,使用起来确实能大幅提高工作效率


推荐阅读

史海拾趣

Aydin Corp公司的发展小趣事

在国内市场取得一定成绩后,Aydin Corp开始积极拓展国际市场。通过与全球知名企业的合作,公司成功将产品打入多个国家和地区的市场。同时,Aydin Corp还积极参加国际电子展会和交流活动,与业界同行建立了广泛的合作关系。这些举措不仅提升了公司的国际知名度,也为公司的持续发展注入了新的动力。

HDP_Power公司的发展小趣事

在国内市场取得一定成绩后,Aydin Corp开始积极拓展国际市场。通过与全球知名企业的合作,公司成功将产品打入多个国家和地区的市场。同时,Aydin Corp还积极参加国际电子展会和交流活动,与业界同行建立了广泛的合作关系。这些举措不仅提升了公司的国际知名度,也为公司的持续发展注入了新的动力。

DBS Microwave Inc公司的发展小趣事

DBS Microwave Inc公司起源于XXXX年,当时由几位志同道合的电子工程师创立。他们共同意识到,随着无线通信技术的飞速发展,微波器件的市场需求将会急剧增长。于是,他们凭借丰富的专业知识和对市场趋势的敏锐洞察,决定专注于研发和生产高质量的微波射频器件。起初,公司面临着资金紧张、市场竞争激烈等诸多挑战,但创始人团队凭借坚韧不拔的精神和对技术的执着追求,逐步在市场上崭露头角。

First Switchtech公司的发展小趣事

随着物联网、智能家居等新兴技术的兴起,First Switchtech公司(或类似公司)看到了跨界合作的新机遇。公司积极与智能家居厂商、物联网平台等合作伙伴开展深度合作,共同研发具有创新性的智能开关产品。这些产品不仅实现了开关的远程控制、智能联动等功能,还为用户提供了更加便捷、舒适的智能生活体验。通过跨界合作,First Switchtech公司成功拓展了业务领域,并在智能家居市场中占据了重要位置。

Dearborn Electronics Inc公司的发展小趣事

随着技术的不断进步,Dearborn Electronics Inc.不断投入研发,推出了一系列具有创新性的产品,如钽电容、陶瓷电容器等。这些产品以其卓越的性能和可靠性赢得了市场的广泛认可。同时,公司也积极拓展市场,将产品销售到全球各地,特别是医疗、石油、交通、工业等严苛应用领域。

DMS Electronic Components, Inc公司的发展小趣事

DMS在追求经济效益的同时,也积极履行社会责任。公司注重环境保护和资源节约,采用环保材料和工艺进行生产。同时,DMS还积极参与公益事业和社会活动,为社会做出了积极贡献。这些举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了基础。

请注意,以上故事是基于对电子行业和DMS公司业务范围的推测和构想,并不代表DMS公司真实的发展历程。如需了解更多关于DMS公司的具体信息,建议查阅公司官方网站或相关新闻报道。

问答坊 | AI 解惑

菜鸟求救啊....关于m2716的用法...

以前从没接触过这类芯片。现在要用啊。但又不会。 谁能告诉下我m2716在Proteus中如何加载数据,还有在现实中用什么把数据烧到它里面去? 不甚感谢啊... …

查看全部问答>

mc55模块上电20秒后自动关机问题

将mc55模块/IGT引脚置低电平后,mc55模块上电开机,但20秒后mc55模块会自动关机.每次都是这样,找不到原因,请各位指教.谢谢…

查看全部问答>

我想请问KEYMAN工具是个什么?

当设备与 Visual Studio 机器没有 ActiveSync 连接,但有一个有效的 TCP 连接时,部署无效。 解决办法:使用单独提供的 Keyman 工具来执行初始的设备设置. 我想请问KEYMAN工具是什么,在哪里可以找到它,或者下到它? 谢谢~…

查看全部问答>

请问一下接近开关 常开加常闭是什么意思。

我就知道接近开关有常开,和常闭,怎么还有一个一开一闭的,这个一开一闭算起什么作用呢?…

查看全部问答>

【一起学习器件指标】你敢不敢说个大家不知道的电阻指标

几乎所有的电子设计中都会使用到电阻,我稍微提供问题,你知道的电阻有哪些参数指标呢?你敢不敢说个大家都不知道的指标?这个大家现在用的多了也许再过多少年后就看不到这位了…

查看全部问答>

关于定时器中断打断芯片驱动函数时序的问题???!!!

做了个东西用的DHT11温湿度传感器  显示是用的数码管动态扫描 由于执行驱动函数用的时间比较长就把显示函数放在了定时器中断里面  问题出来了 定时器中断把DHT11驱动函数的时序给打乱了 读出来的数据一直在跳动 乱 我在驱动函 ...…

查看全部问答>

求助~~急

哪位大哥知道51单片机中读秒指示电路的工作原理?求解答…

查看全部问答>

我的C2000无法仿真了.问题已解决。

Error connecting to the target: (Error -151 @ 0x0) One of the FTDI driver functions used during the connect returned bad status or an error. The cause may one or more of: invalid emulator serial number, blank emulator EEPROM, ...…

查看全部问答>