• 基于STM32的CAN通讯测试:让地球仪转起来


    虽然很早就对CAN协议有所耳闻,但自己一直没机会去探究,因此同很多人一样,对CAN的认知仅仅停留在“用在汽车领域的通讯”。由于最近一直在看锂电池BMS:

    内容涉及到了CAN通信,并且工作中也会在客户那里听到一些J1939、NMEA2000等,于是就感觉是时候来了解下CAN了。

    一、CAN

    控制器局域网(Controller Area Network),最初是专门为解决乘用车的串行通信而研发的,其具有较高的实时处理能力、工作在较强电磁干扰下的高可靠性和良好的错误检测能力。其目的主要是简化汽车中各电子控制单元间的控制连接,降低成本。CAN协议中各通信节点通常是由控制器和收发器组成:

    这种通讯结构是非主从式的,也就是任何节点都可以在总线上自由发言,广播式的通信最大的问题就是没有对象,各节点总是时刻在选取总线上自己关心的报文进行接收,然后处理,对于不关心的就过滤掉。那问题就来了,各节点是怎么来区分报文呢?这其实是自己开始时很困惑的地方,直到参悟了报文帧中的仲裁域。

    二、报文

    CAN的报文帧分为标准帧和拓展帧,也就是CAN2.0A和CAN2.0B,CAN2.0A是只支持标准帧,而CAN2.0B是支持拓展帧的。以常用的CAN数据帧为例,标准帧结构如下:

     标准帧总计127bits,仲裁域中的标识符有11bits,这11位的标识符不仅用作优先级而且用作报文区分,但这11位的标识符就限制了同一网络中的最大节点数,为扩大最大通讯节点,于是就有了拓展帧:

    拓展帧主要是增加了18位的拓展标识符,因此拓展帧的标识符就达到了29bits,帧的总长度为150bits。

    三、SAE J1939

    SAE J1939以CAN2.0B为基础,通过CAN总线进行数据通信,它的数据链路层定义了信息帧的数据结构、编码规则、包括通信优先级、传输方式、通信要求、总线仲裁等,负责将29位标识符进行重新分组定义,使报文标识符能描述报文的全部特征,包括目标地址及源地址等内容。在SAE J1939中很重要的部分是协议数据单元(PDU),它定义了一个框架来组织数据帧,PDU的组成结构如下:

    P:优先级,最高级为0

    R:保留位,默认0

    DP:数据页

    PF:群编号的场(PGN)

    PS:目标地址

    SA:源地址

    DataField:数据

    对于源地址及目标地址,在J1939中是有确定的定义,这也意味这套协议是专有协议,实际上这个协议通常用于卡车。现在就简单列举一些定义的地址:

    • 0x00为发动机控制器;

    • 0x0B为刹车系统控制器;

    • 0x13为转向控制器;

    • 0x18为行车记录仪;

    • 0x33为胎压控制器;

    • 0xFF为全局(即所有节点);

    四、STM32 CAN

    STM32集成了CAN控制器,控制器支持CAN2.0A及CAN2.0B,因此在使用STM32f103最小系统开发板进行CAN通讯时,只需要再外置CAN收发器即可,本次采用的CAN收发器是TJA1050,线路连接如下:

     STM32有相应的CAN库,需要声明引用:

     然后是GPIO口的配置:

    然后是NVIC配置,CAN的接收是使用USB中断来实现的,因此需要配置NVIC中断优先级:

     然后是CAN的配置:

     可以看到CAN_Filter的高低位都设置了0,表示不进行过滤,这样它会接收所有的消息。若使用过滤器则配置如下:

     过滤器有两种模式:掩码和列表。顾名思义,掩码模式可以筛选单个或一段的ID,而列表模式只能筛选列表内的,过滤器详解如下:

     掩码设置过程如下:

     CAN库的发送函数:

     CAN库的接收函数:

     通常把接收函数放到中断函数中:

    刚测试时一直没有收到数据,原因就是忘记写USB中断函数了。

    五、连接

    由于CAN通讯是节点间的通讯,因此若要查看发送的消息就需要转协议和接口,目前比较常用的是CAN盒,可以直接将CAN消息通过USB输出到PC,但本次STM32开发板,可直接将CAN消息通过USART输出到PC,控制原理图如下:

    连接实拍图:

    步进电机部分就直接套用之前做的PWM控制电机。

    六、测试

    CAN数据域最大64bits,就是最多8Bytes数据,因此本次定义的数据结构为前四位为步进电机速度设定值,后四位为步进电机位置设定值,例如02003200表示的是速度为200,位置值为3200,测试视频如下:

    基于STM32的CAN通讯测试:让地球仪转起来

    步进电机驱动器设置为3200脉冲/转,因此位置设置为3200则转一圈,位置设置为1600则转半圈,测试结果也如预期。

    【学习交流群769843038】

    【自己收集的网盘免费资料包,需要的自行领取】:

    嵌入式物联网 22个STM32项目、大赛作品,【华清远见发放资料包】

    【学习教程】:

    从零开始构建一个智能家居项目

    stm32-点亮一盏led

    程序、进程、线程。

    带你学会stm32上网

    STM32单片机之GPIO开发

    STM32-按键消抖

    手把手教你做一个语音控制智能灯

    物联网人脸识别考勤机

  • 相关阅读:
    Java内部类(自用)
    白盒测试用例的设计(图文讲解,超详细)
    机器学习基础04DAY
    tensorflow求解泊松方程
    6187. 完成所有交易的初始最少钱数(每日一难phase2--day19)
    你需要知道的 TCP 三次握手
    产品设计的六大要素
    公众号自定义菜单(含个性化)
    ch17、面向对象编程-扩展与复用
    Linux小程序——进度条
  • 原文地址:https://blog.csdn.net/an520_/article/details/125851422