NXP的MSCAN模块波特率设置
NXP的MSCAN模块支持报文滤波,整个成功接收传输过程是依据message的identifier(ID),ID被设备成功匹配将会产生一个中断请求。
MSCAN节点之间传输的消息帧可以分为四种类型:数据帧,远程帧,错误帧和过载帧,这里主要讨论数据帧的收发。数据帧的传输
有两种格式,分别是仲裁场含有11位ID的标准帧和29位ID的扩展帧;数据帧传输的最大用户数据为8bytes,如下图
MSCAN位率的设置(以NXP FRDM-KE16Z为参考):
MSCAN模块可以根据MSCAN_CANCTL1寄存器的bit6来设置时钟源(f_CANCLK)是使用总线时钟还是外部晶振时钟(8M),如下图,然后配置MSCAN_CANBTR0_BRP
来选择位率预分频。时间份额(Tq)是有MSCAN控制的原子单元,其值计算根据时钟和预分频值得到,即Tq = f_CANCLK / (prescaler value).
MSCAN位时间的计算是通过配置总线定时寄存器MSCAN_CANBTR0和MSCAN_CANBTR1.根据CAN specification,MSCAN的位时间划分为三部分:
SYN_SEG(同步段),Time segment1(相位缓冲段1),Time segment2(相位缓冲段2),由下图可知这里的相位缓冲段1包含CAN SPEC.里的传播段
和相位缓冲段1,一个位时间的大小就由每一段含有Tq的数量决定,则一个位时间的计算为:bit time = (SYNC_SEG + Time Segment1 +
Time Segment2) * (prescaler value)/f_CANCLK.
其中SYNC_SEG是固定的一个时间份额,信号边沿的触发应该发生在此阶段;根据CAN标准Time segment1包含PROP_SEG(Propagation Time Segment)
和PHASE_SEG1(Phase Buffer Segment1),Time segment1(MSCAN_CANBTR1_TSEG1)设置范围的大小为4到16个时间份额(Tq);Time segment2即
相位缓冲段2 PHASE_SEG2(Phase Buffer Segment2),该段MSCAN_CANBTR1_TSEG2设置的范围为2到8个时间份额。所以位率的计算由位时间得到:
bit rate = 1/bit time = f_CANCLK/((prescaler value)*(1+Time Segment1+Time Segment2)),由此可知通过配置合适的MSCAN_CANCTL1_CLKSRC,
MSCAN_CANBTR0_BRP和MSCAN_CANBTR1_TSEG1,MSCAN_CANBTR1_TSEG2来得到期望的位率。
Synchronization Jump Width(SJW)同步跳边沿定义了一个位里时间份额变化的最大量,由于每个单元都操作着自己的时钟,微小的时钟误差是
会不断累积,所以通过增加或减小相位缓冲段的大小来重新同步CAN总线上的数据传输,来达到容错的目的,SJW设置的越大,容错能力就会增加,
但相应的传输速率会下降,根据Bosch CAN2.0A/B手册,SJW可调整的范围为1到4个时间份额。
Example:假设设置位率(波特率)Baudrate = 1Mbps, Osc = 8M, 根据计算公式有 1 = 8 / (BRP + 1)(1+MSCAN_CANBTR1_TSEG1+MSCAN_CANBTR1_TSEG2)
为了保证相位缓冲段1和相位缓冲段2的参考值为整数,这里的BRP为0,1,3,7;这里选择BRP的值为0,可以得到一个位时间里有8个最小时间份额;
参考手册相位缓冲段1,相位缓冲段2,同步跳变宽度值的分配,结合上述公式可以分别计算Baudrate = 500kbps,250kbps,125kbps的位时间参数值
如下表:
priDiv sJumpwidth timeSeg1 timeSeg2 samp
1M 0 0 3 2 0
500K 1 0 3 2 0
250K 3 0 3 2 0
3 0 4 1 0
1 0 10 3 0
1 0 9 4 0
1 0 8 5 0
1 0 7 6 0
125K 7 0 3 2 0
7 0 4 1 0
3 0 10 3 0
3 0 9 4 0
3 0 8 5 0
3 0 7 6 0
注:这里的预分频值prescaler value = BRP + 1,BRP为寄存器MSCAN_CANBTR0的bit0~bit5,Time Segment1=1+MSCAN_CANBTR1_TSEG1,
Time Segment2 = 1+MSCAN_CANBTR1_TSEG2;
Bosch CAN2.0A/B遵从的位时间段参数设置参考表:
Time segment 1 TSEG1 Time segment 2 TSEG2 Synchronization jump width SJW
5..10 4..9 2 1 1..2 0..1
4..11 3..10 3 2 1..3 0..2
5..12 4..11 4 3 1..4 0..3
6..13 5..12 5 4 1..4 0..3
7..14 6..13 6 5 1..4 0..3
8..15 7..14 7 6 1..4 0..3
9..16 8..15 8 7 1..4 0..3