HAL_SPI_Transmit() 会丢弃接收到的数据吗?

Posted

技术标签:

【中文标题】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。

以上是关于HAL_SPI_Transmit() 会丢弃接收到的数据吗?的主要内容,如果未能解决你的问题,请参考以下文章

ConnectionManager.onChannelMessage() 接收到具有不同 connectionSerial 的消息,但消息 id 与上一个相同;丢弃

nginx丢弃http包体处理

如何丢弃对使用接收器获取的任何托管对象的引用?

VLAN中三种端口类型

STM32 HAL库怎么使用SPI的发送和接收函数

Slick 3:如何丢弃和接收具有某些关系的集合