STM32 HAL库怎么使用SPI的发送和接收函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32 HAL库怎么使用SPI的发送和接收函数相关的知识,希望对你有一定的参考价值。
参考技术A 我把SIMO和SOMI短接,让单片机自发自收,测试的结果很正常,这说明单片机这边应该没问题,布线也没问题。我怀疑是FM25V20根本没收到指令码,所以实际上没有给单片机上传ID数据,但是不知道为什么会这样。求帮忙!>>HAL_SPI_Transmit() 会丢弃接收到的数据吗?
【中文标题】HAL_SPI_Transmit() 会丢弃接收到的数据吗?【英文标题】:Does HAL_SPI_Transmit() discard received data? 【发布时间】:2021-09-06 11:16:59 【问题描述】:假设我有两个带有全双工 SPI 连接的 STM 板(一个是主机,一个是从机),并且假设我在每一端都使用 HAL_SPI_Transmit() 和 HAL_SPI_Receive() 进行通信。
进一步假设我希望通信由一系列单字节命令和响应事务组成:主机发送命令 A,从机接收它然后发送响应 A; master发送命令B,slave收到后发送响应B,以此类推。
当主机调用 HAL_SPI_Transmit() 时,SPI 的本质意味着当它通过 MOSI 线输出第一个字节时,它同时通过 MISO 线输入一个字节。然后主设备会调用 HAL_SPI_Receive() 来为从设备提供时钟来传输其响应。我的问题:主人的 HAL_SPI_Receive() 调用的结果是什么?是主机发送期间同时输入的字节,还是从机之后发送的字节?
换句话说,在 HAL_SPI_Transmit() 期间隐式输入的数据会被“丢弃”吗?我认为必须如此,否则我们应该始终使用 HAL_SPI_TransmitReceive() 调用和忽略收到的部分。
(同样,当调用 HAL_SPI_Receive() 时,时钟输出的是什么,在另一端会看到?)
附录:请不要说“不要使用 HAL”。我试图了解这是如何工作的。以后我可以离开 HAL —— 现在,我是一个初学者,想保持简单。我完全认识到 HAL 的缺点。尽管如此,HAL 存在并且被普遍使用。
【问题讨论】:
我使用了 HAL 之上的代码,并且我直接对硬件寄存器进行了编码,所以我很奇怪地没有能力根据经验告诉你它究竟做了什么。我可以告诉你的是,你可以打开 HAL SPI 代码并直接查看文档 cmets,如果我要提供答案,那是唯一支持它的东西,而不是我对它的任何特殊经验。 【参考方案1】:是的,如果您只使用HAL_SPI_Transmit()
发送数据,则在同一时钟事件中接收到的数据将被丢弃。
作为替代方案,使用HAL_SPI_TransmitReceive()
在相同的时钟事件中发送数据和接收数据。您需要提供两个数组,一个包含将要发送的数据,另一个数组将在同一时钟事件接收到字节时填充。
例如如果您的 STM32 SPI 从机希望在主机计划向其发送 4 个时钟字节时向主机发送数据(主机发送 0xFF 字节以从从机检索一个字节),使用 HAL_SPI_TransmitReceive()
将让您发送您希望发送的数据在一个数组上,并在另一个数组上接收所有时钟字节 0xFF。
我以前从未单独使用过HAL_SPI_Receive()
,但只要时钟信号有效,调用该函数的微控制器就可以发送任何数据。如果您使用此功能,您应该在另一个微控制器上假设必须忽略发送的数据。在使用HAL_SPI_Transmit()
和HAL_SPI_Receive()
时,您还可以使用逻辑分析仪来跟踪两个微控制器之间的SPI 数据交换。
【讨论】:
这正是我的想法,谢谢!为你 +1。以上是关于STM32 HAL库怎么使用SPI的发送和接收函数的主要内容,如果未能解决你的问题,请参考以下文章