- 1、本文档共20页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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。它们都尝试在总线上发送数据。然而,由于节
您可能关注的文档
- 嵌入式软件工程师-项目管理与软技能-敏捷开发 (Agile)_敏捷开发的常见挑战与解决方案.docx
- 嵌入式软件工程师-项目管理与软技能-敏捷开发 (Agile)_敏捷开发的度量与指标.docx
- 嵌入式软件工程师-项目管理与软技能-敏捷开发 (Agile)_敏捷开发的未来趋势.docx
- 嵌入式软件工程师-项目管理与软技能-敏捷开发 (Agile)_敏捷开发概论与历史.docx
- 嵌入式软件工程师-项目管理与软技能-敏捷开发 (Agile)_敏捷开发工具与技术.docx
- 嵌入式软件工程师-项目管理与软技能-敏捷开发 (Agile)_敏捷开发流程与仪式.docx
- 嵌入式软件工程师-项目管理与软技能-敏捷开发 (Agile)_敏捷开发与测试驱动开发.docx
- 嵌入式软件工程师-项目管理与软技能-敏捷开发 (Agile)_敏捷开发与产品管理.docx
- 嵌入式软件工程师-项目管理与软技能-敏捷开发 (Agile)_敏捷开发与持续集成.docx
- 嵌入式软件工程师-项目管理与软技能-敏捷开发 (Agile)_敏捷开发与传统开发方法的比较.docx
文档评论(0)