CAN Protocol 介绍
CAN 全名为控制器区域网路 (Controller Area Network) ,由德国BOSCH公司开发目前也是应用最广泛的现场汇流排。CAN的两个国际标準分别是ISO11898与11519-2,ISO11898为高速ISO 11519-2为低速,两者主要差异如下表:
闭环Bus: 两端需要接上120Ω的终端电阻
开环Bus : 由于是开环两Bus是独立的,每个Bus要串联一个2.2kΩ的电阻
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较小,较小者优先发送,另一设备则须等待。
CAN Bus 讯息框架介绍
标準资料框架 : 最多可支援2^11个节点,单一讯息可传送8 Bytes资料

接下来一一来介绍每一个位元所代表的意义~SOF : 开始时送出一位元的Dominant (0) 用来作为同步用途。Arbitration Field : 就是前面所提到的仲裁码,用来判断优先权。当多节点同时重送时会一个一个判断。这边分为CAN 2.0A与CAN 2.0B分别为 11bits 与 29bits。RTR : 判断要传送还是接收,RTR = 0表示要传送 RTR = 1表示要接收Control Field : 资料长度也就是DLC的部分,有4个bit对应如下表:

Error bit 则依照设备的状态做选择(主动、被动、关闭),主动为6个0被动为6个1。


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)→接收举例来说可以看到下方图
正确设置 可以通过

CAN 讯息位元结构
CAN讯息位元结构会由以下4个区段所组成
同步段 (Synchronization Segment)传播段 (Propagation Segment)相位缓冲段1 (Phase Buffer Segment 1)相位缓冲段2 (Phase Buffer Segment 2)
每个位元区段由数个单位时间组成(TQ),最少8个最多25个。
计算方式 :
Tpclk = CAN时钟的週期(CAN使用APB1时钟)
设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) )


上图来源: 手册