CAN概述
CAN是Controller Area Network的缩写(以下称为CAN),它的设计目标是以最小的CPU负荷来高效处理大量的报文。1986年德国电气商BOSCH公司开发出面向汽车的CAN通信协议。此后,CAN通过ISO11898及ISO11519进行了标准化,现在在欧洲已是汽车网络的标准协议。现在,CAN的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。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Ω的终端电阻,来做阻抗匹配,以减少回波反射。图1 CAN网络拓扑结构
CAN总线物理层特性
如下图2:显性电平对应逻辑“0”,CANH和CANL压差2.5V左右。而隐性电平对应逻辑“1”,CANH和CANL压差为0V。在总线上,显性电平具有优先权,只要有一个节点输出显性电平,总线上即为显性电平。而隐形电平则具有包容的意味,只有所有的节点都输出隐性电平,总线上才为隐性电平。图2 CAN总线电平特性
帧类型
如下表1,CAN包含了以下5种帧类型。其中数据帧和远程帧由用户控制收发;错误帧、过载帧和间隔帧是CAN总线上各节点硬件根据对应状态发送,用户不能也无需控制。表1 CAN帧类型如下图3,包含了各类型帧结构示意。图3 CAN各帧类型
帧结构
本文仅对标准数据帧进行详细介绍,其他帧类型可参考图3与标准数据帧进行对比理解。一帧标准数据帧包含如下部分:帧起始:为1bit显性位。由于CAN总线空闲时是隐性电平,帧起始的显性位用于提示总线上的节点“一帧信息传输开始了”。仲裁段:表示该帧优先级的段,包含标识符和帧类型(数据/远程帧)。控制段:表示数据的字节数、标识符类型(标准/扩展标识符)及保留位的段。数据段:数据,一帧可发送0~8个字节的数据(数据长度根据控制段的DLC决定)。CRC段:发送节点将CRC计算区域(不包含填充位)进行CRC计算后放入CRC段发送。接收节点也对CRC计算区域进行CRC计算,并与收到的CRC域进行对比,若CRC对比结果有误则向总线发送错误帧,若对比结果正确则随后发送应答。ACK段:含应答位(ACK SLOT)和应答间隔符(ACK DELIMITER)。发送节点在ACK段均发送隐性电平;接收节点如果在接收过程中没有检测到错误,则在应答位输出1bit显性电平,以通知发送节点“这帧数据被正确的接收了”。帧结束:表示数据帧结束的段,为7bit隐性电平。图4 CAN标准数据帧
位填充
由于CAN总线只有CANH/CANL两条差分线,没有CLK线来做同步,所以CAN是直接通过数据流中间的跳变沿来做同步的(参考下文同步机制)。而为了避免数据流中出现大段没有跳变沿的情况,CAN加入了“位填充”机制。即发送器只要检测到位流里有5个连续相同值的位,便自动在位流里插入一相反电平的填充位。例如,原始数据流为“0000000111110001…”,经过位填充后实际输出到CAN总线的数据流为“000001001111100001…”,加下划线的位即为填充位。位填充的范围为帧起始(SOF)~CRC域(不含CRC间隔符),参考上图4。
位格式
AT32的CAN一个bit可分为3段:
这些段又由Time Quantum(以下称为Tq)的最小时间单位构成。1位分为3个段,每个段又由若干个Tq构成,这称为位时序。1位由多少个Tq构成、每个段又由多少个Tq构成等,可以任意设定位时序。用户通过设定位时序和Tq长度来设定CAN的波特率和采样点。关于波特率和采样点设置,后文详细介绍。各段作用及AT32的CAN可配置的Tq数见下表2:表2 位的各段的作用如下图5,同步段、位段1和位段2组成一个bit。BSEG1和BSEG2段交界处为采样点,即接收节点采样的时间点。图5 位时序
同步机制
硬同步(HARD SYHCHRONIZATION):硬同步后,内部的位时间从同步段重新开始。因此,硬同步强迫由硬同步引起的沿处于重新开始的位时间同步段之内。即下图6的理想跳变沿情况。重新同步跳转宽度(RESYHCHRONIZATION JUMP WIDTH):重新同步的结果,使位段1增长,或使位段2缩短。位段增长或缩短的数量有一个上限,此上限由重新同步跳转宽度给定。重新同步跳转宽度应设置于1~4Tq之间。如下图6:当在BSEG1段检测到下降沿,则BSEG1段增长Tdelay,当前bit整体增长Tdelay,其中Tdelay<=重新同步跳转宽度。当在BSEG2段检测到下降沿,则BSEG2段缩短Tadvance,当前bit整体缩短Tadvance,其中Tadvance<=重新同步跳转宽度。图6 重同步跳跃
仲裁机制
只要总线空闲,任何单元都可以开始发送报文。如果2个或2个以上的单元同时开始传送报文,那么就会有总线访问冲突。通过对ID进行逐位仲裁可以解决这个冲突。仲裁的机制确保了报文和时间均不损失。当具有相同ID的数据帧和远程帧同时初始化时,数据帧优先于远程帧。仲裁期间,每一个发送节点都对发送位的电平与被监控的总线电平进行比较。如果电平相同,则这个节点可以继续发送。如果发送的是一“隐性”电平而监测到是一“显性”电平(见总线电平),那么该节点就失去了仲裁,必须立即退出发送状态并转入接收状态。例如下图7,节点1和节点2同时发送一帧数据,ID段前几bit相同。直到红色处,节点1发送隐性电平“1”,节点2发送显性电平“0”。此时节点2仲裁优胜,继续发送,总线电平和节点2发送值一致;而节点1仲裁失利,在下一bit转入接收,后续节点1的发送引脚保持隐性电平。图7 仲裁机制
错误处理机制
错误类型
CAN协议定义了以下5种不同的错误类型:
错误状态CAN节点检测到错误之后,根据不同状态和错误类型会对发送错误计数器(TEC[7:0])/接收错误计数器(REC[7:0])进行加1或加8(具体增加规则请参考BOSCH CAN协议),每正确的发送/接收一帧数据后,发送/接收错误计数器减1。因此发送/接收错误计数器值表明了CAN节点和网络的稳定程度。根据发送/接收错误计数器值,一个节点的状态会处于以下三种之一:
AT32离线管理:AT32 CAN从离线状态恢复分两种情况:1)当CAN主控制寄存器(CAN_MCTRL)AEBOEN位为‘0’时,需要软件请求进入冻结模式,再请求退出冻结模式,然后在通信模式下等待CAN节点RX检测到128次11个连续隐性位,随后该节点会从离线状态恢复。2)当AEBOEN位为‘1’时,通信模式下CAN节点RX检测到128次11个连续隐性位,就自动从离线状态恢复。图8 错误状态
AT32的CAN
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资源。图9 AT32 CAN整体功能介绍
CAN发送流程
CAN发送流程见下图10和以下的步骤:用户使用时只需操作1)~3)。4)~7)由硬件自动完成,无需用户代码参与,不占用CPU资源。1)程序选择1个空置的邮箱(发送邮箱空标志TMxEF=1)2)将需要发送的报文写入对应的空邮箱。报文内容包含:ID、帧类型、数据长度和发送数据等3)请求发送:将CAN_TMIx的TMSR位置14)邮箱挂号(等待成为最高优先级)5)预定发送(等待总线空闲)6)发送7)邮箱空置注:以上步骤1)~7)只简单介绍正常发送流程,下图10中还包含取消发送、发送失败、自动/不自动重传等情况,可参考RM文件报文发送一节,这里不再详述。下图10中标志位和操作位说明如下:TMxTCF:请求完成标志位(发送/中止请求)TMxTSF:发送成功标志位TMxEF:发送邮箱空标志位TMSR:请求发送TMxCT:中止发送PRSFEN:禁止自动重传(PRSFEN=1时,禁止自动重传;PRSFEN=0时,自动重传直到发送成功)图10 CAN发送流程
CAN接收流程
CAN常用接收流程如下,即下图11的“空”和“挂号_1”两个状态间循环:1)FIFO空2)收到有效报文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:释放邮箱图11 CAN接收流程
过滤器
在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=144MHZCAN分频系数: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:表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) 波特率配置结果选择:根据以上设定即可计算出多组结果。在页面左下角选择一项计算结果,即会在页面右下角显示对应软件代码配置,点击“复制全部”即可获得对应代码。图16 波特率配置工具
案例1 CAN正常通信-normal模式
注:所有project都是基于keil 5而建立,若用户需要在其他编译环境上使用,请参考AT32xxx_Firmware_Library_V2.x.x\project\at_start_xxx\templates中各种编译环境(例如IAR6/7,keil 4/5)进行简单修改即可。
功能简介
实现两个CAN节点之间收发通信。
资源准备
1) 硬件环境:两套对应产品型号的AT-START BOARD+CAN电平转化器程序设计以bsp demo为例:CAN1_TX(PB9)连接电平转换器的TXD;CAN1_RX(PB8)连接电平转换器的RXD;两个CAN节点的电平转换器的CANH和CANL分别相连。CAN电平转换器硬件设计可参考下图:图17 CAN电平转换器硬件设计2) 软件环境:project\at_start_f435\examples\can\communication_mode
软件设计
1) 配置流程
2) 代码介绍
实验效果
案例2 CAN接收过滤器使用
注:所有project都是基于keil 5而建立,若用户需要在其他编译环境上使用,请参考AT32xxx_Firmware_Library_V2.x.x\project\at_start_xxx\templates中各种编译环境(例如IAR6/7,keil 4/5)进行简单修改即可。
功能简介
实现报文过滤:接收需要的报文,丢弃不需要的报文。
资源准备
1) 硬件环境:两套对应产品型号的AT-START BOARD+CAN电平转化器程序设计以bsp demo为例:CAN1_TX(PB9)连接电平转换器的TXD;CAN1_RX(PB8)连接电平转换器的RXD;两个CAN节点的电平转换器的CANH和CANL分别相连。CAN电平转换器硬件设计可参考下图:图18 CAN电平转换器硬件设计2) 软件环境:project\at_start_f435\examples\can\filter
软件设计
1) 配置流程
2) 代码介绍
实验效果
案例3 CAN调试-loopback模式
注:所有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内核忽略确认错误(在数据/远程帧的确认位时刻,不检测是否有显性位)。平转换器硬件设计可参考下图:图19 CAN loopback模式
资源准备
1) 硬件环境:一块对应产品型号的AT-START BOARD2) 软件环境:project\at_start_f435\examples\can\loopback_mode
软件设计
1) 配置流程
2) 代码介绍
实验效果
关于雅特力雅特力科技于2016年成立,是一家致力于推动全球市场32位微控制器(MCU)创新趋势的芯片设计公司,专注于ARM Cortex-M4/M0+的32位微控制器研发与创新,全系列采用55nm先进工艺及ARM Cortex-M4高效能或M0+低功耗内核,缔造M4业界最高主频288MHz运算效能,并支持工业级别芯片工作温度范围(-40°~105°)。雅特力目前已累积相当多元的终端产品成功案例:如微型打印机、扫地机、光流无人机、热成像仪、激光雷达、工业缝纫机、伺服驱控、电竞周边市场、断路器、ADAS、T-BOX、数字电源、电动工具等终端设备应用,广泛地覆盖5G、物联网、消费、商务及工控等领域。
全部0条评论
快来发表一下你的评论吧 !