CAN协议特点:
- 在总线空闲时,所有节点均可发送信息。如果出现两个及以上节点同时开始发送信息时,总线会根据标识符(Identifier以下称为ID)进行仲裁,ID越小则优先级高,则仲裁优胜,仲裁优胜的节点继续发送,仲裁失利的节点立即转入接收状态。需注意,ID并不是表示节点地址,而是指示所发送的报文的优先级。
- 如上所述,与CAN总线的各节点没有类似于“地址”的信息。因此在总线上增减节点时,连接在总线上的其它节点的软硬件设计均不受影响。
- CAN协议具有错误检测、错误通知、故障封闭和错误恢复功能。CAN总线上的任意节点均可检测错误(错误检测);检测到错误后向总线发送错误帧以通知其他节点(错误通知);同时每个节点内部有一个错误计数功能,每次检测到错误之后,错误计数值累加,当某节点持续错误导致计数连续累加,直到大于256后,此故障节点从总线上断开,避免影响其他节点(故障封闭)。且发送节点如果在发送信息的过程中检测到错误,待错误结束后会自动重发此信息直到成功发送(错误恢复)。
- 最高1Mbps(距离小于40m),最远可达10km(速率低于5Kbps)。
- CAN总线是可同时连接多个节点。节点数量理论上是没有限制的。但实际上节点数量受总线时间延迟及电气负载的限制。降低通信速度,可连接的节点数增加;提高通信速度,则可连接的节点数减少。
正是因为CAN协议的这些特点,使得CAN特别适合工业过程监控设备的互连,因此,越来越受到工业界的重视,并已公认为最有前途的现场总线之一。CAN协议经过ISO标准化后有两个标准:ISO11898标准和ISO11519-2标准。其中ISO11898是针对通信速率为125Kbps~1Mbps的高速通信标准,而ISO11519-2是针对通信速率为125Kbps以下的低速通信标准。本文例程使用的是1Mbps的通信速率,使用的是ISO11898标准。
CAN协议介绍
本章主要介绍CAN的网络拓扑结构、总线物理层特性、帧类型、帧结构、位填充机制、位格式、同步机制、仲裁机制、错误处理机制等。另外还有CAN协议的更多细节请参考BOSCH CAN协议,本文不再详述。
CAN网络拓扑结构
如下图1:CAN总线由两条差分线CANH和CANL组成,各个节点通过较短的支线接入CAN总线。各节点从通信协议而言是没有主从和地址区分的,每个节点均可以平等的收发数据。另外,在CAN总线的两端各有一个120Ω的终端电阻,来做阻抗匹配,以减少回波反射。
CAN总线物理层特性
如下图2:显性电平对应逻辑“0”,CANH和CANL压差2.5V左右。而隐性电平对应逻辑“1”,CANH和CANL压差为0V。在总线上,显性电平具有优先权,只要有一个节点输出显性电平,总线上即为显性电平。而隐形电平则具有包容的意味,只有所有的节点都输出隐性电平,总线上才为隐性电平。
帧类型
如下表1,CAN包含了以下5种帧类型。其中数据帧和远程帧由用户控制收发;错误帧、过载帧和间隔帧是CAN总线上各节点硬件根据对应状态发送,用户不能也无需控制。
如下图3,包含了各类型帧结构示意。
本文仅对标准数据帧进行详细介绍,其他帧类型可参考图3与标准数据帧进行对比理解。
一帧标准数据帧包含如下部分:
帧起始:为1bit显性位。由于CAN总线空闲时是隐性电平,帧起始的显性位用于提示总线上的节点“一帧信息传输开始了”。
仲裁段:表示该帧优先级的段,包含标识符和帧类型(数据/远程帧)。
控制段:表示数据的字节数、标识符类型(标准/扩展标识符)及保留位的段。
数据段:数据,一帧可发送0~8个字节的数据(数据长度根据控制段的DLC决定)。
CRC段:发送节点将CRC计算区域(不包含填充位)进行CRC计算后放入CRC段发送。接收节点也对CRC计算区域进行CRC计算,并与收到的CRC域进行对比,若CRC对比结果有误则向总线发送错误帧,若对比结果正确则随后发送应答。
ACK段:含应答位(ACK SLOT)和应答间隔符(ACK DELIMITER)。发送节点在ACK段均发送隐性电平;接收节点如果在接收过程中没有检测到错误,则在应答位输出1bit显性电平,以通知发送节点“这帧数据被正确的接收了”。
帧结束:表示数据帧结束的段,为7bit隐性电平。
位填充
由于CAN总线只有CANH/CANL两条差分线,没有CLK线来做同步,所以CAN是直接通过数据流中间的跳变沿来做同步的(参考下文同步机制)。而为了避免数据流中出现大段没有跳变沿的情况,CAN加入了“位填充”机制。
即发送器只要检测到位流里有5个连续相同值的位,便自动在位流里插入一相反电平的填充位。例如,原始数据流为“0000000111110001…”,经过位填充后实际输出到CAN总线的数据流为“000001001111100001…”,加下划线的位即为填充位。
位填充的范围为帧起始(SOF)~CRC域(不含CRC间隔符),参考上图4。
位格式
AT32的CAN一个bit可分为3段:
- 位段1(BIT SEGMENT 1),包括CAN标准里的PROP_SEG和PHASE_SEG1,记为BSEG1。
- 位段2(BIT SEGMENT 2),即CAN标准里的PHASE_SEG2,记为BSEG2。
这些段又由Time Quantum(以下称为Tq)的最小时间单位构成。
1位分为3个段,每个段又由若干个Tq构成,这称为位时序。
1位由多少个Tq构成、每个段又由多少个Tq构成等,可以任意设定位时序。用户通过设定位时序和Tq长度来设定CAN的波特率和采样点。关于波特率和采样点设置,后文详细介绍。
各段作用及AT32的CAN可配置的Tq数见下表2:
如下图5,同步段、位段1和位段2组成一个bit。BSEG1和BSEG2段交界处为采样点,即接收节点采样的时间点。
同步机制
硬同步(HARD SYHCHRONIZATION):
硬同步后,内部的位时间从同步段重新开始。因此,硬同步强迫由硬同步引起的沿处于重新开始的位时间同步段之内。即下图6的理想跳变沿情况。
重新同步跳转宽度(RESYHCHRONIZATION JUMP WIDTH):
重新同步的结果,使位段1增长,或使位段2缩短。位段增长或缩短的数量有一个上限,此上限由重新同步跳转宽度给定。重新同步跳转宽度应设置于1~4Tq之间。
如下图6:
当在BSEG1段检测到下降沿,则BSEG1段增长Tdelay,当前bit整体增长Tdelay,其中Tdelay<=重新同步跳转宽度。
当在BSEG2段检测到下降沿,则BSEG2段缩短Tadvance,当前bit整体缩短Tadvance,其中Tadvance<=重新同步跳转宽度。
仲裁机制
只要总线空闲,任何单元都可以开始发送报文。如果2个或2个以上的单元同时开始传送报文,那么就会有总线访问冲突。通过对ID进行逐位仲裁可以解决这个冲突。仲裁的机制确保了报文和时间均不损失。当具有相同ID的数据帧和远程帧同时初始化时,数据帧优先于远程帧。仲裁期间,每一个发送节点都对发送位的电平与被监控的总线电平进行比较。如果电平相同,则这个节点可以继续发送。如果发送的是一“隐性”电平而监测到是一“显性”电平(见总线电平),那么该节点就失去了仲裁,必须立即退出发送状态并转入接收状态。
例如下图7,节点1和节点2同时发送一帧数据,ID段前几bit相同。直到红色处,节点1发送隐性电平“1”,节点2发送显性电平“0”。此时节点2仲裁优胜,继续发送,总线电平和节点2发送值一致;而节点1仲裁失利,在下一bit转入接收,后续节点1的发送引脚保持隐性电平。
CAN协议定义了以下5种不同的错误类型:
- 单元在发送位的同时也对总线进行监视。如果所发送的位值与所监视的位值不相符合,则在此位时间里检测到一个位错误。AT32将位错误细分为显性位错误(发送显性位但检测到隐性位)和隐性位错误(发送隐性位但检测到显性位)。CAN节点在发送状态会出现此类错误。但是在仲裁场(ARBITRATION FIELD)的填充位流期间或应答间隙(ACK SLOT)发送一“隐性”位的情况是例外的——此时,当监视到一“显性”位时,不会发出位错误。当发送器发送一个被动错误标志但检测到“显性”位时,也不视为位错误。
- 如果在使用一帧报文的位填充区域(参考图4的“位填充区域”)检测到6个连续相同的位电平时,将检测到一个位填充错误。CAN节点在接收状态会出现此类错误。
- CRC序列包括发送器的CRC计算结果。接收器计算CRC的方法与发送器相同。如果计算结果与接收到CRC序列的结果不相符,则检测到一个CRC错误。CAN节点在接收状态会出现此类错误。
- 当一个固定形式的位场含有1个或多个非法位,则检测到一个格式错误。例如在CRC间隔符/ACK间隔符的位场检测到显性位,则会检测到格式错误。例外:接收器的帧末尾最后一位期间的显性位不被当作帧错误。CAN节点在接收状态会出现此类错误。
- 应答错误(Acknowledgment Error)只要在应答位(ACK SLOT)期间所监测的位不为“显性”,则发送器会检测到一个应答错误。CAN节点在发送状态会出现此类错误。
错误状态
CAN节点检测到错误之后,根据不同状态和错误类型会对发送错误计数器(TEC[7:0])/接收错误计数器(REC[7:0])进行加1或加8(具体增加规则请参考BOSCH CAN协议),每正确的发送/接收一帧数据后,发送/接收错误计数器减1。因此发送/接收错误计数器值表明了CAN节点和网络的稳定程度。根据发送/接收错误计数器值,一个节点的状态会处于以下三种之一:
- “错误主动”的节点可以正常地参与总线通讯并在错误被检测到时发出主动错误标志(6个显性位)。见下图8,TEC<128且REC<128即为错误主动状态。
- “错误被动”的节点可参与总线接收和发送数据/远程帧。但检测到错误时只能发送错误被动标志(6个隐形位)。见下图8,255≥TEC>128且255≥REC>128即为错误被动状态。
- “离线”的节点相当于直接从CAN总线断开,不能收/发任何信息。见下图8,TEC>255即为离线状态。
AT32离线管理:AT32 CAN从离线状态恢复分两种情况:
1)当CAN主控制寄存器(CAN_MCTRL)AEBOEN位为‘0’时,需要软件请求进入冻结模式,再请求退出冻结模式,然后在通信模式下等待CAN节点RX检测到128次11个连续隐性位,随后该节点会从离线状态恢复。
2)当AEBOEN位为‘1’时,通信模式下CAN节点RX检测到128次11个连续隐性位,就自动从离线状态恢复。
AT32的CAN支持标准CAN协议2.0A和2.0B。且在兼容标准CAN协议的基础上增加了一些功能和可配置选项。其中CAN 2.0A和2.0B的主要差别在于:CAN 2.0A仅支持11bit ID,即只支持标准帧;CAN 2.0B支持11bit/29bit ID,即支持标准帧和扩展帧。
本章节主要介绍AT32 CAN的主要设计结构和使用,介绍了AT32 CAN的正常通信流程,包括发送流程、接收流程、报文过滤、波特率及采样点设置等。其他AT32 CAN相关设计,例如错误管理、中断管理等,请参考RM相关章节。
整体功能介绍
随着CAN网络节点和报文数量的增加,需要一个增强的过滤机制处理各种类型的报文,减少接收报文的处理时间,采用FIFO的方案,使得CPU可以长时间处理应用层任务而不会丢失报文。同时发送报文由硬件控制发送优先级顺序。基于以上考虑,CAN控制器提供28组位宽可配置的标识符过滤器组,2个接收FIFO,每个FIFO都可以存放3个完整的报文。共有3个发送邮箱,发送调度器决定发送优先级顺序。整个收发过程完全由硬件管理,无需占用CPU资源。
CAN发送流程
CAN发送流程见下图10和以下的步骤:
用户使用时只需操作1)~3)。4)~7)由硬件自动完成,无需用户代码参与,不占用CPU资源。
1)程序选择1个空置的邮箱(发送邮箱空标志TMxEF=1)
2)将需要发送的报文写入对应的空邮箱。报文内容包含:ID、帧类型、数据长度和发送数据等
3)请求发送:将CAN_TMIx的TMSR位置1
4)邮箱挂号(等待成为最高优先级)
5)预定发送(等待总线空闲)
6)发送
7)邮箱空置
注:以上步骤1)~7)只简单介绍正常发送流程,下图10中还包含取消发送、发送失败、自动/不自动重传等情况,可参考RM文件报文发送一节,这里不再详述。
下图10中标志位和操作位说明如下:
TMxTCF:请求完成标志位(发送/中止请求)
TMxTSF:发送成功标志位
TMxEF:发送邮箱空标志位
TMSR:请求发送
TMxCT:中止发送
PRSFEN:禁止自动重传(PRSFEN=1时,禁止自动重传;PRSFEN=0时,自动重传直到发送成功)
CAN接收流程
CAN常用接收流程如下,即下图11的“空”和“挂号_1”两个状态间循环:
1)FIFO空
3)进入“挂号_1”状态(FIFO内有1条有效报文的状态)
4)读取有效报文:读取接收邮箱寄存器(CAN_RFIx,CAN_RFCx,CAN_RFDTLx,CAN_RFDTHx)。
5)释放邮箱:CAN_RFx寄存器RFxR位置1。
注:用户使用时只需操作4)~5)。1)~3)由硬件自动完成,无需用户代码参与,不占用CPU资源。
有效报文:
当报文被正确接收(直到EOF域的最后一位都没有错误),且通过了标识符过滤,那么该报文被认为是有效报文。过滤器相关介绍见下一节。
而如果接收过程中用户不参与操作(即不去读取有效报文和释放邮箱),硬件流程如下:
1)收到有效报文
2)进入“挂号_1”状态(FIFO内有1条有效报文的状态)3)收到有效报文
4)进入“挂号_2”状态(FIFO内有2条有效报文的状态)
5)收到有效报文
6)进入“挂号_3”状态(FIFO内有3条有效报文的状态)
7)收到有效报文
8)进入“溢出”状态(FIFO内有3条有效报文,丢失了一条报文,溢出标志置起)
下图11中标志位和操作位说明如下:
RFxMN:FIFO内有效报文数量(取值0~3)
RFxOF:溢出标志位
RFxR:释放邮箱
过滤器
在CAN协议里,报文的ID不代表节点的地址,而是跟报文的内容相关的。因此,发送者以广播的形式把报文发送给所有的接收者。节点在接收报文时,根据ID的值决定软件是否需要该报文;如果需要,就存到接收FIFO里,用户可通过软件读取接收邮箱寄存器获取该报文;如果不需要,报文就被丢弃且无需软件的干预。
为满足这一需求,AT32 CAN控制器为应用程序提供了28个硬件过滤器组(AT32F435系列有28个过滤器组,0~27;但AT32F403A等系列只有14个过滤器组,0~13。具体请参考相应型号的RM),以便只接收那些软件需要的报文。用户配置好需要的ID后,整个过滤过程无需软件参与,不占用CPU资源。
过滤器的位宽
每个过滤器组由2个32bit的寄存器,CAN_FiFB1和CAN_FiFB2组成。通过配置CAN_FBWCFG寄存器的FBWSELx位,可以设置2个16位宽或者1个32位宽的过滤器。
32位宽的过滤器寄存器CAN_FiFBx包括:一组SID[10:0]、EID[17:0]、IDT和RTR位。
16位宽的过滤器寄存器CAN_FiFBx包括:两组SID[10:0]、IDT、RTR和EID[17:15]位。
过滤器模式
通过设置CAN_FMCFG寄存器的FMSELx位可以设置过滤器寄存器工作在标识符掩码模式或者标识符列表模式,掩码模式用来指定ID的哪些位需要与预设ID相同,哪些位无需比较,列表模式表示ID的每个位都必须与预设ID一致。
两种模式与过滤器位宽配合使用,可以有以下四种过滤方式:
图12 32位宽标识符掩码模式
图13 32位宽标识符列表模式
图14 16位宽标识符掩码模式
图15 16位宽标识符列表模式
更多CAN过滤器说明,例如CAN过滤器匹配序号,优先级规则等可参考RM文件报文过滤一节,这里不再详述。过滤器配置流程见后文案例介绍--CAN接收过滤器使用。
CAN波特率及采样点计算
如前文CAN位格式一节所述,CAN的一个bit被分为几段。其中第一段同步段(SYNC_SEG)固定为1Tq,1Tq的长度由CAN位时序寄存器(CAN_BTMG)的分频系数BRDIV[11:0]位定义;位段1(BSEG1)通过配置CAN位时序寄存器的BTS1[3:0]位,可设定为1~16Tq;位段2(BSEG2)通过配置CAN位时序寄存器的BTS2[2:0]位,可设定为1~8Tq。用户通过配置CAN时序寄存器,可设置CAN波特率和采样点,整个CAN总线上各节点的波特率和采样点一致最佳,不过由于各节点主频可能不一样,所以比较难保证波特率和采样点均一致。用户使用时应首先保证波特率一致,采样点尽量保持在较小的偏差范围内,这样CAN总线可以支持更多的节点和更长的线路。
波特率计算公式
其中
例如,bsp例程project\at_start_f437\examples\can\communication_mode:
APB时钟:APB1_CLK=144MHZ
CAN分频系数:BRDIV=12
此时1Tq=1/(144MHZ/12)=(1/12)us
同步段:SYNC_SEG=1Tq(固定不变,无需用户配置)
位段1:BSEG1=8Tq(BTS1[3:0]=7)
位段2:BSEG2=3Tq(BTS2[2:0]=2)
此时Nomal Bit Timimg=1Tq*(SYNCSEG+BSEG1+BSEG12)=1us
此时BaudRate=1/(Nomal Bit Timimg)=1/1us=1Mbps
采样点计算公式
sample point=(SYNC_SEG+BSEG1)/(SYNC_SEG+BSEG1+BSEG12)
举例同上:
此时sample point=(1+8)/(1+8+3)=75%
关于采样点设置,CAN协议并没有明确规定,但根据各厂商CAN设备使用习惯,采样点设置建议如下
表3:
波特率计算工具
为方便用户波特率设定,本文介绍一个AT专用波特率计算工具:
使用步骤如下:
1) 波特率设定:高速CAN波特率最大为1M,各厂商CAN设备常用波特率为125K、250K、333K、500K、1M等。用户可根据需要设定波特率。参考下图16“波特率(Kbit/S)”。
2) CAN时钟源频率设定:参考下图16“PCLK1(MHZ)”。
3) 采样位置设置:设置完波特率后,计算工具会自动填入一个推荐的采样位置值。若实际项目中无具体限定,可保持默认设定;若项目中有具体限定,根据需求更改即可。参考下图16“采样位置(%)”。
4) 波特率偏差设定:建议在不勾选“允许波特率偏差”项,仅在没有符合要求的计算结果时,再勾选此项。由于同一CAN网络的节点波特率有误差会增大通信错误几率,建议“偏差”值设置尽量小。参考下图16“允许波特率偏差”和“偏差”。
5) 波特率配置结果选择:根据以上设定即可计算出多组结果。在页面左下角选择一项计算结果,即会在页面右下角显示对应软件代码配置,点击“复制全部”即可获得对应代码。
案例1 CAN正常通信-normal模式
注:所有project都是基于keil 5而建立,若用户需要在其他编译环境上使用,请参考AT32xxx_Firmware_Library_V2.x.x\project\at_start_xxx\templates中各种编译环境(例如IAR6/7,keil 4/5)进行简单修改即可。
功能简介
实现两个CAN节点之间收发通信。
资源准备
两套对应产品型号的AT-START BOARD+CAN电平转化器
程序设计以bsp demo为例:
CAN1_TX(PB9)连接电平转换器的TXD;
CAN1_RX(PB8)连接电平转换器的RXD;
两个CAN节点的电平转换器的CANH和CANL分别相连。
CAN电平转换器硬件设计可参考下图:
2) 软件环境:
project\at_start_f435\examples\can\communication_mode
软件设计
- 配置CAN1 TX和RX pin对应的GPIO引脚
2) 代码介绍
实验效果
如若数据传输无误,两块AT-START BOARD的LED2均会闪烁以指示收到ID=0x400的标准帧数据;LED4会持续闪烁以指示程序正常运行。
案例2 CAN接收过滤器使用
注:所有project都是基于keil 5而建立,若用户需要在其他编译环境上使用,请参考AT32xxx_Firmware_Library_V2.x.x\project\at_start_xxx\templates中各种编译环境(例如IAR6/7,keil 4/5)进行简单修改即可。
功能简介
实现报文过滤:接收需要的报文,丢弃不需要的报文。
资源准备
两套对应产品型号的AT-START BOARD+CAN电平转化器程序设计以bsp demo为例:
CAN1_TX(PB9)连接电平转换器的TXD;
CAN1_RX(PB8)连接电平转换器的RXD;
两个CAN节点的电平转换器的CANH和CANL分别相连。
CAN电平转换器硬件设计可参考下图:
2) 软件环境:
project\at_start_f435\examples\can\filter
软件设计
1) 配置流程
- 配置CAN1 TX和RX pin对应的GPIO引脚
实验效果
- 如若数据传输无误,AT-START BOARD的LED2/3/4会翻转一次,以指示收到ID=FILTER_EXT_ID1,FILTER_EXT_ID2,FILTER_STD_ID1,FILTER_STD_ID2的4帧数据。
注:所有project都是基于keil 5而建立,若用户需要在其他编译环境上使用,请参考AT32xxx_Firmware_Library_V2.x.x\project\at_start_xxx\templates中各种编译环境(例如IAR6/7,keil 4/5)进行简单修改即可。
功能简介
实现单板的环回模式通信。
环回模式(loopback mode):
环回模式可用于自测试。在环回模式下,CAN在内部把TX输出回馈到RX输入上,而完全忽略CAN_RX引脚的实际状态。因此此模式下CAN对应的GPIO引脚可以不配置,而如果对应的GPIO引脚配置了,发送的报文可以在CAN_TX引脚上检测到。见下图19。另外,为了避免外部的影响,在环回模式下CAN内核忽略确认错误(在数据/远程帧的确认位时刻,不检测是否有显性位)。
平转换器硬件设计可参考下图:
资源准备
1) 硬件环境:
一块对应产品型号的AT-START BOARD
2) 软件环境:
project\at_start_f435\examples\can\loopback_mode
软件设计
1) 配置流程
- 配置CAN1 TX和RX pin对应GPIO(loopback模式下,此项可忽略不配置)
- AT-START BOARD的LED2会闪烁以指示收到自己发送的ID=0x400的标准帧数据;LED4会持续闪烁以指示程序正常运行。