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

     2023-02-19     161

关键词:

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

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

】ConnectionManager.onChannelMessage()接收到具有不同connectionSerial的消息,但消息id与上一个相同;丢弃【英文标题】:ConnectionManager.onChannelMessage()receivedmessagewithdifferentconnectionSerial,butsamemessageidasaprevious;discarding【发布时间】:2018-11-0 查看详情

vlan中三种端口类型

...数据时,检验是否和默认VLAN一样,一样则通过,不一样丢弃发送出交换机时1.直接剥离VLAN标签trunk口接收和发送过程中不对帧中的标签进行任何操作(有特例,默认VLAN)接收时1.接收到没有标签的数据时,打上默认VLAN标签2.接收... 查看详情

什么会导致 UDP 数据包在发送到 localhost 时被丢弃?

】什么会导致UDP数据包在发送到localhost时被丢弃?【英文标题】:WhatwouldcauseUDPpacketstobedroppedwhenbeingsenttolocalhost?【发布时间】:2011-12-1914:14:54【问题描述】:我正在发送非常大(64000字节)的数据报。我意识到MTU远小于64000字节... 查看详情

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

】如何丢弃对使用接收器获取的任何托管对象的引用?【英文标题】:Howtodiscardreferencestoanymanagedobjectsfetchedusingthereceiver?【发布时间】:2010-06-1107:54:11【问题描述】:NSManagedObjectContext的-reset方法的文档令人困惑...所有接收者的托... 查看详情

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

】Slick3:如何丢弃和接收具有某些关系的集合【英文标题】:Slick3:howtodropandtakeoncollectionswithsomerelations【发布时间】:2015-11-1015:20:36【问题描述】:我正在与Play合作!Scala2.4和Slick3。我有如下多对多关系:classArtists(tag:Tag)extendsTab... 查看详情

随意谈谈tcp

...备都有自己到最大传输单元,如果报文超过传输单元会被丢弃,所以tcp会将要传输到字节流进行分段传输。2、应答:每一段 查看详情

itempipeline

...一些行为,同时也决定此Item是否继续通过pipeline,或是被丢弃而不再进行处理。以下是itempipeline的一些典型应用:清理H 查看详情

dhcpsnopping及华三交换机配置

...转发DHCPOffer报文,而不信任端口会将接收到的DHCPOffer报文丢弃。这样,可以完成交换机对假冒DHCPServer的屏 查看详情

git重置(撤消、丢弃)文件变更

参考技术A在Git中,有以下几种方案可以实现丢弃文件变更(即:撤消文件更改):各个方案的详细原理和使用方式如下:restore命令主要用于恢复工作区和暂存区中的文件变更;所以,它是专为丢弃文件变更而设计的命令;使用... 查看详情

FFMPEG 无法丢弃媒体中的无效数据流。为啥它会留下来以及如何丢弃它?

】FFMPEG无法丢弃媒体中的无效数据流。为啥它会留下来以及如何丢弃它?【英文标题】:InvaliddatastreaminmediacouldnotbediscardedbyFFMPEG.Whyisitstayingandhowtodiscardit?FFMPEG无法丢弃媒体中的无效数据流。为什么它会留下来以及如何丢弃它?【... 查看详情

使netcat在断开连接后丢弃所有字节

】使netcat在断开连接后丢弃所有字节【英文标题】:Makenetcatdiscardallbytesafterdisconnect【发布时间】:2017-09-1910:35:12【问题描述】:我使用netcat通过bash运行一个小型开发网络服务器,它能够一次处理一个连接。Netcat启动如下(-k使... 查看详情

niodiscardserver(代码片段)

...card服务器仅读取客户端输入的数据,立马关闭信道后丢弃数据1、步骤生成服务器信道信道绑定ip、port设置为非阻塞并注册到选择器为接收模式select轮询已注册的就绪事件对就绪事件进行相应处理接收就绪,获取连接信道... 查看详情

niodiscardserver(代码片段)

...card服务器仅读取客户端输入的数据,立马关闭信道后丢弃数据1、步骤生成服务器信道信道绑定ip、port设置为非阻塞并注册到选择器为接收模式select轮询已注册的就绪事件对就绪事件进行相应处理接收就绪,获取连接信道... 查看详情

SQL Server 会自动丢弃不必要的连接吗?

】SQLServer会自动丢弃不必要的连接吗?【英文标题】:DoesSQLServerautomaticallydiscardunnecessaryjoins?【发布时间】:2010-07-2709:56:56【问题描述】:如果我向SQLServer2005提交一个查询,其中包含许多LEFTJOIN子句,其中连接的表从未被引用,... 查看详情

Python 没有接收到来自 Arduino Mega 2560 的第一行串行数据,而是接收到所有后续数据,为啥会发生这种情况?

】Python没有接收到来自ArduinoMega2560的第一行串行数据,而是接收到所有后续数据,为啥会发生这种情况?【英文标题】:PythonnotreceivingthefirstlineofserialdatafromanArduinoMega2560,butreceivingallsubsequentdata,whyisthishappening?Python没有接收到来自A... 查看详情

Syslog-NG 中丢弃的消息 - 缓冲区配置?

】Syslog-NG中丢弃的消息-缓冲区配置?【英文标题】:MessagesdroppedinSyslog-NG-Bufferconfiguration?【发布时间】:2018-09-2010:35:49【问题描述】:我使用Syslog-NG3.8作为syslog服务器,接收来自许多不同来源的消息,大约400台服务器(过滤它们... 查看详情

如果程序意外关闭,IDisposable 对象是不是会被丢弃?

】如果程序意外关闭,IDisposable对象是不是会被丢弃?【英文标题】:DoIDisposableobjectsgetdisposedofiftheprogramisshutdownunexpectedly?如果程序意外关闭,IDisposable对象是否会被丢弃?【发布时间】:2016-03-3113:46:16【问题描述】:如果程序意... 查看详情

为啥 lambda 函数默认会丢弃推导的返回类型引用?

】为啥lambda函数默认会丢弃推导的返回类型引用?【英文标题】:Whydolambdafunctionsdropdeducedreturntypereferencebydefault?为什么lambda函数默认会丢弃推导的返回类型引用?【发布时间】:2017-05-2221:19:26【问题描述】:在C++14中,为什么具... 查看详情