11.4.2. 功能描述
11.4.2.1. 典型应用
CAN典型应用如 图 11.33 所示:
11.4.2.2. 运行模式
控制器包含5种运行模式,由模式寄存器(CAN_MODE)定义设置。
复位模式:Reset Mode,进入复位模式,控制器离线不参与总线任何活动,可修改CAN控制器的各种参数配置。退出复位模式后,控制器需等待11 个连续隐性位出现(等效于总线空闲),才能正常接收和发送报文。
正常模式: Normal Mode,CAN 控制器可以发送和接收包含错误信号在内的报文。
自测模式:Self-Test Mode, 与正常模式相同,但在该模式下,CAN 控制器发送报文时,即使没有接收到应答,也不会产生应答错误。通常在控制器自测时使用该模式。
只听模式: Listen Only Mode,CAN 控制器可以接收报文,但在CAN 总线上保持完全被动。因此,CAN 控制器将无法发送任何报文、应答或错误信号,错误计数将保持冻结状态。该模式用于CAN 总线监控。
休眠模式:Sleep Mode,无总线活动及无中断发生,可进入低功耗休眠模式,该模式下时钟停止。SLEEP_MOD为0或总线有信号输入时唤醒,产生唤醒中断。
11.4.2.3. 位时序
为了实现位同步,每个正常位时间划分为几个不重叠时间的片段,包括同步段SS,传播段PS,相位缓冲段PBS1,相位缓冲段PBS2,一个完整的位由8~25个时间定额Tq组成。
如 图 11.34 所示,将传播段PS和相位缓冲段PBS1合并形成新的时间段Ts1。
在复位模式下,配置总线时序0寄存器(CAN_BTR0)和总线时序1寄存器(CAN_BTR1)中的BRP、SJW、TS1、TS2、SAM等参数,决定CAN的波特率。
SJW具体作用是增大或减小CAN波特率的容许偏差量,其大小与波特率值没有太大关系,可理解为波特率精度调节,SJW值越大则总线获得更宽波特率容忍度。
位时序各参数计算关系如下:
时间定额Tq = 2*(BRP[5:0]+1)*Tpclk,其中Tpclk为APB时钟(通常为24MHz)周期。
位时间Tbit = [1+ (TS1+1) + (TS2+1)]*Tq;
波特率Baud = 1/Tbit;
采样点= [1 + (TS1+1)]/ [1+ (TS1+1) + (TS2+1)]。
举例:假设单次采样SAM为0,且SJW=2,TS1=8,TS2=1,BRP=0,则波特率为24M/[2*(0+1)*(1+9+2)]=1Mbps,采样点为(1+9)/ (1+9+2)=83%。建议选取规则:TS2>=SJW;BRP尽量小、SJW尽量大;采样点选取范围75%~85%之间;尽量采用单次采样。
11.4.2.4. 通信报文
CAN通信报文类型包含数据帧、远程帧、错误帧、过载帧、间隔帧这5种类型。
数据/远程帧 |
描述 |
---|---|
SOF |
帧起始,1bit,用于同步总线上节点的单个显性位。
|
ID-A |
标识符A,11bit,对应标准格式中的11位标识符(ID10~ ID0),或扩展格式中29位
标识符的前11bit(ID28~ ID18)
|
RTR |
远程发送请求位,1bit,显示当前报文是数据帧(显性0)还是远程帧(隐性1)。
这意味着,当某个数据帧和远程帧有相同标识符时,数据帧始终优先于远程帧仲裁。
|
SRTR |
代替远程发送请求位,1bit,在扩展格式中以替代标准格式相同位置的RTR 位
|
IDE |
标识符扩展位,1bit,显示当前报文是标准格式(显性0)还是扩展格式(隐性1)。
这意味着,当某标准帧和扩展帧有相同基标识符时,标准帧将始终优先于扩展帧仲裁。
|
ID-B |
标识符B,18bit,扩展格式中29位标识符的剩余18bit(ID17 ~ ID0)
|
R1 |
保留位,始终是显性位
|
R0 |
保留位,始终是显性位
|
DLC |
数据长度代码, 4bit,包含0 ~ 8 中任一数值。数据帧用于表示包含的数据字节数量。
远程帧用于表示从其他节点请求的数据字节数量。
|
数据字节 |
表示数据帧的数据负载量,该字节数量应与DLC的值匹配。首先发送数据字节0,
各数据字节优先发送最高有效位。
|
CRC |
CRC序列是一个15-bit的循环冗余校验码。具体实现方式为:被除多项式的系数由
SOF、仲裁场、控制场、数据场(若存在)及15位(最低系数)0组成的未经填充的
位流给定,而生成多项式为X15+X14+X10+X8+X7+X4+X3+X0,被除多项式被生成
多项式除(按模2计算),余数即为将要发送到总线上的CRC序列。发送节点和
接收节点均采用相同方法生成CRC校验码,并与发送节点送出的CRC校验码进行比较,
若出错,控制器依据仲裁原则及受损报文优先原则对已损坏报文自动重发。
|
CRC分界符 |
分界符,1bit隐性位
|
ASK槽 |
应答槽,1bit,用于接收节点,表示是否已成功接收数据帧或远程帧。发送节点将在
应答槽中发送一个隐性位,若接收到的帧无错误,则接收节点用一个显性位以示应答。
|
ASK分界符 |
分界符,1bit隐性位
|
EOF |
帧结束,7bit隐性位,标志着数据帧或远程帧的结束。
|
11.4.2.5. 中断管理
控制器提供8种中断包括总线错误中断、仲裁丢失中断、被动错误中断、唤醒中断、数据溢出中断、错误报警中断、发送中断、接收中断。
由中断寄存器(CAN_INTR)定义,通过设置中断使能寄存器(CAN_INTEN)中相应使能位,每个中断源都可以单独允许和禁用。
当有一个或多个中断触发,控制器IRQ有效,当所有中断位都被清除,控制器IRQ失效。
中断寄存器被读取后,除接收中断外,其中的中断位将自动清除。
接收中断直到通过RXB_REL 指令位清除所有接收报文后,才能被清除,否则会影响接收缓冲状态RXB_STAT。
接收中断RX_INT:当接收FIFO 中有待读取报文(接收数据计数寄存器(CAN_RXC)中RXC > 0)时触发此中断。计数的报文数量包括有效报文和溢出报文。直到通过RXB_REL 指令位清除所有挂起接收报文后,接收中断才会失效。
发送中断TX_INT:当发送缓冲器空闲,将其他报文加载到缓冲器中等待发送时,都会触发此中断。
错误报警中断ERRW_INT:状态寄存器(CAN_STAT)中ERR_STAT或BUS_STAT的位值发生改变(由0变1或由1变0)都会触发此中断。触发时状态值可分以下几种:
ERR_STAT = 0 与BUS_STAT = 0:如果控制器处于主动错误状态,则表示TEC 和REC 的值都返回ERRWT 所设阈值之下;如果控制器此前处于总线恢复状态,则表示此时总线恢复已成功完成。
ERR_STAT = 1 与BUS_STAT = 0:表示TEC 或REC 数值已超过ERRWT所设阈值。
ERR_STAT = 1 与BUS_STAT = 1:表示控制器已进入离线状态(TEC> =255)。
ERR_STAT = 0 与BUS_STAT = 1:表示总线恢复期间,控制器TEC 数值已低于ERRWT所设阈值。
仲裁丢失中断ARBLOST_INT :控制器发送报文并且丢失仲裁时触发此中断。丢失仲裁位置将被捕获记录在状态寄存器(CAN_STAT)的ARBLOST_CAP中,状态被清除之前(通过CPU 的读取),将不会再记录新的仲裁丢失位置。
总线错误中断ERRB_INT:控制器在总线上检测到错误时触发此中断。错误类型和错误位置都将被捕获记录在状态寄存器(CAN_STAT)的ERR_TYPE和ERR_CODE中。状态被清除之前(通过CPU 的读取),将不会再记录新的总线错误信息。
11.4.2.6. 数据缓冲器
下表描述了数据缓冲寄存器布局。发送和接收缓冲寄存器的访问地址范围相同(0x40~0x70),且只有当控制器处于非复位模式时才可访问。
寄存器 |
偏移地址 |
标准格式内容 |
扩展格式内容 |
---|---|---|---|
CAN_BUF0 |
0x40 |
TX/RX 帧信息 |
TX/RX 帧信息 |
CAN_BUF1 |
0x44 |
TX/RX 标识符1 |
TX/RX 标识符1 |
CAN_BUF2 |
0x48 |
TX/RX 标识符2 |
TX/RX 标识符2 |
CAN_BUF3 |
0x4C |
TX/RX 数据1 |
TX/RX 标识符3 |
CAN_BUF4 |
0x50 |
TX/RX 数据2 |
TX/RX 标识符4 |
CAN_BUF5 |
0x54 |
TX/RX 数据3 |
TX/RX 数据1 |
CAN_BUF6 |
0x58 |
TX/RX 数据4 |
TX/RX 数据2 |
CAN_BUF7 |
0x5C |
TX/RX 数据5 |
TX/RX 数据3 |
CAN_BUF8 |
0x60 |
TX/RX 数据6 |
TX/RX 数据4 |
CAN_BUF9 |
0x64 |
TX/RX 数据7 |
TX/RX 数据5 |
CAN_BUF10 |
0x68 |
TX/RX 数据8 |
TX/RX 数据6 |
CAN_BUF11 |
0x6C |
保留 |
TX/RX 数据7 |
CAN_BUF12 |
0x70 |
保留 |
TX/RX 数据8 |
发送缓冲寄存器:CPU 的写入操作访问,配置待发送报文,指定报文的帧类型、帧格式、帧标识符和数据。CPU通过控制寄存器(CAN_MCR)配置发送报文模式:
正常报文发送,需将TX_REQ置1。
自发自收,需将SELF_REQ 置1。
单次发送,需将TX_REQ 和ABORT_REQ同时置1。
接收缓冲寄存器:CPU 的读取操作访问,接收缓冲寄存器映射到缓冲FIFO 中的第一条报文,获取第一条报文的帧类型、帧格式、帧标识符和数据。读取完接收缓冲寄存器中的报文后,CPU 通过控制寄存器(CAN_MCR)中的RXB_REL置1来释放接收缓冲寄存器,若接收FIFO 中仍有待处理的报文,按照接收报文的先后次序将最早接收到的报文映射到接收缓冲寄存器中。
缓冲FIFO: 是一个64字节大小的内部缓冲器,以先进先出原则存储接收到的报文。接收缓冲寄存器为FIFO中可访问窗口,偏移地址0x40~0x70,将被映射到FIFO 中第一条报文,一条报文可在FIFO 中占3 ~ 13字节空间,其中字节序与接收缓冲寄存器相同。当控制器接收到一条报文时,接收数据计数器RXC增加1,最大值为64。如果FIFO中有足够空间,报文内容将被写入到FIFO 中。首先,CPU读取接收缓冲寄存器中的报文后,通过将RXB_REL置1,释放FIFO 中第一条报文所占的空间, RXC将减小1。然后,接收缓冲寄存器将映射FIFO 中的下一条报文。
FIFO数据溢出:在任何情况下,FIFO 中可以存储的报文数量取决于各条报文的长度,当FIFO 中没有足够空间完整地存储新的报文,控制器会产生数据溢出,通过状态位或数据溢出中断反馈给CPU。FIFO在内部将溢出报文标记为无效,后续接收到的溢出报文仍然将增加RXC 到最大值64。为了清除FIFO 中的溢出报文,应重复调用RXB_REL,直到RXC为0。这样可以读取接收FIFO 中的所有有效报文,并清除所有溢出报文。
11.4.2.7. 接收过滤器
接收过滤器,是一个可编程的报文过滤单元,允许控制器根据报文的标识符、帧类型、第一个数据字节接收或拒绝该报文,由4个接收代码寄存器(CAN_RXCODE)和4个接收屏蔽寄存器(CAN_RXMASK)定义组成。
如 图 11.39 所示,每条报文中的位必须匹配RXCODE 值所指定的模式或者被RXMASK值屏蔽,才能使该报文通过过滤并存储到接收FIFO中。
接收代码寄存器、接收屏蔽寄存器,分别与缓冲0~3寄存器(偏移地址0x40~0x4C)、缓冲4~7寄存器(偏移地址0x50~5C)地址空间相同,所以只有控制器在复位模式时,才能访问这两个寄存器。
单过滤模式:在模式寄存器(CAN_MODE)中将FILTER_SEL设置为1启动单过滤模式。根据RXCODE / RXMASK的值定义单个过滤器,其定义及过滤报文格式如图1-11所示。
双过滤模式:在模式寄存器(CAN_MODE)中将FILTER_SEL设置为0启动双过滤模式。根据RXCODE / RXMASK的值将定义2个过滤器,分别为过滤器0和过滤器1,其标准格式和扩展格式下过滤报文定义如图1-12和图1-13所示。双过滤模式下,如果报文通过这2个滤波器中至少一个,则表示该报文成功通过过滤。
11.4.2.8. 错误管理
错误计数包含发送错误计数TEC和接收错误计数REC,错误计数将决定CAN控制器当前的错误状态(如主动错误、被动错误、离线)。
除了错误状态外,控制器还提供错误报警阈值ERRWT功能,这个功能可在控制器进入被动错误状态前,提醒用户当前发生的严重总线错误。
控制器当前的错误状态通过TEC、REC、ERR_STAT 、BUS _STAT和ERRWT体现,这些数值和状态位的变化将触发中断,从而提醒用户当前的错误状态变化(参考中断管理)。
如 图 11.43 所示为错误状态、计数数值、状态位以及相关中断之间的关系。
错误报警阈值ERRWT将作为报警功能提示当前发生的总线错误,且在控制器进入被动错误状态之前被触发。在复位模式下,ERRWT数值可在错误报警阈值寄存器(CAN_ERRWT)中进行配置。当TEC和/或REC数值大于等于ERRWT时,ERR_STAT 被置1。当TEC 和REC 数值都小于ERRWT时, ERR_STAT被复位0。只要ERR_STAT或BUS_STAT位值发生变化,便会触发错误报警中断ERRW_INT。
当TEC和/或REC数值大于127 时,节点进入被动错误状态。当TEC和REC数值都小于等于127时,节点重新变为主动错误状态。节点在主动错误和被动错误状态之间切换时,都将触发被动错误中断ERRP_INT。
当TEC 数值大于255 时,节点进入总线关闭离线状态。此时,控制器将REC数值置为0、TEC数值置为127、BUS_STAT位置1、产生错误报警中断ERRW_INT、控制器进入复位模式。
为了返回主动错误状态,必须进行离线恢复。首先需要退出复位模式,进入正常操作模式;然后要求节点在总线上检测到128 次11 个连续隐性位。每一次检测到11 个连续隐性位时,TEC 数值都将减1,当离线恢复完成后(TEC 数值从127 减小到0),BUS_STAT位复位为0,从而触发错误报警中断ERRW_INT。
11.4.2.9. 错误捕获
错误捕获功能允许控制器以错误代码的形式,记录总线错误类型和错误位置。
当检测到一个总线错误时,总线错误中断ERRB_INT将被触发,相应的错误代码将记录在状态寄存器(CAN_STAT)的ERR_CODE中。
在当前错误代码被读取前,后续的总线错误中断触发时,将不会再记录。
11.4.2.10. 仲裁丢失捕获
仲裁丢失捕捉功能允许控制器记录仲裁丢失的bit位置。
当控制器丢失仲裁时,所丢失bit位置将被记录在状态寄存器(CAN_STAT)的ARBLOST_CAP中,同时触发仲裁丢失中断ARBLOST_INT。
在当前仲裁丢失捕获bit位置被读取前,后续的仲裁丢失中断触发时,将不会再记录。