CAN总线控制器SJA1000

1.CAN总线

控制器局域网总线 CAN Controller Area Nerwork 是一种用于实时应用的串行通讯协议总线 它可以使用双绞线来传输信号 是世界上应用最广泛的现场总线之一。CAN协议用于汽车中各种不同元件之间的通信 以此取代昂贵而笨重的配电线束。该协议的健壮性使其用途延伸到其它自动化和工业应用。

CAN总线控制器分为两种 一种是可以直接与MCU连接的控制芯片 如sja1000) 另一种是集成在SOC中适用APB总线接口的CAN IP。

MCU控制的CAN总线系统结构如下所示。
在这里插入图片描述
CAN-bus通信帧共分为数据帧、远程帧、错误帧、过载帧和帧间隔五种类型。数据帧由结构上由7个段组成 其中根据仲裁段ID码长度的不同 分为标准帧 CAN2.0A 和扩展帧 CAN2.0B 。
在这里插入图片描述
在CAN总线上 默认保持高电平 只要有一个节点发出低电平 总线上的电平就变为低电平 只有当所有节点保持为电平时 总线上才会保持为高电平。所以 显性为低电平 隐性为高电平。

帧起始和帧结束用于界定一个数据帧 无论是标准帧还是拓展帧 都有帧起始和帧结束。
在这里插入图片描述

1.1仲裁过程

仲裁有三大规则
1.帧ID值越小 优先级越高。
在这里插入图片描述
2.数据帧优先级比远程帧优先级高。
在这里插入图片描述
3.标准帧优先级比拓展帧高。
在这里插入图片描述

1.2控制段

在这里插入图片描述

1.3数据段

在这里插入图片描述

1.4CRC段

在这里插入图片描述

1.5ACK段

在这里插入图片描述

1.6远程帧

在这里插入图片描述
在这里插入图片描述

2.滤波器设置

CAN总线的滤波器设置就像给总线上的节点设置了一层过滤网 只有符合要求的CAN信息帧才可以通过 其余的一概滤除。

在验收滤波器的帮助下 只有当接收信息中的识别位和验收滤波器预定义的值相等时 CAN 控制器才允许将已接收信息存入RXFIFO。

验收滤波器由验收代码寄存器(ACRn)和验收屏蔽寄存器AMRn 定义 要接收的信息的位模式在验收代码寄存器中定义 相应的验收屏蔽寄存器允许定义某些位为“不影响” 即可为任意值。

在SJA1000复位模式下 设置寄存器CDR.7为“0” 即设置CAN控制器SJA1000工作于BasicCAN模式 CDR.7为1 即Pelican模式。

有两种不同的过滤模式可在模式寄存器中选择MOD.3 AFM。
单滤波器模式 AFM 位是1
双滤波器模式 AFM 位是0。

2.1单滤波器设置

(1)接收CAN标准帧时单滤波器配置

对于标准帧 11位标识符、RTR位、数据场前两个字节参与滤波

对与参与滤波的数据 所有AMR为0的位所对应的ACR位和参与滤波数据的对应位必须相同才算验收通过

如果由于置位RTR 1 位而没有数据字节 或因为设置相应的数据长度代码而没有或只有一个数据字节信息 报文也会被接收。对于一个成功接收的报文 所有单个位在滤波器中的比较结果都必须为“接受”

注意AMR1 和ACR1 的低四位是不用的 为了和将来的产品兼容 这些位可通过设置AMR1.3、AMR1.2 、AMR1.4和AMR1.0 为1 而定为“不影响”。
在这里插入图片描述
举例 如何设置单滤波 接收标识符为0000 1010 010的CAN标准帧

在SJA1000复位模式下 设置寄存器CDR.7为“1” 即设置CAN控制器SJA1000工作于PeliCAN模式。

设置模式寄存器的验收滤波器模式位 AFM 为 选择单滤波器模式

设置验收代码寄存器ACR0 0x0A、ACR1 0x40、ACR2 ACR3 0x00

根据单滤波器时信息帧与滤波器的位对应关系 将需要参与滤波的信息位对应的验收屏蔽寄存器位设置为0 设置AMR0 0x00 AMR1 0x0F、AMR2 AMR3 0XFF

如此设置 SJA1000接收标识符ID.28~ID.18为0000 1010 010的CAN标准帧。

(2)接收CAN扩展帧时单滤波器配置

对于扩展帧 29位标识符和RTR位参与滤波

对与参与滤波的数据 所有AMR为“ ”的位所对应的ACR位和参与滤波数据的对应位必须相同才验收通过滤波

必须注意的是AMR3和ACR3的最低两位是不用的。为了和将来的产品兼容 这些位应该通过置位AMR3.1和AMR3.0为“1”来定为“不影响”。
在这里插入图片描述
举例 如何设置单滤波 接收标识符ID.28~ID.0为0000 1010 0100 1010,0110 1011 1110 1的CAN扩展帧

