一.说明
1.开发环境:Vivado;CAN计算机/CAN盒
2.标准和规范:本项目使用500kbps速率,使用 ISO11898 标准。《CAN Specification V2.0B》,标准号:ISO11898(125kbps-1Mbps 的高速场合)/ISO11519(125kbps 以下的低速场合)。
3.约定:默认采用高字节在前、低字节在后的大端数据传输方式
二.实战
总流程分为三步骤:初始化配置寄存器、中断触发读取缓存数据、写指令发送缓存数据
1.初始化(配置方法、顺序不唯一)
标准帧 SFF
需要初始化9个寄存器:
(1)控制寄存器 CR:写入0x01,进入复位模式
(2)时钟分频寄存器 CDR:写入0x40,BasicCan模式
(3)总线定时寄存器0 BTR0:写入0x00,设置波特率
(4)总线定时寄存器1 BTR1:写入0x1C,设置波特率
(5)控制寄存器 CR:写入0x03,开启中断使能等
(6)输出控制寄存器 OCR:写入0x1A,配置输入/输出控制逻辑
扩展帧 EFF
需要初始化15个寄存器:
(1)模式寄存器MOD
2.发送部分
3.接收部分
三.经验
仅描述作者的个人理解,专业知识可查阅官方资料
-
标准帧和扩展帧区别
识别码(ID)长短区别,标准帧2个字节,高11位有效,扩展帧4个字节,高29位有效;
寄存器区别,如标准帧的控制(CR)寄存器相当于扩展帧的模式(MOD)寄存器+中断使能(IER)寄存器 -
BasicCan模式和PeliCan模式区别
BasicCan模式只适用于标准帧,PeliCan模式都适用,所以如果使用扩展帧格式传输,则必须用PeliCan模式 -
总线仲裁
看两字节的识别码(ID)越小优先级越高 -
设置滤波器
滤波器就是不接收指定的识别码(ID),通过ACR寄存器是需要滤除的ID对应位,而AMR寄存器值可以屏蔽滤波器对应位,否定之否定 -
配置can总线波特率
16M晶振下:
BTR0_INI_VAL=b1100_0000,BTR1_INI_VAL=b0101_1000
其中,
tSCL = 2 * (BTR0_INI_VAL[5:0]+1) / 16M = 2/16M
tSYNC = tSCL = 2/16M
tTSEG1 = tSCL * (BTR1_INI_VAL[3:0]+1) = 18/16M
tTSEG2 = tSCL * (BTR1_INI_VAL[6:4]+1) = 12/16M
所以,波特率 = 1 / (tSYNC+tTSEG1+tTSEG2) = 16M/32 = 500kbps
但是,配置不唯一,例如BTR1_INI_VAL=0x1C,
tTSEG1=26/16M,tTSEG2=4/16M,同样是500kbps
最后,若要求SJW设置为最大容许值,则 BTR0_INI_VAL[7:6] = b11 -
控制sja1000读写的时钟是否也要匹配晶振的16M?
实测不需要,但还是有一点疑问。猜测sja1000的接收、发送缓冲区是异步读写的,异步fifo有两个时钟,但是sja1000只知道它自己的工作时钟,另一个是如何知道的
sja1000的时钟频率最大是24MHz -
中断标志位持续时间
微控制器的任何读访问将清除中断位,否则一直中断,兼容低时钟域的情况