Arduino CAN总线库完整开发指南
Arduino CAN库是一个专为Arduino平台设计的CAN总线通信库,支持通过CAN总线发送和接收数据。本指南将帮助您快速掌握该库的使用方法。
项目结构与兼容硬件
项目目录结构
- src/ - 核心源代码文件
- examples/ - 示例代码集合
- API.md - 详细的API文档
- library.properties - 库属性配置文件
兼容硬件
- 基于Microchip MCP2515的开发板/扩展板
- Arduino MKR CAN扩展板
- Espressif ESP32内置SJA1000兼容CAN控制器
硬件连接指南
MCP2515接线方式
| MCP2515引脚 | Arduino引脚 |
|---|---|
| VCC | 5V |
| GND | GND |
| SCK | SCK |
| SO | MISO |
| SI | MOSI |
| CS | 10 |
| INT | 2 |
CS和INT引脚可以通过CAN.setPins(cs, irq)进行修改。INT引脚仅在接收回调模式下需要,且必须支持通过attachInterrupt()进行中断。
ESP32接线方式
需要外接3.3V CAN收发器,如TI SN65HVD230。
| CAN收发器引脚 | ESP32引脚 |
|---|---|
| 3V3 | 3V3 |
| GND | GND |
| CTX | GPIO_5 |
| CRX | GPIO_4 |
CTX和CRX引脚可以通过CAN.setPins(rx, tx)进行修改。
安装方法
使用Arduino IDE库管理器
- 选择
Sketch->Include Library->Manage Libraries... - 在搜索框中输入
CAN - 点击选择该库
- 点击
Install按钮安装库
使用Git安装
cd ~/Documents/Arduino/libraries/
git clone https://gitcode.com/gh_mirrors/ar/arduino-CAN CAN
核心API详解
库初始化
#include <CAN.h>
void setup() {
CAN.begin(500E3); // 初始化CAN库,设置通讯速率为500kbps
}
支持的比特率包括:1000E3、500E3、250E3、200E3、125E3、100E3、80E3、50E3、40E3、20E3、10E3、5E3。
引脚配置
对于MCP2515:
CAN.setPins(cs, irq); // 必须在CAN.begin()之前调用
对于ESP32:
CAN.setPins(rx, tx); // 必须在CAN.begin()之前调用
数据发送
// 开始数据包
CAN.beginPacket(id);
CAN.beginPacket(id, dlc);
CAN.beginPacket(id, dlc, rtr);
// 写入数据
CAN.write(byte);
CAN.write(buffer, length);
// 结束数据包
CAN.endPacket();
数据接收
// 检查是否接收到数据包
int packetSize = CAN.parsePacket();
// 注册接收回调函数
CAN.onReceive(onReceive);
void onReceive(int packetSize) {
// 处理接收到的数据
}
示例代码分析
发送器示例
发送器示例展示了如何发送CAN数据包的基本流程。
接收器示例
接收器示例演示了如何接收和处理CAN数据包。
回调接收器示例
回调接收器示例展示了使用中断回调方式接收CAN数据包。
高级功能
数据过滤
CAN.filter(id);
CAN.filter(id, mask);
CAN.filterExtended(id);
CAN.filterExtended(id, mask);
工作模式
- 环回模式:
CAN.loopback()- 任何发出的数据包也会被接收 - 睡眠模式:
CAN.sleep()- 将CAN控制器置于睡眠模式 - 唤醒模式:
CAN.wakeup()- 从睡眠模式唤醒CAN控制器
SPI频率设置(仅MCP2515)
CAN.setSPIFrequency(frequency); // 默认10MHz
时钟频率设置(仅MCP2515)
CAN.setClockFrequency(clockFrequency); // 默认16MHz
开发注意事项
- 逻辑电平转换:对于工作在3.3V的开发板,必须使用逻辑电平转换器
- 引脚配置:所有引脚配置必须在
CAN.begin()之前完成 - 中断引脚:INT引脚必须支持通过
attachInterrupt()进行中断 - SPI频率:某些逻辑电平转换器无法支持10MHz的高速度,可以使用
CAN.setSPIFrequency()降低SPI频率
故障排除
- 确保所有接线正确无误
- 检查CAN总线终端电阻是否正确连接
- 验证比特率设置是否与网络中的其他节点匹配
- 确认使用的硬件与库兼容
通过本指南,您可以快速开始使用Arduino CAN库进行CAN总线通信开发。建议从示例代码开始,逐步深入理解库的各项功能。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