在SJA1000复位模式下 设置寄存器CDR.7为“1” 即设置CAN控制器SJA1000工作于PeliCAN模式。

设置模式寄存器的验收滤波器模式位 AFM 为 选择单滤波器模式

设置验收代码寄存器ACR0 0x0A、ACR1 0x4A、ACR2 0x6B、ACR3 0XE8

根据单滤波器时信息帧与滤波器的位对应关系 将需要参与滤波的信息位对应的验收屏蔽寄存器位设置为0 设置AMR0 0x00 AMR1 0x00、AMR2 0x00、AMR3 0X03

2.2双滤波器设置

这种配置可以定义两个短滤波器 由 个ACR和 个AMR构成两个短滤波器。总线上的信息只要通过任意一个滤波器就被接收。

滤波器字节和信息字节之间位的对应关系取决于当前接收的帧格式。

(1)接收CAN标准帧时双滤波器配置

如果接收的是标准帧信息 被定义的两个滤波器是不一样的。

第一个滤波器由ACR0、ACR1、AMR0、AMR1以及ACR3、AMR3低4位组成 11位标识符、RTR位和数据场第1字节参与滤波

第二个滤波器由ACR2、AMR2以及ACR3、AMR3高4位组成 11位标识符和RTR位参与滤波。

为了成功接收信息 在所有单个位的比较时 应至少有一个滤波器表示接受。RTR 位置位“1”或数据长度代码是“0” 表示没有数据字节存在 只要从开始到RTR 位的部分都被表示接收 信息就可以通过滤波器1。

如果没有数据字节向滤波器请求过滤 AMR1和AMR3的低4位必须被置为“1” 即“ 不影响”。此时 两个滤波器的识别工作都是验证包括RTR 位在内的整个标准识别码。
在这里插入图片描述
举例 如何设置双滤波 接收标识符ID.28~ID.18为0000 1010 010或ID.28~ID.18为01101011 111 且DATA Byte1 0x55 的两类CAN标准帧

在SJA1000复位模式下 设置寄存器CDR.7为“1” 即设置CAN控制器SJA1000工作于PeliCAN模式。

设置模式寄存器的验收滤波器模式位 AFM 为0 选择双滤波器模式

滤波器1配置为
ACR0 0x0A、ACR1 0x45、ACR3(bit3-bit0) 0x5
AMR0 0x00、AMR1 0x00、AMR3(bit3-bit0) 0x0
滤波器2配置为
ACR2 0x6B、ACR3(bit7-bit4) 0xE;
AMR2 0x00、 AMR3(bit7-bit4) 0x0

(2)接收CAN扩展帧时双滤波器配置

如果接收到扩展帧信息 定义的两个滤波器是相同的。

第一个滤波器由ACR0、ACR1和AMR0、 AMR1构成

第二个滤波器由ACR2、ACR3和AMR2、 AMR3构成

两个滤波器都只比较扩展识别码的前两个字节 即29位标识符中得高16位。

为了能成功接收信息 所有单个位的比较时至少有一个滤波器表示接收。

在这里插入图片描述

举例 如何设置双滤波 接收标识符ID.28~ID.13为0000 1010 0100 1010和ID.28~ID.13为0110 1011 1110 1001的两类CAN扩展帧

在SJA1000复位模式下 设置寄存器CDR.7为“1” 即设置CAN控制器SJA1000工作于PeliCAN模式。

设置模式寄存器的验收滤波器模式位 AFM 为0 选择双滤波器模式

设置验收代码寄存器ACR0 0x0A、ACR1 0x4A、ACR2 0x6B、ACR3 0XE9

根据双滤波器时信息帧与滤波器的位对应关系 将需要参与滤波的信息位对应的验收屏蔽寄存器位设置为0 设置AMR0 0x00 AMR1 0x00、AMR2 0x00、AMR3 0X00

3.初始化设置

在对CAN控制器进行初始化设置时 必须先设为复位模式。

1 置位模式寄存器Bit0位进入复位模式

2 设置时钟分频寄存器选择时钟频率、CAN模式

3 设置验收滤波 设定验证码和屏蔽码

4 设置总线定时器寄存器0、1设定CAN波特率

5 设置输出模式

6 清零模式寄存器Bit0位退出复位模式

7 发送数据时 需要设置CMR寄存器 配置发送请求或者自测试请求 然后将发送数据写入发送buffer 在写入时 需要查看状态寄存器 发送buffer是否为释放状态 如果是在锁定状态写入数据 那么数据会丢失 并没有任何提醒 接收数据时 将数据从接收buffer读取后 需要设置CMR寄存器 释放接收buffer 这样才可以读取后面的数据。

初始化代码如下所示
在这里插入图片描述

参考资料

1.
2.
3.