Air8000模块CAN接口硬件连接指南,来啦!
在进行CAN通信开发前,正确的硬件连接至关重要。本节将详细介绍Air8000模块CAN接口的引脚定义、外部收发器选型及典型电路连接方式,确保开发者能够搭建稳定可靠的硬件通信链路。
一、CAN 概述
控制器局域网(Controller Area Network,CAN)是一种广泛应用于工业控制、汽车电子等领域的实时通信协议,由德国博世公司于 1986 年提出并标准化(ISO 11898)。其核心采用多主(Multi-Master)总线架构,通过差分信号传输实现高抗干扰能力,支持节点间以广播形式进行高效、可靠的数据交换。CAN 协议基于非破坏性仲裁机制,利用报文 ID 优先级解决总线冲突,确保高优先级数据实时传输,同时具备完善的错误检测、帧校验和故障节点自动关闭功能,满足严苛环境下的安全性需求。典型应用包括汽车 ECU 通信(如动力总成、车身控制)、工业自动化(如 PLC 联网)及医疗设备互联,其衍生协议如 CAN FD(灵活数据率)进一步提升了带宽与灵活性,成为现代分布式控制系统的基础技术之一。
二、演示功能概述
本篇文章演示的内容为:用两种方式测试 Air8000 的 CAN 功能,第一种是使用 Air8000 整机开发板使用 CAN 连接 CAN 转 USB 工具,进行数据收发,第二种是使用 Air8000 整机开发板和 Air8000 整机开发板进行 CAN 功能的收发测试。
三、准备硬件环境
参考:硬件环境清单第二章节内容,准备以及组装好硬件环境。
3.1 Air8000 整机开发板

3.2 高速 USB-CAN 分析仪

3.3 硬件连接图
Air8000 整机板和 USB-CAN 分析仪链接图:
CAN 总线采用差分信号传输,由两根线组成:
CAN 采用差分信号传输,通过两根信号线(CANH 和 CANL)传输数据。两根线上的信号相位相反,即使存在干扰,接收端也能通过差值还原出原始数据。所以 CAN 接线可以不接 GND

Air8000 整机开发板和 Air8000 整机开发板连接图:

四、准备软件环境
在开始实践本示例之前,先筹备一下软件环境:
-
Luatools 工具;
-
内核固件文件(底层 core 固件文件):LuatOS-SoC_V2008_Air8000_VOLTE.soc;参考项目使用的内核固件;
-
luatos 需要的脚本和资源文件
gitee 下载地址:https://gitee.com/openLuat/LuatOS/blob/master/module/Air8000/demo/can/main.lua
LuatOS 运行所需要的 lib 文件:
使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件
准备好软件环境之后,接下来查看如何烧录项目文件到 Air8000,将本篇文章中演示使用的项目文件烧录到 Air8000 中。
五、代码 API 和代码解析
5.1 代码 API
can.init(id, rx_message_cache_max)
CAN 总线初始化
参数

返回值

例子

can.on(id, func)
注册 CAN 事件回调
参数

返回值

例子

can.timing(id, br, PTS, PBS1, PBS2, SJW)
CAN 总线配置时序
参数

返回值

例子

can.mode(id, mode)
CAN 总线设置工作模式
参数

返回值

例子

can.node(id, node_id, id_type)
CAN 总线设置节点 ID,这是一种简易的过滤规则,只接收和 ID 完全匹配的消息,和 can.filter 选择一个使用
参数

返回值

例子

can.tx(id, msg_id, id_type, RTR, need_ack, data)
CAN 发送一条消息
参数

返回值

例子

can.rx(id)
从缓存里读出一条消息
参数

返回值

例子

can.debug(on_off)
CAN debug 开关,打开后有更详细的打印
参数

返回值
无
例子

zbuff.create(length,data,type)
创建 zbuff
参数

返回值

例子

buff:set(start, num, len)
zbuff 的类似于 memset 操作,类似于 memset(&buff[start], num, len),当然有 ram 越界保护,会对 len 有一定的限制
参数

返回值
无
例子

buff:seek(base,offset)
zbuff 设置光标位置(可能与当前指针位置有关;执行后指针会被设置到指定位置)
参数

返回值

例子

mcu.x32(value)
转换 10 进制数为 16 进制字符串输出
参数

返回值

例子

5.2 常量值解释

5.3 代码解析
1.配置 SELF_TEST_FLAG 为正常收发模式,节点配置为 A 节点,对应的 rx 的 id 为 0x12345678,tx 的 id 为 0x12345677,代码里面使用的 id 为扩展帧,扩展帧和标准帧的区别:
CAN 协议中标准帧和扩展帧的主要区别体现在以下几个方面:
5.3.1 标识符长度与节点数量
1.标准帧
2.扩展帧
5.3.2 数据传输能力
标准帧数据长度限制为 8 字节,超过部分会被填充或忽略。
扩展帧数据长度可达 0-64 字节,通过分段传输(如 ISO-TP 协议)实现大容量数据传输。
5.3.3 控制字段差异
标准帧:6 位控制字段(如 DLC、R0、IDE 位)。
扩展帧:4 位控制字段(如 DLC、R1、IDE 位),部分功能由扩展标识符扩展。
配置了 STB 的 pin 用于不同硬件的控制,创建了 Zbuff 存储发送数据

