发新帖本帖赏金 50.00元(功能说明)我要提问
返回列表
打印
[总线技术]

CAN总线有握手机制‌吗?有的呢!应答确认和错误重发

[复制链接]
1503|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 wahe2008 于 2025-3-26 19:53 编辑

#申请原创#
一、先说说CAN总线的特点及相关概念。



1. ‌差分信号传输‌‌
CAN总线使用两根信号线(CAN_H和CAN_L)进行数据传输,通过这两根线上的电压差来表示逻辑0和逻辑1。在隐性状态时,两根线的电压差为0V;在显性状态时,电压差至少为2V。这种差分信号传输方式具有抗干扰能力强、时序定位精确的优点。

2. ‌报文广播与优先级仲裁‌
CAN总线采用广播通信方式,所有节点都可以发送和接收数据。当一个节点发送数据时,它会将数据和标识符(ID)一起发送到总线上。标识符不仅用于标识消息类型,还用于确定消息的优先级。如果多个节点同时发送数据,CAN总线会通过标识符的逐位仲裁机制解决冲突,优先级高的节点继续发送,优先级低的节点停止发送并转为接收状态。

3. ‌帧结构与数据传输‌
CAN总线通过帧(Frame)进行数据传输,帧分为四种类型:

‌数据帧‌:用于发送数据。
‌远程帧‌:用于请求数据。
‌错误帧‌:用于通知总线错误。
‌过载帧‌:用于在数据帧之间提供延时。
数据帧由多个字段组成,包括帧起始、仲裁段、控制段、数据段、CRC段等,确保数据的完整性和可靠性。
4. ‌多主控制与错误处理‌
CAN总线支持多主控制,所有节点在总线空闲时都可以发送数据。此外,CAN总线具有强大的错误检测和处理能力,包括错误检测、错误通知和错误恢复功能,确保系统的高可靠性。

5. ‌物理层与网络扩展‌
CAN总线的物理层通常使用非屏蔽双绞线(UTP),最大传输速率为1Mbps,最大网络扩展距离为40米。在总线两端通常会连接120欧姆的终端电阻,以减少信号反射和提高信号质量。

通过以上机制,CAN总线实现了高效、可靠的数据传输,广泛应用于汽车、工业自动化等领域。




二、CAN 控制器的工作模式

CAN 控制器有 3 种工作模式:

 睡眠模式
系统复位之后, CAN 控制器处于睡眠模式, 该模式下 CAN 的时钟停止,因此可以节省电能,但软件仍然
可以访问邮箱寄存器, 同时 TX 管脚的内部上拉电阻被禁用。

 冻结模式
软件对 CAN 控制器的初始化,只能在冻结模式下进行。对 CAN 控制器的 14 组过滤器组(包括模式、位宽、
FIFO 关联、激活和过滤器值)进行初始化可以在非冻结模式下进行。当 CAN 处于冻结模式时,禁止报
文的接收和发送。

 通讯模式
在冻结工作模式配置完成后,控制 CAN 进入通讯工作模式,开始报文收发过程。

三、CAN总线协议本身‌存在握手机制‌,主要通过以下机制确保通信的可靠性:

1. ‌应答确认(ACK)机制‌‌
‌工作原理‌:发送节点在数据帧末尾添加一个‌ACK时隙‌,接收节点若成功接收数据,则在该时隙内发送‌显性电平‌(逻辑0)作为应答;若未收到应答,发送节点会触发错误处理机制并重传数据。
‌作用‌:通过物理层的即时反馈,确保单帧数据的有效传输‌。

2. ‌错误检测与重发机制‌‌
‌错误类型‌:包括位错误、CRC校验错误、格式错误等。
‌处理流程‌:检测到错误后,节点立即发送‌错误帧‌中止当前通信,并自动重传数据,直至达到最大重试次数或成功发送‌3。
‌优先级保障‌:错误帧具有最高优先级,可快速终止错误数据的传播‌。

3. ‌非破坏性仲裁机制‌‌
‌冲突解决‌:当多个节点同时发送数据时,通过帧ID的逐位仲裁(显性电平优先)决定发送顺序,避免总线冲突。
‌隐性握手‌:仲裁过程本质是节点间通过电平竞争达成一致的“握手”,确保高优先级数据优先传输‌。

4. ‌CAN高层协议的扩展握手(如CANopen SDO)‌‌
‌应用层握手‌:在CANopen协议中,服务数据对象(SDO)通过‌分段传输+ACK确认‌实现多帧数据的可靠传输。
‌示例‌:发送端分段传输数据后,接收端逐段确认,若某段未收到ACK则重传‌。

CAN总线的基本机制,尤其是ACK的部分。ACK在CAN协议中是一个重要的应答机制。发送节点在发送完数据帧后,会在ACK槽监听是否有接收节点应答。

ACK字段由两位组成,ACK槽和ACK界定符。发送节点在发送数据时,会在ACK槽放置隐性位(1),而接收节点如果正确接收到数据,就会将ACK槽拉成显性位(0)。这时候,发送节点通过检测ACK槽的电平变化来判断是否有节点正确接收。这个过程涉及到总线的线与机制,因为多个接收节点可以同时拉低电平,只要有一个节点正确接收,ACK槽就会显性,发送节点就知道数据被成功接收了‌。

另外,错误处理方面,如果发送节点在ACK槽检测到隐性位,说明没有接收节点应答,这时候会触发ACK错误,发送节点会启动重传机制。同时,ACK的检测是发送节点的责任,接收节点则通过改变ACK槽的电平来应答,而不是发送完整的帧,这有助于提高效率‌。

