上一贴中,介绍了STC32G12K128的CAN外设相关寄存器,这一贴介绍CAN的内部寄存器。STC32G12K128有两个CAN外设:CAN1和CAN2,虽然是两个设备,但它们内部的寄存器使用相同的地址。访问时,一定要先设定辅助寄存器中AUXR2中的CANSEL位。CANSEL=0,访问的是CAN1的;CANSEL=1,访问的是CAN2的。
CAN内部寄存器一览表:
1、CAN 模式寄存器(MR)
RM:CAN 模块的 RESET MODE
0:关闭 RESET MODE
1:使能 RESET MODE
LOM:CAN 模块的 LISTEN ONLY MODE
0:关闭 LISTEN ONLY MODE
1:使能 LISTEN ONLY MODE
AFM:CAN 模块的接收滤波选择(参见 ACR 寄存器描述)
0:接受滤波器采用双滤波设置
1:接受滤波器采用单滤波设置
2、CAN 命令寄存器(CMR)
TR:CAN 模块发送请求
0:
1:发起一次帧传输
AT:CAN 模块传输终止
0:
1:终止当前的帧传输
3、CAN 状态寄存器(SR)
RBS:接收 BUFFER 状态
0:接收 BUFFER 无数据帧
1:接收 BUFFER 有数据帧
DSO:接收 FIFO 溢出循环标志
0:接收 FIFO 没有溢出循环产生
1:接收 FIFO 有溢出循环产生
TBS:CAN 模块发送 BUFFER 状态
0:发送 BUFFER 禁止,CPU 不可对 BUFFER 进行写操作
1:发送 BUFFER 空闲,CPU 可对 BUFFER 进行写操作
RS:CAN 模块接收状态
0:CAN 模块接收空闲
1:CAN 模块正在接收数据帧
TS:CAN 模块发送状态
0:CAN 模块发送空闲
1:CAN 模块正在发送数据帧
ES:CAN 模块错误状态
0:CAN 模块错误寄存器值未达到 96
1:CAN 模块至少有一个错误寄存器的值达到或超过了 96
BS:CAN 模块 BUS-OFF 状态
0:CAN 模块不在 BUS-OFF 状态
1:CAN 模块在 BUS-OFF 状态
当 CAN 控制器发生错误的次数超过 255 次,就会触发 BUS-OFF 错误。一般发生 BUS-OFF 的条件是 CAN 总线受周围环境干扰,导致 CAN 发送端发送到总线的数据被 BUS 总线判断为异常,但异常的次数超过 255 次,BUS 总线自动设置为 BUS-OFF 状态,此时总线处于忙的状态,数据无法发送,也无法接收。
4、CAN 中断/应答寄存器(ISR/IACK)
ALI:仲裁丢失中断
0:
1:仲裁丢失,写 1 清零
EWI:错误警告中断
0:
1:当 SR 寄存器中的 ES 或者 BS 值为 1 时,该位置位。写 1 清零。
EPI:CAN 模块被动错误中断
0:
1:当 CAN 错误寄存器操作被动错误计数值时,该位置位。写 1 清零。
RI:CAN 模块接收中断
0:
1:CAN 模块接收 BUFFER 中存在数据帧,用户需要对 RI 写 1,以减少接收信息计数器(RMC)
TI:CAN 模块发送中断
0:
1:CAN 模块数据帧发送完成。用户需要对 TI 写 1,复位发送 BUFFER 的写指针。
BEI:CAN 模块总线错误中断
0:
1:CAN 模块在接收或者发送过程中产生了总线错误
DOI:CAN 模块接收溢出中断
0:
1:CAN 模块接收 FIFO 溢出
5、CAN 中断寄存器(IMR)
ALIM:仲裁丢失中断
0:仲裁丢失中断屏蔽
1:仲裁丢失中断开启
EWIM:错误警告中断
0:错误警告中断屏蔽
1:错误警告中断开启
EPIM:CAN 模块被动错误中断
0:CAN 模块被动错误中断屏蔽
1:CAN 模块被动错误中断开启
RI:CAN 模块接收中断
0:CAN 模块接收中断屏蔽
1:CAN 模块接收中断开启
TI:CAN 模块发送中断
0:CAN 模块发送中断屏蔽
1:CAN 模块发送中断开启
BEI:CAN 模块总线错误中断
0:CAN 模块总线错误中断屏蔽
1:CAN 模块总线错误中断开启
DOI:CAN 模块接收溢出中断
0:CAN 模块接收溢出中断屏蔽
1:CAN 模块接收溢出中断开启
6、CAN 数据帧接收计数器(RMC)
RMC:数据帧接收计数器
7、CAN 总线时钟寄存器 0(BTR0)
BRP :CAN 波特率分频系数
BRP= BTR0[5:0]+1;CAN 模块内部时钟 tq= tCLK*BRP;tCLK = 1/ fXTAL (主频 2 分频)
SJW: :重新同步跳跃宽度
SJW=SJW.1*2+SJW.0
8、CAN 总线时钟寄存器 1(BTR1)
TSG1:同步采样段 1
TSG2:同步采样段 2
SAM:总线电平采样次数
0:总线电平采样 1 次
1:总线电平采样 3 次
CAN 波特率=1/正常时间位
正常时间位=(1+(TSG1+1)+(TSG2+1))*tq
9、CAN 总线数据帧发送缓存(TXBUFn)
发送 BUFFER 包含 4 个寄存器:TXBUF0,TXBUF1,TXBUF2,TXBUF3。
每当 TXBUF3 寄存器被写的时候,BUFFER 指针自动加 1,TXBUF0,TXBUF1,TXBUF2,TXBUF3,被写入 BUFFER。
10、CAN 总线数据帧接收缓存(RXBUFn)
接收 BUFFER 包含 4 个寄存器:RXBUF0,RXBUF1,RXBUF2,RXBUF3。
每当 RXBUF3 寄存器被写的时候,BUFFER 指针自动加 1,RXBUF0,RXBUF1,RXBUF2,RXBUF3,被写入 BUFFER。一帧 CAN 的数据最长是 16 个 BYTE,所以接收一帧数据需要循环读取 RXBUF四次。
CAN 模块的 RXFIFO 是一个 64BYTE 的 FIFO,在数据量为 1 个 BYTE 的时候,最多能存储21 帧数据。数据8 个BYTE的时候,最多能存储 5 帧数据。接收帧的数量可以读取 RMC(RECEIVE MESSAGE COUNTER)寄存器获得。
// 读缓冲区数据的函数例程:
void CanReadFifo(u8 *pdat) {
pdat[0] = CanReadReg(RX_BUF0);
pdat[1] = CanReadReg(RX_BUF1);
pdat[2] = CanReadReg(RX_BUF2);
pdat[3] = CanReadReg(RX_BUF3);
pdat[4] = CanReadReg(RX_BUF0);
pdat[5] = CanReadReg(RX_BUF1);
pdat[6] = CanReadReg(RX_BUF2);
pdat[7] = CanReadReg(RX_BUF3);
pdat[8] = CanReadReg(RX_BUF0);
pdat[9] = CanReadReg(RX_BUF1);
pdat[10] = CanReadReg(RX_BUF2);
pdat[11] = CanReadReg(RX_BUF3);
pdat[12] = CanReadReg(RX_BUF0);
pdat[13] = CanReadReg(RX_BUF1);
pdat[14] = CanReadReg(RX_BUF2);
pdat[15] = CanReadReg(RX_BUF3);
}
CAN 总线验收滤波器
在验收滤波器的帮助下 CAN 控制器能够允许 RXFIFO 只接收同识别码和验收滤波器中预设值相一致的信息验收滤波器通过验收代码寄存器 ACR 和验收屏蔽寄存器 AMR 来定义。
11 、CAN 总线验收代码寄存器(ACRn)
12、CAN 总线验收屏蔽寄存器(AMRn)
滤波的方式有两种,由模式寄存器中的 AFM(MR.0)位选择:单滤波器模式(AFM 位是 1)、双滤波器模式(AFM 位是 0)。
滤波的规则是:每一位验收屏蔽分别对应每一位验收代码,当该位验收屏蔽位为“1”的时候(即设为无关),接收的相应帧 ID 位无论是否和相应的验收代码位相同均会表示为接收;当验收屏蔽位为“0”的时候(即设为相关),只有相应的帧 ID 位和相应的验收代码位值相同的情况才会表示为接收。
只有在所有的位都表示为接收的时候,CAN 控制器才会接收该报文。
(1)单滤波器的配置
这种滤波器配置定义了一个长滤波器(4 字节、32 位),由 4 个验收码寄存器和 4 个验收屏蔽寄存器组成的验收滤波器,滤波器字节和信息字节之间位的对应关系取决于当前接收帧格式。接收 CAN 标准帧单滤波器配置:对于标准帧,11 位标识符、RTR 位、数据场前两个字节参与滤波;对于参与滤波的数据,所有 AMR 为 0 的位所对应的 ACR 位和参与滤波数据的对应位必须相同才算验收通过;如果由于置位 RTR=1 位而没有数据字节,或因为设置相应的数据长度代码而没有或只有一个数据字节信息,报文也会被接收。对于一个成功接收的报文,所有单个位在滤波器中的比较结果都必须为“接受”; 注意 AMR1 和 ACR1 的低四位是不用的,为了和将来的产品兼容,这些位可通过设置 AMR1.3、AMR1.2、AMR1.1 和 AMR1.0 为 1 而定为“不影响”。
(2)双滤波器的配置
这种配置可以定义两个短滤波器,由 4 个 ACR 和 4 个 AMR 构成两个短滤波器。总线上的信息只要通过任意一个滤波器就被接收。滤波器字节和信息字节之间位的对应关系取决于当前接收的帧格式。
接收 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 位在内的整个标准识别码。
13 、CAN 总线错误信息寄存器(ECC)
RXWRN:当 RXERR 大于等于 96 时该位置位。
TXWRN:当 TXERR 大于等于 96 时该位置位。
EDIR:传输错误方向。0:发送时发生错误。1:接收时发生错误。
ACKER:ACK 错误。
FRMER:帧格式错误。
CRCER:CRC 错误。
STFER:位填充错误。
BER:位错误。
14、CAN 总线接收错误计数器(RXERR)
RXERR:计数器值代表当前接收错误计数值。该寄存器只读。当 BUS-OFF 事件发生后,该计数器值由硬件清零。
15、 CAN 总线发送错误计数器(TXERR)
TXERR:发送错误计数寄存器反映了发送错误计数器的当前值,工作模式中,该寄存器只读,硬件复位后寄存器被初始化为 0。当 BUS-OFF 时间发生后错误计数器被初始化为 127 来计算总线定义的最小时间(128 个总线空闲信号)。这段时间里读发送错误计数器将反映出总线关闭恢复的状态信息。
16、 CAN 总线仲裁丢失寄存器(ALC)
ALC:这个寄存器包括了仲裁丢失的位置的信息。当前仲裁丢失中断被处理(应答)之后,该值会在下一次仲裁丢失时更新。具体数值对应下表: