帧编码
帧中的位采用 NRZ (Non-return-to-zero 非归零)方法编码。相同带宽,NRZ编码信息量更大。
CAN用双绞线的方式传输,两条线压差2V(CAN_H是3.5V左右,CAN_L是1.5V左右)为显性,表示逻辑0;两条线压差0V(都是2.5V左右)为隐性,表示逻辑1。
我很长一段时间把显性和隐性搞混,直到记住“显灵”这个词,显性是0.
为了减少CAN信号错误,专家设计了位填充技术。CAN消息帧中,帧起始、仲裁场、控制场、数据场和CRC序列均用位填充的方法编码。
当CAN发送器检测到5个相同的位后,插入一个相反位,产生跳变沿,用来同步,以减少检测错误。
填充位会被当成总线数据位处理,但接收器接收时会自动剔除填充位,这样要传输的信息不会出现错误。
位的传输顺序
数据帧和远程帧里,从SOF开始,一个域接一个域地传输。在一个域内,字节传输顺序是从MSB到LSB。在一个字节内,位传输顺序是从bit 7到bit 0.
位时间
位时间是一个位的持续时间。我们是看表来确定时间,CAN总线的节点是通过时钟发生器确定,而常用的时钟发生器是石英晶振。石英晶振的频率通常是波特率的整数倍。
上一篇提到波特率的时候,其单位是bit/s,则一位的时间=1/波特率。比如常用的500kbit/s,位时间是2us(通常要求误差在±0.004us内)。
一个位时间可以分成很多段的时间量(Time quantum,简写为TQ)。前面说到CAN的时间是通过石英晶振的频率确定,那晶振也是有很多一小段一小段的时间周期。可以理解为,若干个石英晶振的时间段组成了一个TQ,若干个TQ组成了一个位的时间。就像六十秒组成一分钟,六十分钟组成一小时。
和一分钟固定等于六十秒不同,一个位可以分为1~32个TQ,具体是多少个可以由使用者规定。
一小时我们有时候分为前一刻钟、前半个小时和后半个小时,一个位也可以分为很几段。这个几是固定的,是4,如下图。
一个位时间可以分为:
同步段(Sync_Seg):1个TQ。同步段内有一个跳变沿,用来使总线上各个ECU同步,就跟港片里飞虎队行动前都要对表一样。
传播段(Prop_Seg):用于补偿各总线上各ECU之间的物理传输延迟时间(信号在总线上的传播延迟和ECU内部延迟)。传播段的长度不同的ECU不完全一致,一般在1~8个TQ。
相位缓冲段1(Phase_Seg 1)、相位缓冲段2(Phase_Seg 2):用于补偿跳变沿的相位误差,就是ECU间的晶振误差。这两段可以被再同步处理延长或缩短。通过再同步,可以延长相位缓冲段1,或缩短相位缓冲段2。
一个位的采样点在相位缓冲段1的终点,通常是位时间的75%左右。
标准原文还详细说明了延时后,如何处理才能使仲裁顺利,感兴趣可以自己看看。
bus off
一个ECU根据错误计数不同,可以处于以下三种状态之一:错误激活(error-active)、错误认可(error-passive)或离线(bus-off)。
(当ECU进入bus off后,有快恢复和慢恢复两种策略。两种策略都会被ECU执行,先快后慢,具体策略由厂家决定。)
-
编码器
+关注
关注
45文章
3639浏览量
134434 -
CAN总线
+关注
关注
145文章
1950浏览量
130732 -
时钟发生器
+关注
关注
1文章
200浏览量
67276 -
CRC校验
+关注
关注
0文章
84浏览量
15207 -
发送器
+关注
关注
1文章
259浏览量
26816
发布评论请先 登录
相关推荐
评论