嵌入式软件工程师-硬件接口与通信协议-CAN总线_CAN总线仲裁与冲突解决.docx

嵌入式软件工程师-硬件接口与通信协议-CAN总线_CAN总线仲裁与冲突解决.docx

  1. 1、本文档共20页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

PAGE1

PAGE1

CAN总线基础介绍

CAN(ControllerAreaNetwork)总线是一种用于实时应用的串行通信协议,特别适用于汽车和其他工业自动化环境中的数据通信。它由Bosch公司在1983年开发,旨在提供一种高效、可靠且成本效益高的通信方式,以满足现代车辆中电子控制单元(ECU)之间的数据交换需求。

1CAN总线的物理层

CAN总线的物理层主要由两条差分信号线组成,通常称为CAN_High和CAN_Low。这两条线上的电压差决定了总线上的逻辑状态。在空闲状态下,两条线上的电压差为0V,表示逻辑“1”。当有节点发送数据时,它会将CAN_High线的电压提高,同时将CAN_Low线的电压降低,形成一个电压差,表示逻辑“0”。

2CAN总线的数据帧结构

CAN总线的数据帧由多个字段组成,包括帧起始、仲裁场、控制场、数据场、CRC场、应答场和帧结束。其中,仲裁场包含了标识符,用于确定哪个节点的数据将被优先发送。

2.1仲裁场

仲裁场中的标识符是一个11位或29位的二进制数,用于识别数据帧的优先级。标识符的数值越小,优先级越高。当多个节点同时尝试发送数据时,它们会通过比较标识符来决定哪个节点的数据将被优先发送。

2.2控制场

控制场包含了数据长度代码(DLC),用于指示数据场中包含的字节数。DLC的值范围从0到8,表示数据场中包含的字节数从0到8。

2.3数据场

数据场包含了最多8个字节的数据。这些数据可以是传感器读数、控制信号或其他任何需要在节点之间交换的信息。

2.4CRC场

CRC场包含了循环冗余校验码,用于检测数据传输过程中的错误。接收节点会计算接收到的数据的CRC,并将其与数据帧中的CRC进行比较。如果两者不匹配,接收节点会认为数据帧中存在错误,并将其丢弃。

2.5应答场

应答场由一个位组成,用于确认数据帧的接收。如果接收节点成功接收到数据帧,它会发送一个显性位(逻辑“0”)作为应答。如果接收节点没有接收到数据帧,它会发送一个隐性位(逻辑“1”)。

2.6帧结束

帧结束由7个位组成,全部为隐性位(逻辑“1”)。这表示数据帧的结束。

3CAN总线通信原理

CAN总线采用多主模式,这意味着网络中的任何节点都可以在任何时间尝试发送数据。然而,为了避免冲突,CAN总线使用了一种称为“仲裁”的机制。当多个节点同时尝试发送数据时,它们会通过比较标识符来决定哪个节点的数据将被优先发送。标识符的数值越小,优先级越高。

3.1仲裁过程

仲裁过程发生在数据帧的仲裁场中。当多个节点同时尝试发送数据时,它们会将数据帧的起始位发送到总线上。然后,它们会开始发送标识符。如果两个节点的标识符在某一位上不同,那么标识符中包含显性位(逻辑“0”)的节点将赢得仲裁,而包含隐性位(逻辑“1”)的节点将停止发送,并等待下一次发送机会。

3.2冲突解决

如果两个节点的标识符完全相同,那么它们会继续发送控制场和数据场。如果在数据场中发生了冲突,那么冲突节点会发送一个错误帧,以通知网络中的其他节点数据帧中存在错误。然后,冲突节点会等待一段时间,再尝试重新发送数据。

3.3位填充

为了确保数据帧的同步,CAN总线使用了一种称为“位填充”的机制。如果在数据帧中连续出现了6个相同位,那么会插入一个相反的位,以确保接收节点能够正确地同步数据帧。例如,如果数据帧中连续出现了6个逻辑“1”,那么会插入一个逻辑“0”。

1CAN总线通信原理示例

假设我们有两个节点,节点A和节点B,它们都尝试在总线上发送数据。节点A的数据帧的标识符为0x123,而节点B的数据帧的标识符为0x124。由于节点A的标识符小于节点B的标识符,因此节点A将赢得仲裁,并优先发送数据。

#Python示例代码

classCANNode:

def__init__(self,identifier):

self.identifier=identifier

defsend_data(self,data):

#发送数据前,先发送标识符

send_identifier(self.identifier)

#发送数据

send_data(data)

#创建两个节点

node_a=CANNode(0x123)

node_b=CANNode(0x124)

#尝试同时发送数据

node_a.send_data([0x11,0x22,0x33,0x44])

node_b.send_data([0x55,0x66,0x77,0x88])

在这个示例中,我们创建了两个节点,节点A和节点B。它们都尝试在总线上发送数据。然而,由于节

您可能关注的文档

文档评论(0)

kkzhujl + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档