STM32-12 CANBus概念介绍

CAN Protocol 介绍

CAN 全名为控制器区域网路 (Controller Area Network) ,由德国BOSCH公司开发目前也是应用最广泛的现场汇流排。CAN的两个国际标準分别是ISO11898与11519-2,ISO11898为高速ISO 11519-2为低速,两者主要差异如下表:

ISO11898(高速)ISO11519-2(低速)通讯速度最高可达 1Mbps最高可达 125kbpsBUS长度最大 40m最大 1kmMax Unit3020Bus 型态闭环开环阻抗120Ω120Ω终端电阻120Ω (Min 85Ω Max 130Ω)2.2kΩ (Min 2.09kΩ Max 2.31Ω)

闭环Bus: 两端需要接上120Ω的终端电阻
http://img2.58codes.com/2024/20146325zjLqJl7Rz1.png
开环Bus : 由于是开环两Bus是独立的,每个Bus要串联一个2.2kΩ的电阻
http://img2.58codes.com/2024/20146325gSku95TfRN.png
CAN的应用範围很广,最常见的为应用在车辆产业与嵌入式工业等等,而在汽车产业当中也定义了一个以CAN为底层的SAE J1939协定。为什么CAN会应用的这么广泛,主要是因为它有很高的可靠性、错误检测能力、扩充容易与低成本,同时双绞线的设计可以降低讯号的干扰。

为何要加上终端电阻?

最主要目的就是为了稳定通讯,避免信号反射的问题导致资料在传输的过程当中出现错误!

提高放电速度:使Bus总线快速进入隐性状态提高抗干扰之能力终端电阻过小:CAN-Bus于採样时无法辨别高低电位导致资料混乱。终端电阻过大: 讯号出现下降沿过缓且时间过长,导致总线错误。

CAN 特性:

CAN Bus按传输速度来区分的话可以分为:

高速 (HSCAN) :应用于安全性需求较高的设备 Ex: ABS 、操作相关中速 (MSCAN) :车载音响低速 (LSCAN) : 应用于较无关的辅助设备

CAN Bus 主要特点 :

单笔传输最大可传送 8 bytes 资料CAN是以讯息做传输而不是地址ID资料定义在讯息当中,而不是在节点上。所以在扩充or移除时可透过软体直接执行CAN又分为2.0A与2.0B,2.0A最大可以支援2^11 Node ; 2.0 B最大可支援2^29 NodeCSMA/CD-CR Protocol在整个通讯系统当中,每个Node都可以作为一个Master,且无须Host。优秀的抗干扰与除错能力

介绍一下第5点CSMA/CD-CR

CSMA(Carrier Sense Multiple Access) : 在讯息要传送之前需要对Bus进行检查,当确认为空闲状态时才可以进行传送,同时可让多个设备同时存取Bus,一个设备传送的资料可以被多个设备接收,可以想成是广播既然是广播就会发生碰撞,所以必须先检查有没有其他设备正在使用。CD-CR (Collisions Detection & Collisions Resolution) : 分别为碰撞侦测与碰撞处理机制,像上方说的既然是广播方式那必定会有碰撞,这时候就需要碰撞侦测与碰撞处理,来解决冲突的问题。

CAN的碰撞机制透过仲裁来处理,每笔讯息都会有定义ID来决定优先权。可以看到下方图以CAN2.0A为例,仲裁码(ID)为9 bit 当发生碰撞时会比较两节点ID较小,较小者优先发送,另一设备则须等待。
http://img2.58codes.com/2024/20146325bNbCb4xm0J.png


CAN Bus 讯息框架介绍