2.初始化 CAN 总线,设置 id 和接收缓存消息数,注册 CAN 事件的回调函数,对 cb_type 进行对比,can.CB_MSG 为对有新数据写入缓存进行读取处理,can.CB_TX 为数据发送结束,需要根据后续 param 确定发送成功还是失败,can.CB_ERR 为有错误报告,后续 param 是错误码,can.CB_STATE 为总线状态变更,后续 param 是新的状态,也可以用 can.state 读出,然后对 can 总线的时序进行配置,代码里配置的是 1Mbps,然后根据上面的是否是自测模式的变量进行判断,如果是自测模式就使用 can.mode 配置 can 总线的工作模式为自测模式 can.MODE_TEST,如果是正常工作模式就配置为 can.MODE_NORMAL,本文档中使用的为扩展帧,配置节点 ID 为 CAN.EXT,如果要使用标准帧配置为 CAN.STD,其中 STB 的管脚,
关于 CAN_STB 信号:
1. 电源管理(待机模式控制)
低功耗模式:当系统需要进入节能状态时(如汽车熄火或设备待机),CAN_STB 信号可被触发(高电平或低电平,取决于硬件设计),使 CAN 收发器进入低功耗待机模式。此时,收发器停止正常通信以降低能耗。
唤醒功能:当需要恢复通信时,CAN_STB 信号状态切换(如拉低或拉高),将收发器从待机模式唤醒,重新激活 CAN 总线的数据传输。
2. 硬件控制
收发器启用/禁用:在某些 CAN 收发器芯片(如 TI 的 SN65HVD230)中,STB(Standby)引脚直接控制收发器的工作状态。例如:
STB = 高电平:收发器关闭,仅消耗微量静态电流。
STB = 低电平:收发器正常工作,可收发 CAN 信号。
系统集成:在复杂系统中,CAN_STB 可能由主控制器(如 MCU)输出,协调多个 CAN 节点的电源状态,优化整体能耗。
3. Air8000 整机开发板设计
注意!Air8000 整机开发板,CAN_STB 信号是直接引出来的,所以需要控制 GPIO 的电平拉低:
STB 为低电平是正常工作,所以需要手动把 gpio27 也就是 CAN_STB 拉低才可以

3.设置循环定时器,2 秒钟发一次数据,根据节点判断是 A 节点还是 B 节点打印节点发送信息,设置 test_cnt 计数器,每发送一次 +1,>8 的时候,设置为 1,然后使用 tx_buf:set(0,test_cnt)函数,把 buff 里面的内容设置成从索引 0 开始,连续 8 个字节被填充为 test_cnt,因为 zbuff 创建空间位 8,所以是 8 个字节,然后利用 tx_buf:seek 把光标位置设置为 test_cnt 的值,比如:填充完之后内容为 01 01 01 01 01 01 01 01,设置第一个光标的值设置完为 01,设置第二个光标为 01 01,然后利用 can.tx 发送内容,其中有涉及到是否需要应答的机制,can.tx 的第五个参数,need_ack
其中该机制为:
CAN 协议中的应答机制是其核心可靠性保障措施之一,主要通过以下方式实现:
1、应答机制的核心组成
ACK 应答位
应答间隙(ACK SLOT)
应答界定符(ACK DELIMITER)
2、应答机制的工作流程
数据传输
发送节点发送数据帧后进入等待应答状态,总线进入仲裁阶段。
仲裁与应答
错误处理

六、运行结果展示
6.1 完整代码

6.2 结果展示

使用两个 Air8000 整机开发板测试结果:

一个开发板为节点 A,一个开发板为节点 B,互相发送数据接收对方的数据。
七、总结
本文演示如何在 Air8000 整机开发板上面,用 CAN 接口,使用 USB 转 CAN 工具进行数据的收发,然后使用 Air8000 整机开发板和 Air8000 整机开发板两个开发板把 CAN 接口进行互连,进行双方数据的互发互收的演示。
八、常见问题
1.如何判断模块是否正常,如何自测?
如果有 CAN 收发器的情况下,直接设置为 can.mode(can_id, can.MODE_TEST)测试然后日志提示发送成功,则表示模块端的 CAN 接口功能均正常。如果发送失败,则需要短接模块的 CAN_TX 和 CAN_RX,测试是否发送正常,如果发送正常,证明模块这两个脚是是没有问题的,测量下 STB 的电平是否是低,如果为高,则需要代码里面设置对应的 gpio 拉低。
九、硬件电路说明
Air8000 CAN 硬件电路说明:https://docs.openluat.com/air8000/luatos/hardware/design/can/
今天的内容就分享到这里了!

浙公网安备 33010602011771号