前言
2023年Zephyr开发者大会(ZDS)于6月27日至30日在捷克布拉格隆重举行。与以往两次不同,本次ZDS由Zephyr项目规划和管理,并作为首届嵌入式开源峰会(EOSS)的一部分进行。在这个令人期待已久的盛会中,全球Zephyr开发者们共同探讨了Zephyr实时操作系统(RTOS)的最新技术与发展趋势。作为一款开源、灵活和可扩展的嵌入式实时操作系统,Zephyr项目在2014年由英特尔发起,2016年作为Linux基金会项目正式面向公众启动,得到了全球范围内的广泛关注和采用。
ZDS 2023共70余个技术报告,涵盖了使用指导与展示、新功能与技术、架构修改与操作系统、多核异构与虚拟化、模拟器、测试、工业流程与代码管理、安全性、应用案例、工具与调试等丰富多样的内容。湖大嵌入式实验室的小伙伴们将对本次大会的所有技术报告进行逐一收集、整理与分享,尽最大努力为Zephyr开发者提供ZDS 2023技术报告的开发经验、实践成果以及解决方案的参考。
今天分享第14篇技术报告,题目为:
“Zephyr中CAN子系统概述”
作者简介
我叫 Navin Sankar,是一名拥有五年工作经验的嵌入式软件工程师。我热衷于使用 Zephyr 实时操作系统开发基于物联网的产品。多年来,我在这一领域积累了丰富的知识和专业技能。我为 Zephyr 实时操作系统贡献了一些补丁,这让我加深了对系统的理解。除了在 Zephyr 方面的工作,我还对硬件设计和实现微控制器的空中下载 (OTA) 支持有着浓厚的兴趣。我乐于迎接挑战,创造高效可靠的设计,突破嵌入式系统的极限。此外,开发 Linux 用户空间应用程序也是我职业生涯的重要组成部分,这让我能够充分利用 Linux 生态系统的强大功能。
文章简介
控制器局域网是汽车行业及其他行业广泛使用的通信协议。该协议为电子设备之间的数据传输提供了一种可靠、高效和灵活的方式,特别是在电磁干扰和条件恶劣的环境中。该分享将概述 CAN 协议、其历史、特点、CAN 位定时计算和经典CAN 和 CANFD 报文帧格式的配置。该分享还将重点关注驱动程序的执行、错误检测以及使用 can-utils 等工具配置和测试 zephyr 应用程序。
控制器局域网 (Controller Area Network,简称CAN或者CAN bus) 是一种功能丰富的车用总线标准。被设计用于在不需要主机(Host)的情况下,允许网络上的单片机和仪器相互通信。它基于消息传递协议,设计之初在车辆上采用复用通信线缆,以降低铜线使用量,后来也被其他行业所使用。
CAN建立在基于信息导向传输协定的广播机制(Broadcast Communication Mechanism)上。其根据信息的内容,利用信息标志符(Message Identifier,每个标志符在整个网络中独一无二)来定义内容和消息的优先顺序进行传递,而并非指派特定站点地址(Station Address)的方式。CAN协议经过 ISO标准化后有两个标准:ISO11898标准和 ISO115192标准。其中 ISO11898是针对通信速率为 125Kbps~1Mbps的高速通信标准,而 ISO115192是针对通信速率为125Kbps以下的低速通信标准。
因此,CAN拥有了良好的弹性调整能力,可以在现有网络中增加节点而不用在软、硬件上做出调整。除此之外,消息的传递不基于特殊种类的节点,增加了升级网络的便利性。
概念方面主要有以下几点:
控制器局域网
由Robert Bosch开发
ISO 11898标准
多主设备串行和广播总线
基于消息的协议
速度:125kbps - 1Mbps
CAN特性主要有以下几点:
多主设备和多节点架构
可靠的消息传输
仲裁和优先级设定
内置错误检测
成本低
使用双绞线
CAN应用领域有以下几方面:
CAN的物理层特征
从图中特性可以看出,显性电平对应逻辑0,其CAN_H和 CAN_L之差为 2.5V左右。而隐性 电平对应逻辑1,其CAN_H和 CAN_L之差为0V。在总线上显性电平具有优先权,只要有一个 单元输出显性电平,总线上即为显性电平。而隐形电平则具有包容的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平(显性电平比隐性电平更强),即:
一个CAN节点结构主要是由CAN收发器、CAN控制器以及MCU构成,如图所示:
CAN总线架构如图所示:
AN总线是一种广播类型的总线,其中所有节点都可以收到所有的消息传输,CAN提供了本地过滤以便监听到预期的消息。CAN有四种不同类型的消息帧,分别是数据帧、遥控帧、错误帧以及过载帧。
其中CAN消息帧的格式如图所示:
经典CAN与CAN FD的比较如表格所示:
Zephyr支持SocketCAN,它是Zephyr CAN API的BSD Socket实现并与Linux SocketCAN实现兼容。需要注意的是Socket CAN与Zephyr网络堆栈集成,帧会被路由到网络堆栈,而不是直接传递,这会增加一些计算和内存开销。
设备树示例代码:
设备驱动:声明驱动
设备驱动:初始化功能
设备驱动:API
应用程序:获取设备
应用程序:设置时间
应用程序:发送(阻塞API)
应用程序:发送(非阻塞API)
应用程序:接收(回调)
应用程序:接收(msgq)
can-utils包提供了基本的工具来显示、记录、生成和重播CAN流量,这对于调试、测试、简单原型设计非常有用。其中主要工具有:
cansend
candump
cangen
canplayer
cansniffer
canlogserver
cansend:发送单帧
candump:显示、过滤和记录数据到文件