CAN总线作为应用广泛的现场总线,在汽车电子与工业领域占据核心地位,凭借高可靠性、多主控制等特性,成为自动化领域的关键技术。I.MX6ULL集成FlexCAN外设,为CAN设备开发提供硬件基础,本章聚焦该开发板CAN接口的驱动开发。
一、CAN协议核心解析
1. 协议基础与特性
CAN全称控制器局域网,由博世开发,现已成为ISO11898国际标准,最初服务于汽车电子,如今已拓展至工业、医疗、船舶等多领域。其核心特性包括:
- 多主控制:总线空闲时,所有单元均可主动发送消息,若多单元同时发送,通过标识符逐位仲裁,显性电平多的单元优先级更高,可继续发送,失利单元转为接收状态。
- 系统灵活性:总线上单元无地址标识,新增单元时,其他单元软硬件及应用层无需改动。
- 通信性能:最高速率达1Mbps,传输距离最远可达10km,速率与距离呈负相关。
- 高可靠性:具备错误检测、通知与恢复功能,可识别暂时性与持续性错误,对持续错误单元实现故障封闭,防止影响总线运行。
- 节点容量:理论上连接单元数无限制,实际受时间延迟与电气负载约束,降低速率可增加连接单元数。
2. 电气与物理连接
CAN总线采用双线差分传输,即CAN_H与CAN_L。显性电平代表逻辑0,CAN_H与CAN_L电位差为2V;隐性电平代表逻辑1,电位差为0V,总线空闲时保持隐性。所有单元通过双线并联,总线两端需接入120Ω端接电阻,用于匹配阻抗、吸收信号反射,保障通信稳定。
3. 协议帧结构
CAN协议定义5种帧格式,各司其职:
-数据帧:用于节点间数据传输,含帧起始、仲裁段、控制段、数据段、CRC段、ACK段与帧结束7部分,标准帧ID为11位,扩展帧ID为29位,数据段支持0-8字节。
- 遥控帧:接收单元向发送单元请求数据,结构与数据帧相似,无数据段,RTR位为隐性,DLC表示请求数据的长度。
- 错误帧:检测到错误时发送,由错误标志与错误界定符组成,错误标志含主动显性与被动隐性两种。
- 过载帧:接收单元未做好接收准备时发送,由过载标志与过载界定符构成,用于延缓后续帧发送。
- 间隔帧:分隔数据帧与遥控帧,由3个隐性位与可变长度的总线空闲组成,过载帧与错误帧前不可插入。
4. 位时序与波特率
CAN总线以位传输数据,每位分同步段、传播时间段、相位缓冲段1、相位缓冲段2四段,以时间量子为最小单位。波特率由总时间量子数计算,同步段固定1Tq,其余段可通过寄存器灵活配置,再同步补偿宽度用于补偿时钟误差,保障节点同步。
5. 仲裁机制
总线空闲时,最先发送的单元获发送权;多单元同时发送时,从仲裁段首位开始逐位比较,连续输出显性电平最多的单元胜出,继续发送,失利单元立即停止发送转为接收,确保总线有序访问。
二、I.MX6ULL FlexCAN控制器
I.MX6ULL搭载FlexCAN控制器,符合CAN2.0B协议,支持标准与扩展帧格式,最高速率1Mbps,具备64个消息缓冲,特性如下:
- 支持灵活的消息邮箱配置,每个邮箱可设为接收或发送,适配标准与扩展格式,配备独立接收掩码与强大的ID过滤功能。
- 未使用空间可作通用RAM,支持回测模式用于自测,具备可编程优先级与多种工作模式。
FlexCAN支持正常、冻结、仅监听、回环四种工作模式,以及禁止、停止两种低功耗模式。正常模式下,所有CAN功能启用;冻结模式禁止收发,总线同步丢失;仅监听模式仅接收ACK消息,冻结错误计数器;回环模式用于自测,发送数据直接反馈至内部接收单元。通过控制寄存器的PRESDIV、PROPSEG、PSEG1、PSEG2与RJW位域,可配置位时序,进而精准设定波特率。
三、硬件原理与设备树配置
1. 硬件原理图
正点原子I.MX6U-ALPHA开发板的CAN接口,以I.MX6ULL的FlexCAN1为核心,其TX、RX引脚复用UART3_CTS、UART3_RTS,外接TJA1050收发器,将信号转换为CAN_H、CAN_L总线,并配备120Ω端接电阻,保障信号稳定传输。
2. 设备树配置
- 引脚配置:在板级DTS文件中定义pinctrl_flexcan1引脚组,将UART3相关引脚复用为FlexCAN1的收发引脚,设置电气属性。
- 控制器使能:在imx6ull-alientek-emmc.dts中,为flexcan1节点指定引脚组、3.3V收发器供电,将status设为"okay",启用控制器;同时屏蔽FlexCAN2节点,避免与ECSPI3冲突。
四、内核驱动配置与测试工具移植
1. 内核驱动使能
- 开启CAN总线子系统:进入内核配置菜单,在Networking support中勾选CAN bus subsystem support。
- 启用FlexCAN驱动:在CAN Device Drivers中,选中Platform CAN drivers with Netlink support,再勾选Support forFreescaleFLEXCAN based chips,编译内核。
2. 测试工具移植
- iproute2移植:Busybox自带的ip命令不支持CAN操作,需交叉编译iproute2源码,修改Makefile的CC为arm-linux-gnueabihf-gcc,编译后将ip命令安全替换至开发板/sbin目录,替换前务必备份原文件,防止系统启动失败。
- can-utils移植:解压can-utils源码,执行autogen.sh生成配置,交叉编译并安装,将生成的cansend、candump等工具拷贝至开发板/usr/bin目录,为CAN测试提供工具支撑。
五、CAN通信测试
1.网卡检测
使用新编译的内核与设备树启动开发板,执行ifconfig命令,可看到名为can0的网卡,即FlexCAN1对应的网络设备,若启用FlexCAN2,还会出现can1网卡。
2. 通信测试
因开发板仅一个CAN接口,需外接USB转CAN设备协同测试:
- 接口初始化:用ip命令设置can0波特率为500kbps,启动网卡,命令为iplink set can0 type can bitrate 500000与ifconfig can0 up。
- 数据收发:运行candump can0后台监听数据,USB转CAN设备以相同波特率发送标准帧数据,开发板可准确接收;反之,在开发板执行cansend can0 5A111.22.33.44.55.66.77.88,USB转CAN设备也能正常接收,验证CAN驱动功能正常。
CAN驱动开发需精准把握协议原理、硬件配置与工具适配,通过规范的设备树配置、内核驱动使能与严谨的测试流程,可快速实现I.MX6ULL开发板的CAN接口驱动,为汽车、工业等领域的应用开发筑牢基础。