基于GD32C10x MCU 控制器局域网络(CAN)学习总结

      最后更新:4个月前 手机定位技术交流文章

      1、CAN基础介绍
      CAN(Controller Area Network)总线是一种可以在无主机情况下实现微处理器或者设备之间相互通信的总线标准。GD32C10x MCU CAN模块支持协议 2.0A、2.0B、ISO11891-1:2015 和BOSCH CAN-FD 规范。CAN2.0A标识符为11bit,CAN2.0B标识符为29bit,ISO11891-1:2015指的是CAN通信速率为125Kbps~1Mbps的高速通信标准,BOSCH CAN-FD 规范指的是CAN通信速率在1Mkbps以上,且数据数据段的字节数由原来的8byte扩展到64byte。CAN具有很高的可靠性,广泛应用于:汽车电子、工业自动化、船舶、医疗设备、工业设备等方面。本文主要是基于GD32C10x MCU介绍CAN模块的具体应用方法,在CAN协议方面只做简要介绍。
      2、GD32C10x CAN模块主要特性
      1、常规帧:通信波特率最大为 1Mbit/s;
      2、CAN-FD 帧:通信波特率最大为 6Mbit/s;
      3、支持传输延迟补偿;
      4、支持时间触发通信;
      5、中断使能和清除。
      发送功能:
      1、3 个发送邮箱;
      2、支持发送优先级;
      3、支持发送时间戳。
      接收功能:
      1、2 个深度为 3 的接收 FIFO;
      2、具有 28 个标识符过滤器;
      3、FIFO 锁定功能。
      时间触发通信:
      1、在时间触发通信模式下禁用自动重传;
      2、16 位定时器;
      3、接收时间戳;
      4、发送时间戳。
      3、CAN基础应用电路介绍及协议简介
      CAN通信是一种异步通信,具有CAN_High和CAN_Low两条信号线,共同构成一组差分信号线,以差分信号的形式进行通信。CAN物理层的形式主要分为闭环总线及开环总线网络两种,一个适合于高速通讯,一个适合于远距离通讯。
      闭环总线网络框图如下:
      CAN闭环框图
      CAN闭环通信网络具有速率高、距离短特点,总线最大长度40m,通信速度最高1Mbps,总线两端各接一个120R的电阻。
      开环总线网络框图如下:
      CAN开环框图
      CAN开环通信网络具有低速、通信距离远特点,通信距离1km,最高通信速率125kbps,两条总线各接2.2KR的电阻。
      CAN通信协议数据帧如下:
      CAN通信协议数据帧
      帧起始:由一个显性电平表示CAN数据帧的开始。仲裁段:表示该帧的ID是标准帧还是扩展帧,标准帧ID为11bit,扩展帧的ID为29bit,RTR 位表示该帧是数据帧还是远程帧,显性电平为数据帧,隐性电平为远程帧。控制段:IDE位显性电平标准帧,隐性电平扩展帧,r0、 r1位发送必须是显性电平,DLC表示发送的字节数,通常为8byte,CAN-FD数据段字节数可扩展到64byte。数据段:发送的数据具体内容。CRC段:计算的内容包括帧起始、仲裁段、控制段和数据段。ACK段:由ACK slot和ACK界定符2位组成,发送单元为2个隐性位,接收单元在接收到正确的数据帧后,会在ACK slot位发送显性位,通知发送方。帧结束:为连续的7个隐性位组成。
      CAN标准帧和扩展帧的帧格式如下图:
      CAN标准帧和扩展帧
      CAN扩展帧中SRR为替代远程请求位。远程帧和数据帧的本质区别是有无数据段。

      4.CAN位时序介绍
      CAN协议是采用位同步传输方式,CAN传输位时序图如下所示:
      CAN位时序图
      位速率指的是发送单元每秒发送的位数,一个位通常由SS同步段、PTS传播时间段、PBS1相位缓冲段1、PBS2相位缓冲段2四部分组成。SS同步段:总线上多个连接单元的同步,由隐性电平到显性电平或由显性电平到隐性电平。PTS传播时间段:网络上的物理延迟。PBS1、2:同步的信号边沿没有在SS段出现,可在此段进行补偿。SJW再同步补偿宽度:PBS1、PBS2的误差累计补偿。
      CAN位时序同步如下图所示:
      CAN位时序同步图
      CAN发送波特率的计算方式如下:
      波特率计算
      5、GD32C10x CAN模块应用
      GD32C10x CAN模块设计相比于国外厂商大佬NXP、ST简单很多,但是满足一般的CAN应用场景已经足够。据说兆易创新的最新款车规级MCU在2022年中将面世,应用于车规级的MCU,CAN模块的设计肯定少不了,期待GD能带给我们更多惊喜。
      CAN模块结构框图如下:
      CAN模块框图
      CAN总线控制器有四种通信模式:静默、回环、回环静默、正常通信模式。静默:只从总线接收数据,不发送。回环:发送数据自己接收同时也发送到CAN总线上。回环静默:自发自收,通常用于CAN模块的自测。正常模式:可从CAN总线接收数据,也可向CAN总线发送数据。

      CAN数据发送框图如下:
      CAN发送寄存器
      CAN模块总共有3个发送邮箱,TMIx寄存器主要配置数据帧标识符标准格式或者扩展格式、远程帧或者数据帧、发送使能。TMPx寄存器主要配置发送数据长度、标准帧还是FD帧,CAN-FD模式下数据段速率是否转换。TMDATA0、1主要配置发送的字节具体内容。在FD模式下,如果软件想要使用发送邮箱x发送64字节数据,需要通过写TMDATAx寄存器16次将待发送数据写入内部专用SRAM区。发送邮箱有空闲、就绪、挂起、发送四个状态。
      发送优先级
      当有2个及其以上发送邮箱等待发送时,寄存器CAN_CTL的TFO位的值可以决定发送顺序。当TFO为1,所有等待发送的邮箱按照先来先发送(FIFO)的顺序进行。当TFO为0,具有最小标识符(Identifier)的邮箱最先发送。如果所有的标识符(Identifier)相等,具有最小邮箱编号的邮箱最先发送。

      CAN数据接收框图如下:
      CAN接收框图
      CAN模块总共3个接收邮箱,寄存器配置与发送基本一致。同样在FD模式下,如果软件想要从FIFOx中读64字节数据,需要通过读
      CAN_RFIFOMDATA0x寄存器16次将数据全部读出。
      接收FIFO状态信息:
      接收FIFO状态信息包含在寄存器CAN_RFIFOx中。RFL:FIFO中包含的帧数量。FIFO为空时,RFL为0;FIFO为满时,RFL为3。
      RFF:FIFO满状态标志位。这时RFL为3。RFO:FIFO溢出标志位。当FIFO已经包含了3个数据帧时,新的数据帧到来使FIFO发生溢出。
      如果CAN_CTL寄存器的RFOD位被置1,新的数据帧将丢弃。如果该位被清0,新的数据帧将覆盖接收FIFO中最后一帧数据。

      CAN 数据过滤器介绍
      一个待接收的数据帧会根据其标识符(Identifier)进行过滤:硬件会将通过过滤的帧送至接收FIFO,并丢弃没有通过过滤的帧。过滤器包含28个单元,它们是bank0到bank27。每一个过滤器单元有2个寄存器CAN_FxDATA0和CAN_ FxDATA1,它们可以配置为2种位宽:
      32-bit位宽和16-bit位宽。
      32bit 过滤器如下图:
      32bit过滤器
      16bit过滤器如下图:
      16bit过滤器
      SFID[10:0]为11bit标准帧,SFID[10:0]和EFID[17:0]组成29bit扩展帧,FT该位表示数据帧还是远程帧,FF表示标准帧还是扩展帧。过滤器可以配置为掩码模式或者列表模式。掩码模式:对于一个待过滤的数据帧的标识符(Identifier),掩码模式用来指定哪些位必须与预设的标识符相同,哪些位无需判断。列表模式:对于一个待过滤的数据帧的标识符(Identifier),列表模式用来表示与预设的标识符列表中能够
      匹配则通过,否则丢弃。过滤器由若干过滤单元(Bank)组成,每个过滤单元因为位宽和模式的选择不同,而具有不同的过滤效果。例如Bank0可以配置为一组32bit掩码模式、两个32bit列表模式、两组16bit掩码模式及四个16bit列表模式。28个过滤单元均可以关联接收FIFO0或接收FIFO1。一旦一个过滤单元关联到接收FIFO,只有通过这个过滤单元的帧才会被传送到接收FIFO中存储。一个过滤单元如果被应用程序用到,就必须激活。通过CAN_FW寄存器可以进行配置。
      过滤器优先级规则如下:
      1、32-bits位宽模式高于16-bits位宽模式;
      2、列表模式高于掩码模式;
      3、较小的过滤序号(Filter Number)具有较高的优先级。
      时间触发通信:在这种通信模式下,一个内部的16-bit计数器开始工作,在每一个CAN位时间(Bit time)增1。这 个 内 部 计 数 器 为 数 据 发 送 和 数 据 接 收 提 供 时 间 戳 , 这 些 时 间 戳 存 放 在 寄 存 器CAN_RFIFOMPx和CAN_TMPx中。GD32C10x CAN模块时间触发功能设计比较简单,仅仅只是记录发送和接收数据帧所用的时间。ST厂商 H7 芯片的FDCAN模块设计功能比较多,其中的时间触发功能比较复杂,推荐可以学习一下。
      CAN FD模式时序图如下:
      CANFD时序图
      在CAN-FD帧中,在控制字段中增加了三个bit位:
      1、扩展数据长度(EDL)位:隐性表示帧为CAN-FD,否则该位为显性(称为R0)在CAN 2.0帧中。
      2、比特率切换(BRS):指示是否启用两个比特率(例如,当数据阶段位以不同的比特率传输到仲裁阶段)。
      3、错误状态指示器(ESI):指示节点处于错误活动模式还是错误被动模式。
      通过将 CAN_FDCTL 寄存器的 FDEN 位置 1,可以使能 CAN FD (CAN with Flexible Data rate)功能。如果 FDEN 位被清 0,CAN 总线控制器仅支持常规帧(标准帧和扩展帧)的收发,若FDEN 位被置 1,则 CAN 总线控制器同时支持常规帧(标准帧和扩展帧)以及 FD 帧的收发。根据协议,当前帧是否为 FD 帧是通过帧的 FDF 位来判断(在常规帧中该位为保留位)。如果FDF 位为隐性,表示是 CAN FD 帧;如果为显性,表示是常规帧。在 CAN-FD 帧的帧结构中,FDF 位之后是保留位和 BRS 位。BRS 位决定数据位速率,当 BRS位为显性时,表示不能通过配置 CAN_DBT 寄存器来切换数据位速率。当 BRS 位为隐性时,可以通过配置 CAN_DBT 寄存器使得数据段(从 BRS 位到 ACK 场之前)的位速率高于仲裁段的位速率。
      CAN_FD传输延迟补偿
      CAN-FD 协议支持传输延迟补偿机制。由于 CAN 收发器存在回路延迟,因此当发送 CAN-FD帧的高速数据段的位时间长度小于收发器内部回路延迟的限定值时,该机制可以避免当采样点到来时发送节点还没有收到其自己发出的位,从而报错的情况发生。传输延迟测量如下图所示:
      传输延迟测量
      将 CAN_FDCTL 寄存器的 TDCEN 位置 1 将使能传输延迟补偿。传输延迟补偿机制可以调节次级采样点(SSP)的位置。SSP_Delay 被定义为 CANTX 上的信号到 SSP 采样点的延迟。如果 CAN_FDCTL 寄存器的 TDCMOD 位被置 1,SSP_Delay 的值 由 CAN_FDTDC 寄存器的 TDCO 位域软件配置决定。如果 TDCMOD 位被清 0,硬件将自动计算位速率转换之前的 FDF 位到 RES0 位的下降沿在 CAN_TX 与 CAN_RX 上出现的延迟,并将计算值存入 CAN_FDSTAT 寄存器的 TDCV 位域。由于存在信号毛刺,可能导致硬件自动计算的 SSP 位置比预期的提前,为了避免 TDCV 的值过小,可以使用 CAN_FDTDC 寄存器的 TDCF 位域。如果 TDCV 的值大于 TDCF,SSP_Delay 的值被定义为 TDCO 加上 TDCV,否则 SSP_Delay 的值被定义为 TDCO 加上 TDCF。
      以上将GD32C10x 的功能基本介绍完,最后附上一个基于GD32C10x CAN模块的demon。该例程当按下“篡改”按钮时,CAN0向CAN1发送消息并打印。 当CAN1正确接收到此消息时,将打印收到的数据 和LED3切换一次。 当按下唤醒按钮时,CAN1向CAN0发送消息并打印。 当CAN0正确接收到此消息时,将打印接收到的数据 和LED2切换一次。

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:http://www.wangsu123.cn/news/16834.html

          热门文章

          文章分类