HAL_SPI_Transmit() 是否丢弃接收到的数据?

Does HAL_SPI_Transmit() discard received data?

假设我有两块带有全双工 SPI 连接的 STM 板(一个为主,一个为从),假设我在每一端使用 HAL_SPI_Transmit() 和 HAL_SPI_Receive()通讯.

进一步假设我希望通信由一系列单字节命令和响应事务组成:主机发送命令A,从机接收它然后发送响应A; master发送command B,slave收到后发送response B,依此类推

当主机调用 HAL_SPI_Transmit() 时,SPI 的性质意味着当它通过 MOSI 线输出第一个字节时,它同时通过 MISO 线输入一个字节。主机然后会调用 HAL_SPI_Receive() 为从机提供时钟来传输其响应。我的问题:master的HAL_SPI_Receive()调用的结果是什么?是master传输时同步输入的字节,还是slave之后传输的字节?

换句话说,在 HAL_SPI_Transmit() 期间隐式记录的数据是否被“丢弃”? 我认为它必须,否则我们应始终使用 HAL_SPI_TransmitReceive() 调用并忽略接收到的部分。

(同样,当调用 HAL_SPI_Receive() 时,时钟 OUT 的内容会在另一端看到吗?)


附录:请不要说“不要使用 HAL”。我试图了解这是如何工作的。我可以稍后离开 HAL——现在,我是一个初学者,希望保持简单。我完全承认HAL的缺点。尽管如此,HAL 仍然存在并且被广泛使用。

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

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

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

我以前从未单独使用过 HAL_SPI_Receive(),但只要时钟信号有效,调用该函数的微控制器就可以发送任何数据。如果你使用这个函数,你应该假设在另一个微控制器上发送的数据必须被忽略。当使用 HAL_SPI_Transmit()HAL_SPI_Receive().

时,您还可以使用逻辑分析仪来跟踪两个微控制器之间的 SPI 数据交换