"); //-->
CAN(Controller Area Network)总线最早由德国 BOSCH公司提出,主要用于汽车内部测量与控制中心之间的数据通信。由于其良好的性能,在世界范围内广泛应用于其他领域当中,如工业自动化、汽车电子、楼宇建筑、电梯网络、电力通讯和安防消防等诸多领域,并取逐渐成为这些行业的主要通讯手段。 Can控制器器只需要进行少量的设置就可以进行通信,其中较难设置的部分就是通信波特率的计算。CAN总线能够在一定的范围内容忍总线上CAN节点的通信波特率的偏差,这种机能使得CAN总线有很强的容错性,同时也降低了对每个节点的振荡器精度。实际上,CAN总线的波特率是一个范围。假设定义的波特率是250KB/S,但是实际上根据对寄存器的设置,实际的波特率可能为200~300KB/S(具体值取决于寄存器的设置)。
CAN波特率设置时需要计算几个参数,这些参数共同决定波特率大小,由于计算比较复杂,希望有一个简易步骤,本人经过研究,找到一个简易办法,现贴出来分享,不对的地方请留言指正。需要说明的是,本人使用的can控制器是AT89C51CC03单片机中的can
首先,确定一下各项参数的取值范围:
参数 范围 编程值 说明
BRP [1..64] 0-63 定义时间量子(时间份额)的长度tq
Sync_Seg 1 tq 固定长度,总线输入与系统时钟同步
Prog_Seg [1..8]tq 0-7 补偿物理延时时间
Phase_Seg1 [1..8]tq 0-7 可通过同步暂时延长
Phase_Seg2 [1..8]tq 0-7 可通过同步暂时缩短
TSJW [1..4]tq 0-3 不能比任何一相位缓冲段长
以上是参数的取值范围,编程值是实际往寄存器里写的值,为实际取值减1。下面说一下步骤:
1、首先计算CAN时钟和波特率的比值;
2、根据比值确定预分频器的分频值BRP,计算时间量子的数目,这个数值范围是8-25;
3、将时间量子数减1(去掉Sync_Seg)后在Prog_Seg Phase_Seg1 Phase_Seg2三个参数中分配;
4、Prog_Seg和整个线路的时延有关,一般不太好确定,可以按下面的原则进行分配:
Prog_Seg<=Phase_Seg1<=Phase_Seg2 ;
Phase_Seg1=Phase_Seg2 或者 Phase_Seg1+1=Phase_Seg2;
5、SJW取Phase_Seg1和4中小的那个。
估计上面叙说不太好理解,下面举例说明:
假定晶振是12M,CAN时钟为6M(不同单面机,CAN时钟和晶振的关系不一样,BRP的取值范围不同单单片机也不一定相同,参看单片机说明)
1、500K波特率
FCAN/CAN baudrate = 6 MHz/500 kHz = 12,在8-25范围,所以BRP=1,TQ数目=12/1=12
Prog_Seg Phase_Seg1 Phase_Seg2分别等于3、4、4
寄存器编程值为(上述值减1):
BRP=0,SJW=3,PRS=2,PHS1=3,PHS2=3
2、100K波特率
FCAN/CAN baudrate = 6 MHz/100 kHz = 60,取BRP=6,TQ数目=60/6=10
Prog_Seg Phase_Seg1 Phase_Seg2分别等于2、3、4
寄存器编程值为(上述值减1):
BRP=5,SJW=2,PRS=1,PHS1=2,PHS2=2
3、10K波特率
FCAN/CAN baudrate = 6 MHz/100 kHz = 600,取BRP=60,TQ数目=600/60=10
Prog_Seg Phase_Seg1 Phase_Seg2分别等于2、3、4
寄存器编程值为(上述值减1):
BRP=59,SJW=2,PRS=1,PHS1=2,PHS2=2
4、5K波特率
FCAN/CAN baudrate = 6 MHz/5 kHz = 1200,取BRP=60,TQ数目=1200/60=20
Prog_Seg Phase_Seg1 Phase_Seg2分别等于6、6、7
寄存器编程值为(上述值减1):
BRP=59,SJW=3,PRS=5,PHS1=5,PHS2=6
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。