CAN Protocol 介绍
CAN 全名为控制器区域网路 (Controller Area Network) ,由德国BOSCH公司开发目前也是应用最广泛的现场汇流排。CAN的两个国际标准分别是ISO11898与11519-2,ISO11898为高速ISO 11519-2为低速,两者主要差异如下表:
|
ISO11898(高速) |
ISO11519-2(低速) |
通讯速度 |
最高可达 1Mbps |
最高可达 125kbps |
BUS长度 |
最大 40m |
最大 1km |
Max Unit |
30 |
20 |
Bus 型态 |
闭环 |
开环 |
阻抗 |
120Ω |
120Ω |
终端电阻 |
120Ω (Min 85Ω Max 130Ω) |
2.2kΩ (Min 2.09kΩ Max 2.31Ω) |
闭环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 Node
- CSMA/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资料
- 扩展资料框架 :最多可支援2^29个节点,单一讯息可传送8Bytes资料
接下来一一来介绍每一个位元所代表的意义~
- SOF : 开始时送出一位元的Dominant (0) 用来作为同步用途。
- Arbitration Field : 就是前面所提到的仲裁码,用来判断优先权。当多节点同时重送时会一个一个判断。这边分为CAN 2.0A与CAN 2.0B分别为 11bits 与 29bits。
- RTR : 判断要传送还是接收,RTR = 0表示要传送 RTR = 1表示要接收
- Control Field : 资料长度也就是DLC的部分,有4个bit对应如下表:
DLC |
DLC3 |
DLC2 |
DLC1 |
DLC0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
2 |
0 |
0 |
1 |
0 |
3 |
0 |
0 |
1 |
1 |
4 |
0 |
1 |
0 |
0 |
5 |
0 |
1 |
0 |
1 |
6 |
0 |
1 |
1 |
0 |
7 |
0 |
1 |
1 |
1 |
8 |
1 |
0/1 |
0/1 |
0/1 |
- IDE: 决定是标准格式为IDE = 0;扩展格式为 IDE = 1。
- R0 : 保留 未用
- Data Field : 写入要发发送的资料or存入要接收的资料 0~ 8Bytes
- CRC Field : 错误检查用途
- ACK Field : 确认应答机制,传送端送出一个1後当接收正确该接收设备会传送 0
- EOF : 通讯结束栏位,每笔资料都是由7个bit的1当作结束的判断
- 远端通讯格式 (Remote Frame) : 用途为请求远端节点(设备)传送资料,与第一二点类似只是资料长度0,并依照2.0A or B来选择。当A设备要B设备给资料时,A送出远端格式同时将B的ID写入开头的仲裁位,并且在RTR当中填1後续接上3bit的间歇时间。
- 错误通讯格式(Error Frame) : 当接收到的讯息错误时,接收到的设备会发送错误格式告诉其他节点。发现错误资料时一定会接上6bit的错误旗标最长可以到12bit,後续再接上8bit区隔位元。
Error bit 则依照设备的状态做选择(主动、被动、关闭),主动为6个0被动为6个1。
- 超载通讯格式(Overload Frame) : 假如设备需要更多时间处理时,可以使用超仔通讯格式来延迟下一笔资料的时间,接再远端通讯格式or资料通讯格式之後。
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)→接收
Mask |
Filter |
ID |
通过? |
0 |
n(皆可) |
n(皆可) |
Y |
1 |
0 |
0 |
Y |
1 |
0 |
1 |
N |
1 |
1 |
0 |
N |
1 |
1 |
1 |
Y |
举例来说可以看到下方图
- 正确设置 可以通过
- 错误设置 无法通过
CAN 讯息位元结构
CAN讯息位元结构会由以下4个区段所组成
- 同步段 (Synchronization Segment)
- 传播段 (Propagation Segment)
- 相位缓冲段1 (Phase Buffer Segment 1)
- 相位缓冲段2 (Phase Buffer Segment 2)
每个位元区段由数个单位时间组成(TQ),最少8个最多25个。
计算方式 :
Tpclk = CAN时钟的周期(CAN使用APB1时钟)
- 正常的位时间(Tnbt) = (1+Tbs1 + Tbs2)x Tq
- Tq = (BRP+1) x Tpclk
设CAN时钟频率为Fpclk
- Tq = (BRP+1)/Fpclk
- Tnbt =(1+Tbs1 + Tbs2)x (BRP+1) / Fpclk
由4可以知道CAN输出波特率(Fcan = 1 / Tnbt )为:
Fcan = Fpclk / ( (1+Tbs1 + Tbs2)x (BRP[9:0]+1) )
上图来源: 手册