基于 XIAO 的 CAN 总线扩展板
XIAO CAN总线扩展板专为Seeed Studio XIAO开发板设计,为您的项目提供了一种简便的方式来添加CAN总线通信功能。CAN总线(控制器局域网)是一种广泛应用于汽车、工业和其他嵌入式系统中的通信协议,可实现不同节点之间可靠且稳健的数据交换。
扩展板上集成的MCP2515控制器和SN65HVD230收发器芯片确保了在CAN总线上的无缝和高效通信。MCP2515控制器负责协议管理、消息过滤和错误处理,而SN65HVD230收发器将控制器的数字信号转换为CAN总线通信所需的差分信号。
借助XIAO CAN总线扩展板,您可以充分利用Seeed Studio XIAO开发板及其广泛的生态系统,创建需要CAN总线通信的项目。无论您是在开发汽车应用、工业控制系统、机器人项目还是物联网设备,该扩展板为将CAN总线功能集成到设计中提供了可靠且紧凑的解决方案。
该扩展板采用用户友好的端子连接,使您可以轻松连接CANH和CANL线到CAN总线网络。板卡的紧凑设计确保与各种项目外壳兼容,并便于无缝集成到您现有的设置中。
通过利用XIAO CAN总线扩展板,您可以充分利用CAN总线协议的稳定性、可靠性和可扩展性,在您的项目中实现高效的数据交换、系统控制和互联互通。
介绍
特点
- 兼容性:专为与Seeed Studio XIAO开发板无缝配合使用而设计。
- MCP2515控制器:板载的MCP2515芯片可可靠地控制和处理CAN总线通信。
- SN65HVD230收发器:集成的SN65HVD230芯片确保准确的信号转换和CAN总线上的稳健通信。
- 端子连接:通过3针端子方便地访问CANH和CANL线路,便于与CAN总线进行简单连接。
- 紧凑设计:该扩展板采用紧凑的外形设计,适用于各种应用场景。
规格
- 兼容性:Seeed Studio XIAO开发板。
- 通信接口:CAN总线(Controller Area Network)。
- CAN收发器:SN65HVD230。
- CAN控制器:MCP2515。
- 端子连接:用于CANH和CANL线的2针端子。
应用领域
XIAO CAN总线扩展板可以在需要CAN总线通信的各种项目中使用。以下是一些应用创意,希望能给您带来灵感:
- 汽车项目:将扩展板连接到XIAO并构建需要CAN总线通信的汽车应用程序,如车辆诊断或数据记录。
- 工业控制系统:利用CAN总线功能与工业设备和系统进行接口连接,实现高效的数据交换和控制。
- 机器人技术:将扩展板纳入您的机器人项目中,实现不同机器人模块和组件之间的通信。
- 物联网应用:将扩展板与物联网设备集成,以便通过CAN总线协议进行通信和数据交换。
请参考XIAO CAN总线扩展板的数据手册和示例,以获取详细的使用说明和代码示例。
硬件概述
- GND
- CAN-H
- CAN-L
- 用于RX/TX的LED指示灯
- SN65NVD230
- MCP2515
XIAO CAN总线扩展板在板子背面有一个标有P1的焊盘,如果将其短接,会在设备上添加一个终端电阻。考虑到一些用户的通信设备可能已经具有终端电阻,XIAO CAN总线扩展板默认情况下不会将P1短接。如果您发现CAN通信无法发送或接收消息,您可以尝试短接P1焊盘,以获得一个120欧姆的终端电阻。
Arduino 库概述
我们提供一个 Arduino库用于MCP2515板。
该库包含多个示例,包括:
- OBDII-PIDs(On-Board Diagnostic-II Parameter IDs)示例 - 从OBD-II接口检索数据
- 发送 - 向CAN总线发送一帧数据
- 接收 - 从CAN总线接收一帧数据
- 设置掩码过滤器接收 - 从CAN总线接收带有屏蔽和过滤设置的帧
1. 设置波特率
该函数用于初始化CAN总线系统的波特率。
可用的波特率如下所示:
#define CAN_5KBPS 1
#define CAN_10KBPS 2
#define CAN_20KBPS 3
#define CAN_25KBPS 4
#define CAN_31K25BPS 5
#define CAN_33KBPS 6
#define CAN_40KBPS 7
#define CAN_50KBPS 8
#define CAN_80KBPS 9
#define CAN_83K3BPS 10
#define CAN_95KBPS 11
#define CAN_100KBPS 12
#define CAN_125KBPS 13
#define CAN_200KBPS 14
#define CAN_250KBPS 15
#define CAN_500KBPS 16
#define CAN_666kbps 17
#define CAN_1000KBPS 18
2. 设置接收掩码和过滤器
控制器芯片有2个接收掩码寄存器和5个过滤器寄存器,可以用来确保从目标设备接收数据。这些寄存器在具有许多节点的大型网络中特别有用。我们提供了两个函数,允许您利用这些掩码和过滤器寄存器。
掩码:
init_Mask(unsigned char num, unsigned char ext, unsigned char ulData);
过滤器:
init_Filt(unsigned char num, unsigned char ext, unsigned char ulData);
- num 代表要使用的寄存器。您可以填写0或1作为掩码,以及0到5作为过滤器。
- ext 表示帧的状态。0表示它是用于标准帧的掩码或过滤器。1表示它用于扩展帧。
- ulData 代表掩码或过滤器的内容
3. 检查接收
MCP2515控制器芯片具有以轮询模式或中断模式运行的能力。在轮询模式下,软件定期检查是否接收到了帧。在中断模式下,可以使用其他引脚来表示已接收到帧或传输已完成。这样可以更高效地利用资源,因为处理器不需要不断检查传入数据。
该函数用于检查接收缓冲区中是否有待处理的接收帧。如果有,则函数将返回true,否则返回false。您可以在循环中使用该函数来持续检查接收帧
INT8U MCP_CAN::checkReceive(void);
4. 获取CAN ID
您可以使用以下函数来获取从“发送”节点接收到的数据的长度。
INT32U MCP_CAN::getCanId(void)
5. 发送一个帧
CAN.sendMsgBuf(INT8U id, INT8U ext, INT8U len, data_buf);
该函数用于将数据发送到CAN总线上。参数如下:
- id - CAN帧的ID。
- ext - 表示帧状态的布尔值。'0’表示标准帧,'1’表示扩展帧。
- len - 帧的长度。
- data_buf - 消息的内容。
例如,在“发送”示例中,我们有
unsigned char stmp[8] = {0, 1, 2, 3, 4, 5, 6, 7};
CAN.sendMsgBuf(0x00, 0, 8, stmp); //send out the message 'stmp' to the bus and tell other devices this is a standard frame from 0x00.
6.
接收一个帧
以下函数用于在“接收”节点上接收数据:
CAN.readMsgBuf(unsigned char len, unsigned char buf);
在设置了掩码和过滤器条件的情况下,该函数只能获取符合掩码和过滤器要求的数据帧。
- len 表示数据的长度。
- buf 是存储数据的位置。
入门指南
硬件
该产品不包含XIAO模块,因此您需要单独购买一个XIAO模块。在本示例中,我们使用XIAO ESP32C3进行演示,但其他版本的XIAO模块也可以类似地工作。硬件连接非常简单 - 只需将XIAO模块插入扩展板即可。
请参考下方的图表以获取与XIAO的连接方式。
软件
第一步. 从Github下载 CAN总线库 。
第二步. 参考 如何安装库 安装Arduino库。
第三步. 在正确下载和安装库之后,您可以在示例文件夹中找到一个名为send.ino的示例程序。该程序是为D7S模块设计的。
#include <mcp_can.h>
#include <SPI.h>
/* Please modify SPI_CS_PIN to adapt to different baords.
CANBed V1 - 17
CANBed M0 - 3
CAN Bus Shield - 9
CANBed 2040 - 9
CANBed Dual - 9
OBD-2G Dev Kit - 9
OBD-II GPS Kit - 9
Hud Dev Kit - 9
*/
#define SPI_CS_PIN D7
MCP_CAN CAN(SPI_CS_PIN); // Set CS pin
void setup()
{
Serial.begin(115200);
while(!Serial);
// below code need for OBD-II GPS Dev Kit Atemga32U4 version
// pinMode(A3, OUTPUT);
// digitalWrite(A3, HIGH);
// below code need for OBD-II GPS Dev Kit RP2040 version
// pinMode(12, OUTPUT);
// digitalWrite(12, HIGH);
while (CAN_OK != CAN.begin(CAN_500KBPS)) // init can bus : baudrate = 500k
{
Serial.println("CAN BUS FAIL!");
delay(100);
}
Serial.println("CAN BUS OK!");
}
unsigned char stmp[8] = {0, 1, 2, 3, 4, 5, 6, 7};
void loop()
{
CAN.sendMsgBuf(0x00, 0, 8, stmp);
delay(100); // send data per 100ms
}
// END FILE
第四步. 上传示例程序。如果您不知道如何上传代码,请查看 如何上传代码.
第五步. 在成功上传代码后,您会注意到RX和TX指示灯亮起,表示CAN总线正在主动传输数据。如果您的CAN总线连接到其他设备,这些指示灯将会闪烁而不是保持常亮状态。
原理图在线查看器
故障排除
Q1: XIAO CAN总线扩展板支持的最大波特率是多少?
扩展板上的MCP2515控制器支持的最大波特率为1 Mbps。请确保您的CAN总线网络的波特率设置与此限制兼容。
Q2: 我可以在同一个CAN总线网络中使用多个XIAO CAN总线扩展板吗?
是的,您可以在同一个CAN总线网络中使用多个扩展板。每个扩展板应分配一个唯一的节点ID,以确保正确的通信并避免总线上的冲突。
Q3: 我可以将XIAO CAN总线扩展板与其他微控制器或开发板一起使用吗?
XIAO CAN总线扩展板专为Seeed Studio XIAO开发板设计。然而,通过正确的引脚映射和配置,可能可以将其与其他支持必要的CAN总线通信协议的微控制器或开发板一起使用。
Q4: 对于CAN总线连接,是否存在最大电缆长度的限制?
CAN总线连接的最大电缆长度取决于波特率、电缆质量和电磁干扰等因素。一般而言,对于较低的波特率,可以支持更长的电缆长度(长达几百米)。然而,对于较高的波特率,建议将电缆长度保持较短(在几米范围内),以保持可靠的通信。
Q5: 如何排除CAN总线通信问题?
如果遇到CAN总线通信问题,可以按照以下步骤进行故障排除:
- 检查CAN总线网络的物理连接,确保正确的接线和终端。 -检查波特率设置,并确保它们与连接到CAN总线的所有设备匹配
- 使用CAN总线分析仪或终端软件监控CAN总线流量,以识别传输消息中的任何错误或问题。
- 仔细检查程序代码以正确初始化和配置MCP2515控制器。
- 确保XIAO开发板和CAN总线网络的供电稳定,且在规定的电压范围内。
- 如果您有任何其他问题或本常见问题部分未涵盖的问题,请随时联系我们的技术支持团队以获得进一步的帮助。
资源
- [ZIP] XIAO CAN总线扩展板原理图和PCB设计文件
- [PDF] 数据手册 - MCP2515
- [PDF] 数据手册 - SN65HVD230
技术支持和产品讨论
感谢您选择我们的产品!我们将为您提供不同的支持,以确保您对我们产品的体验尽可能顺畅。我们提供多种沟通渠道,以满足不同的偏好和需求。