首页 > 解决方案 > HAL_SPI_Transmit() 会丢弃接收到的数据吗?

问题描述

假设我有两个带有全双工 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 存在并且被普遍使用。

标签: stm32spihal

解决方案


是的,如果您仅用于HAL_SPI_Transmit()发送数据,则在同一时钟事件中接收到的数据将被丢弃。

作为替代方案,用于HAL_SPI_TransmitReceive()在相同的时钟事件中发送数据和接收数据。您需要提供两个数组,一个包含将要发送的数据,另一个数组将在同一时钟事件接收到字节时填充。

例如,如果您的 STM32 SPI 从设备希望在主设备计划向其发送 4 个时钟字节时向主设备发送数据(主设备发送 0xFF 字节以从从设备检索一个字节),使用HAL_SPI_TransmitReceive()将让您发送您希望发送的数据阵列,并接收另一个阵列上的所有时钟字节 0xFF。

我以前从未单独使用HAL_SPI_Receive()过,但只要时钟信号有效,调用该函数的微控制器就可以发送任何数据。如果您使用此功能,您应该在其他微控制器上假设必须忽略发送的数据。HAL_SPI_Transmit()在使用和时,您还可以使用逻辑分析仪来跟踪两个微控制器之间的 SPI 数据交换HAL_SPI_Receive()


推荐阅读