IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> CAN通信的用户层设计 -> 正文阅读

[嵌入式]CAN通信的用户层设计

在汽车电子和工业领域里,经常会使用CAN总线方式来进行通信,CAN总线速率高,采用差分通信方式,因此抗干扰性强,常规走线可达十米以上。那么我们需要在实际使用中需要注意哪些问题呢?

CAN协议底层有阻塞和唤醒模式,且有冗余校验和错误帧识别,因此可靠性极高。不同于modbus总线使用485作为通信方式,CAN总线没有主从机之分,总线上的设备均可不定时广播消息,主控制器只需根据帧ID接受相应的有用帧而舍弃其他帧。

现在越来越多的主控制芯片都会集成1到2个CAN控制器,PLC厂商也会提供CAN拓展模块以支持CAN通信(此处不得不吐槽PLC厂商的捆绑销售)。本文将以stm32系列主控芯片为例,重点讲解程序中的要点。

发送部分

大多数芯片的CAN控制器会提供2个以上发送邮箱。所谓发送邮箱,理解为邮差更为合适。当需要向总线发送数据时,要先检查当前是否有空闲邮差,如果能找到空闲邮差则直接发送之,邮差会把你的数据送到总线上。因为发送数据需要时间,所以邮差也有空闲和忙碌一说。当你有多个信息需要发送,则会同时需要多个邮差。

如果邮差都出去送信了,那么此时发送数据一定会是失败的。因此在程序里需要加判断,如果返回值为no_mail,则需要等待。

    /*发送数据,获取邮箱号*/
    mbox = CAN_Transmit(CANx, &TxMessage);
    //若获取邮箱失败,说明发送正忙,需等待重发
    while(CAN_TxStatus_NoMailBox == mbox)
    {
        mbox = CAN_Transmit(CANx, &TxMessage);
        __NOP();
    }

一般芯片的CAN控制器配置有一个选项,叫做自动重传。如果用户使能这个自动重传的功能,当向总线发送数据出错时,软件会一直阻塞在发送函数处,直到数据重传完成。那么我们就可能会想到一种隐患,如果总线脱落,那么设备会由于数据无法发送出去而导致程序阻塞,对工业设备和汽车电子来说这绝对是致命的隐患。

/**
 *MCR-NART  禁止报文自动重传      DISABLE-自动重传    ENABLE-禁止自动重传
 *DISABLE:按照CAN标准,CAN硬件在发送报文失败时会一直 自动重传直到发送成功; 
 *ENABLE: CAN报文只被发送1次,不管发送的结果如何(成功、出错或仲裁丢失)。
 */
CAN_InitStructure.CAN_NART = ENABLE; 

因此我们常规的操作是禁用自动重传,通过软件检测CAN数据发送状态,如果发送失败,则尝试自动重传N次,如果N次均失败,则不会继续传输,而是执行主程序。这样的话,即便CAN设备掉线,也不会影响设备的其他功能的运转。

    /*在设定的时间内等待发送结束,时间到了未发送完亦退出,发送失败,防止假死*/
    while((CAN_TransmitStatus(CANx, mbox) == CAN_TxStatus_Failed) && (Timeout < 0XFFFF))
    {
        Timeout++;    /*等待发送结束*/
    }
    if(Timeout >= 0XFFFF)
    {
        CAN_Transmit(CANx, &TxMessage);
        return 1;     /*发送失败*/  
    }

但是使用软件检测CAN发送状态并不是万能的,这次我就遇到了一个麻烦,由于总线上挂载的一个设备,可能是阻抗匹配的不太好,导致CAN总线通信质量受影响。以下是用示波器截取到的部分质量不太好的数据。黄色线为CAN_H,蓝色线为CAN_L,正常情况下两者形成差分为显性,两者相等为隐形。但是看到最后的7个帧结束位显性电平不干净,疑似是信号反射引起的阻抗不匹配。

?这种情况下,使用寄存器提供的状态检查不能够检查出帧错误了,而是回报的成功状态,因此驱动层软件会误认为发送成功而直接结束。但是反应到总线上,这一帧的数据,一定是被抛弃了,不能被正确接收到。

可疑的是,stm32的CAN控制器确能够检测到这种发送失败,因为当我们使能自动重传后,总线上不再出现丢帧情况,说明stm32对这帧数据进行了重传。

因此,存在一种传输失败的情况,通过读取芯片的寄存器无法得知失败,但芯片的CAN控制器却能够得知失败并进行重传操作。

如果您觉得这篇文章帮到了你,请点赞或者留下您的评论,您的鼓励是我前进的动力~

关注博主威信平台?“嵌入式电子创客街” 获取更多及时技术分享~

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-05-21 19:08:40  更:2022-05-21 19:10:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/29 7:56:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计