标準资料框架 : 最多可支援2^11个节点,单一讯息可传送8 Bytes资料
http://img2.58codes.com/2024/20146325o1lwX5gNaW.png扩展资料框架 :最多可支援2^29个节点,单一讯息可传送8Bytes资料
http://img2.58codes.com/2024/20146325RV5bPYzGX8.png
接下来一一来介绍每一个位元所代表的意义~SOF : 开始时送出一位元的Dominant (0) 用来作为同步用途。Arbitration Field : 就是前面所提到的仲裁码,用来判断优先权。当多节点同时重送时会一个一个判断。这边分为CAN 2.0A与CAN 2.0B分别为 11bits 与 29bits。RTR : 判断要传送还是接收,RTR = 0表示要传送 RTR = 1表示要接收Control Field : 资料长度也就是DLC的部分,有4个bit对应如下表:DLCDLC3DLC2DLC1DLC00000010001200103001140100501016011070111810/10/10/1IDE: 决定是标準格式为IDE = 0;扩展格式为 IDE = 1。R0 : 保留 未用Data Field : 写入要发发送的资料or存入要接收的资料 0~ 8BytesCRC Field : 错误检查用途ACK Field : 确认应答机制,传送端送出一个1后当接收正确该接收设备会传送 0EOF : 通讯结束栏位,每笔资料都是由7个bit的1当作结束的判断远端通讯格式 (Remote Frame) : 用途为请求远端节点(设备)传送资料,与第一二点类似只是资料长度0,并依照2.0A or B来选择。当A设备要B设备给资料时,A送出远端格式同时将B的ID写入开头的仲裁位,并且在RTR当中填1后续接上3bit的间歇时间。
http://img2.58codes.com/2024/20146325pOLhvsVoXf.png错误通讯格式(Error Frame) : 当接收到的讯息错误时,接收到的设备会发送错误格式告诉其他节点。发现错误资料时一定会接上6bit的错误旗标最长可以到12bit,后续再接上8bit区隔位元。
Error bit 则依照设备的状态做选择(主动、被动、关闭),主动为6个0被动为6个1。
http://img2.58codes.com/2024/20146325FDZEaQYvhR.png超载通讯格式(Overload Frame) : 假如设备需要更多时间处理时,可以使用超仔通讯格式来延迟下一笔资料的时间,接再远端通讯格式or资料通讯格式之后。
http://img2.58codes.com/2024/20146325r5IeD954Nw.png

CAN-Bus错误侦测

CRC Error (CRC错误) : 主要用来检查数据传送后可能出现的错误。产生的数字在传送之前会计算出来并且附加到资料后面,也就是上方的CRC Field,然后接收方进行检验确定资料是否发生变化。ACK Error (ACK错误) : 传送端会传出2个bit的1为ACK Field,前者为ACK Slot后者为ACK 区隔位元。当传送端在ACK Slot送出1的时候,接收端要回传0。如果不是的话那就会在ACK 区隔位元后面传送error frame。Format Error (格式错误) : CRC与ACK都有区隔位元(delimiter),这些bit都为1如果在这些bit上读到0,那从下一个bit开始就传送Error Frame。Stuff Error (填充错误) : 接收端和传送端共同说好传送几个相同的bits就要传送一个相反的bit,用来跟delimiter 做区隔。当讯息中连续侦测到6个相同的bit的时候,就会从下一个bit开始传送Error Frame。Bit Error (位元错误) : 处于发送资料中的设备会比较发送的资料和汇流排中的电位变化是否一致,如果不一致则直接在位传完的讯息后面接着传送一个Error Frame。

CAN-Bus 硬体

CAN-Bus在接收or传送资料时,主要须设定三个部分来判断CAN是否优先传送or正确接收资料。

节点仲裁码(Arbitrary / ID)→传送讯息遮罩 (Mask)→接收 : 当Mask都为0时,不管ID与Filter是多少都能通过。当Mask为1时,需检查Filter与ID位元是否相等,相等才能通过。讯息过滤器 (Filter)→接收MaskFilterID通过?0n(皆可)n(皆可)Y100Y101N110N111Y

举例来说可以看到下方图

正确设置 可以通过
http://img2.58codes.com/2024/20146325xH09BA7kCW.png错误设置 无法通过
http://img2.58codes.com/2024/20146325lNrIQugUjX.png

CAN 讯息位元结构

CAN讯息位元结构会由以下4个区段所组成

同步段 (Synchronization Segment)传播段 (Propagation Segment)相位缓冲段1 (Phase Buffer Segment 1)相位缓冲段2 (Phase Buffer Segment 2)
http://img2.58codes.com/2024/20146325dg30GuBKJz.png
每个位元区段由数个单位时间组成(TQ),最少8个最多25个。

计算方式 :
Tpclk = CAN时钟的週期(CAN使用APB1时钟)

正常的位时间(Tnbt) = (1+Tbs1 + Tbs2)x TqTq = (BRP+1) x Tpclk
设CAN时钟频率为FpclkTq = (BRP+1)/FpclkTnbt =(1+Tbs1 + Tbs2)x (BRP+1) / Fpclk
由4可以知道CAN输出波特率(Fcan = 1 / Tnbt )为:
Fcan = Fpclk / ( (1+Tbs1 + Tbs2)x (BRP[9:0]+1) )
http://img2.58codes.com/2024/20146325aCSULDook1.png
http://img2.58codes.com/2024/20146325bYmmWkEeCc.png
上图来源: 手册

关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章