ACK的结构位置位于数据帧的末尾,CRC之后,发送节点在发送完数据后进入监听状态,检查ACK槽的状态。同时,不同的版本比如CAN FD可能有不同的机制,在标准CAN上,可以简要说明标准帧的结构,但不需要深入FD部分。



还要注意,错误检测中的ACK错误属于发送节点需要检测的类型,而接收节点可能检测其他类型的错误如CRC错误等‌。

总结来说,识别ACK的关键点在于发送节点在特定位置监听电平变化,利用总线的线与特性,通过显性位判断应答,并结合错误处理机制确保可靠性。

四、CAN总线通过以下机制识别ACK应答:

1.ACK字段的结构与位置


ACK字段位于CAN数据帧的末尾,紧接在CRC校验字段之后,由ACK槽(1位)和ACK界定符(1位)组成‌。

‌发送端行为‌
发送节点在ACK槽和ACK界定符处默认发送隐性位(逻辑1)‌。

2.ACK识别机制
‌接收节点应答‌
接收节点若成功接收数据,会在ACK槽将总线电平拉为显性位(逻辑0)。由于CAN总线“线与”特性,只要有一个接收节点应答,总线电平即显性‌。

‌发送节点检测‌
发送节点在发送完数据帧后进入监听状态,通过检测ACK槽电平判断是否被应答:

若ACK槽为显性位:表示至少一个节点成功接收‌。
若ACK槽保持隐性位:触发ACK错误(未应答错误),发送节点启动重传流程。

3.错误处理与ACK的关系
‌ACK错误判定‌
发送节点若未检测到显性ACK槽,则记录ACK错误并累计发送错误计数器(TEC),当TEC超限时节点进入“被动错误”状态。

‌多节点协同机制‌
CAN总线的多主架构允许任意节点作为发送方,ACK机制确保所有节点均可参与应答,但仅需一个显性位即可完成全局确认‌。

4.实际应用场景
‌故障排查‌
通过分析错误帧中的ACK段(如显性位缺失或异常波形),可定位通信故障节点‌。例如,周期性干扰可能导致ACK槽电平异常‌。

‌协议兼容性‌
CAN 2.0(标准帧和扩展帧)与CAN FD均沿用ACK机制,但高速CAN(<1Mbps)和低速CAN(<125kbps)在时序细节上存在差异‌。

综上,CAN总线通过硬件层的电平检测与协议层的错误计数器协同工作,实现高效可靠的ACK识别与错误处理‌。


      @21小跑堂                                                                    




使用特权

评论回复

打赏榜单

21小跑堂 打赏了 50.00 元 2025-03-28
理由:恭喜通过原创审核!期待您更多的原创作品~~

评论
21小跑堂 2025-3-28 14:40 回复TA
从CAN总线的特点及相关概念介绍切入,到CAN控制器的工作模式,引出CAN的握手机制探讨。 
21小跑堂 2025-3-25 15:52 回复TA
感谢分享,欢迎了解原创奖励活动https://bbs.21ic.com/icview-3431776-1-1.html 

相关帖子

沙发
绝影孤狼| | 2025-3-11 22:18 | 只看该作者
原来发送节点是通过监听ACK槽的电平变化来判断数据是否被成功接收的

使用特权

评论回复
板凳
wahe2008|  楼主 | 2025-3-26 19:41 | 只看该作者
绝影孤狼 发表于 2025-3-11 22:18
原来发送节点是通过监听ACK槽的电平变化来判断数据是否被成功接收的

发送失败有重发机制,但是不会一直重复发送,如果一直发很浪费资源的。

使用特权

评论回复
地板
515192147| | 2025-4-1 17:34 | 只看该作者
CAN2w_InitStructure.CAN_NART=DISABLE;///!!! /
                //NART(No automatic retransmission)报文自动重传功能
                //=ENABLE;禁止报文自动重传,=DISABLE,发送失败,会自动重传,直到成功  !!!!!!!!!
                //DISABLE代表的是使用自动重传的功能,ENABLE是代表不使用自动重传的功能
                //发现在不使用自动重传的功能时,如果由于总线竞争导致发送失败,数据就丢掉了。
                //所以在不是一应一答的环境中使用CAN的时候,建议开启自动重传功能。
CAN节点在发送数据时会同时侦听总线的信息,如 侦听总线的信息头包与 发送数据一样,就继续发送数据,
否则就等待下次再发;

下图为1个大型电厂的温度采集系统,分2路CANWeb总线,每路带62个8路热电偶CNW_IO模块,共992个温度采集点,项目使用4片GD32F427VE、124片GD32F305RC芯片, 采集系统CAN总线冗余,基本不丢包;


CAN总线价格便宜,抗干扰、实时性好,但开发编程复杂,需对CAN包拆包、并包,对Id的过滤进行设置,并需对通信总线的负载、丢包(通信质量)进行监视管理,以及考虑怎样快速与用户的控制器(DCS、PLC、计算机等)交换数据及方便监控调试总线节点的参数,能封装这些功能的的CAN总线的高层协议是现场总线,如CANWeb、CANOpen、DeviceNet、J1939、ISO11783、CANKingdom、SDS、iCAN等CAN高层协议。

详细见:
https://bbs.21ic.com/icview-3335470-1-1.html


使用特权

评论回复
发新帖 本帖赏金 50.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:奋斗是一种乐趣,追求是一种动力,助人是一种储蓄,吃亏是一种积累,谦和是一种修养,宽容是一种境界,忍让

23

主题

551

帖子

6

粉丝