stm32 - 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 存在并且被普遍使用。
解决方案
是的,如果您仅用于HAL_SPI_Transmit()
发送数据,则在同一时钟事件中接收到的数据将被丢弃。
作为替代方案,用于HAL_SPI_TransmitReceive()
在相同的时钟事件中发送数据和接收数据。您需要提供两个数组,一个包含将要发送的数据,另一个数组将在同一时钟事件接收到字节时填充。
例如,如果您的 STM32 SPI 从设备希望在主设备计划向其发送 4 个时钟字节时向主设备发送数据(主设备发送 0xFF 字节以从从设备检索一个字节),使用HAL_SPI_TransmitReceive()
将让您发送您希望发送的数据阵列,并接收另一个阵列上的所有时钟字节 0xFF。
我以前从未单独使用HAL_SPI_Receive()
过,但只要时钟信号有效,调用该函数的微控制器就可以发送任何数据。如果您使用此功能,您应该在其他微控制器上假设必须忽略发送的数据。HAL_SPI_Transmit()
在使用和时,您还可以使用逻辑分析仪来跟踪两个微控制器之间的 SPI 数据交换HAL_SPI_Receive()
。
推荐阅读
- azure-devops - 与 TFS 服务器的 VSTS 身份验证失败。请检查您的设置。TFS 代理错误
- python - 如何在整个子查询中使用 group_concat?
- angularjs - AngularJS angular.forEach 不起作用?
- google-chrome - 使用 selenium 和 chromedriver 将 chrome 移动仿真旋转到横向
- php - 解析错误:语法错误,我的 PHP API 代码中出现意外的“=”
- .net - 由于某种原因,使用 System.Web.Script.Serialization 不起作用?
- java - 使用大字节数组输入进行操作
- jenkins - 如何获取使用 jenkins 中的 p4 插件更改的文件列表?
- vba - 具有两个单元格值条件的 Excel 工作表名称
- javascript - 根据 firebase 文档,.update 仍在覆盖