7,654
社区成员
发帖
与我相关
我的任务
分享
| 序号 | 工具 | 作用 | 厂家 |
|---|---|---|---|
| 1 | Qualcomm Arduino UNO Q开发板 | 数据包收发 | Qualcomm |
| 2 | CAN总线模块 | CAN控制器+CAN收发器 | zave |
| 3 | CAN分析仪 | 读取分析CAN数据包 | 芯世纪 |
| CAN分析仪 | CAN总线模块 | Qualcomm Arduino UNO Q开发板 |
|---|---|---|
| -- | VCC | 5V |
| -- | GND | GND |
| -- | CS | 10 |
| -- | SO | 12 |
| -- | SI | 11 |
| -- | SCK | 13 |
| -- | INT | 2 |
| CAN_H | CAN_H | -- |
| CAN_L | CAN_L | -- |







#include "SPI.h"
#include "mcp2515.h"
#include "ArduinoGraphics.h"
#include "Arduino_LED_Matrix.h"
ArduinoLEDMatrix matrix;
unsigned long txCount = 0;
unsigned long rxCount = 0;
bool txDone = false;
#define RX_BUF_SIZE 64
uint8_t canRxBuffer[RX_BUF_SIZE];
int rxIndex = 0;
unsigned long lastDisplayTime = 0;
const unsigned long DISPLAY_INTERVAL = 3000;
// ========== MCP2515 CAN 模块 ==========
struct can_frame canMsg1;
struct can_frame canMsg2;
struct can_frame canMsg;
MCP2515 mcp2515(10);
const int potPin = A0;
void setup()
{
Serial.begin(115200);
delay(1000);
SPI.begin();
matrix.begin();
scrollText("CAN-DEMO", 100);
delay(5000);
mcp2515.reset();
//scrollText("CAN-Reset", 100);
mcp2515.setBitrate(CAN_125KBPS, MCP_8MHZ);
//scrollText("CAN-SetBitRate", 100);
mcp2515.setNormalMode();
//scrollText("CAN-NormalMode", 100);
// 初始化发送消息1
canMsg1.can_id = 0x0001;
//scrollText("0x0001", 100);
canMsg1.can_dlc = 8;
//scrollText("8", 100);
canMsg1.data[0] = 0x00;
//scrollText("0x00", 100);
canMsg1.data[1] = 0x01;
//scrollText("0x01", 100);
canMsg1.data[2] = 0x02;
//scrollText("0x02", 100);
canMsg1.data[3] = 0x03;
//scrollText("0x03", 100);
canMsg1.data[4] = 0x04;
//scrollText("0x04", 100);
canMsg1.data[5] = 0x05;
//scrollText("0x05", 100);
canMsg1.data[6] = 0x06;
//scrollText("0x05", 100);
canMsg1.data[7] = 0x07;
//scrollText("0x06", 100);
// 初始化发送消息2
canMsg2.can_id = 0x0002;
//scrollText("0x0002", 100);
canMsg2.can_dlc = 8;
//scrollText("8", 100);
canMsg2.data[0] = 0x00;
//scrollText("0x00", 100);
canMsg2.data[1] = 0x01;
//scrollText("0x01", 100);
canMsg2.data[2] = 0x02;
//scrollText("0x02", 100);
canMsg2.data[3] = 0x03;
//scrollText("0x03", 100);
canMsg2.data[4] = 0x04;
//scrollText("0x04", 100);
canMsg2.data[5] = 0x05;
//scrollText("0x05", 100);
canMsg2.data[6] = 0x06;
//scrollText("0x05", 100);
canMsg2.data[7] = 0x07;
//scrollText("0x06", 100);
sendCanFrame();
txDone = true;
}
void loop()
{
receiveCanFrame();
unsigned long now = millis();
if (now - lastDisplayTime >= DISPLAY_INTERVAL)
{
lastDisplayTime = now;
String status = "TX:" + String(txCount) + " RX:" + String(rxCount);
scrollText(status.c_str(), 100);
}
}
void scrollText(const char* text, int speed)
{
matrix.beginDraw();
matrix.stroke(0xFFFFFFFF);
matrix.textScrollSpeed(speed);
matrix.textFont(Font_5x7);
matrix.beginText(0, 1, 0xFFFFFF);
matrix.println(text);
matrix.endText(SCROLL_LEFT);
matrix.endDraw();
}
// ========== 发送CAN报文 ==========
void sendCanFrame()
{
mcp2515.sendMessage(&canMsg1);
mcp2515.sendMessage(&canMsg2);
txCount += 2;
String msg = "TX:" + String(txCount);
scrollText(msg.c_str(), 100);
delay(500);
}
// ========== 接收CAN报文 ==========
void receiveCanFrame()
{
while (mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK)
{
rxCount++;
String msg = "RX:" + String(rxCount);
scrollText(msg.c_str(), 100);
}
}
| 时间 | 显示内容 | 说明 |
|---|---|---|
| 启动时 | CAN-DEMO` 从右向左滚动 | 初始化完成 |
| 1秒后 | TX1滚动显示 | 发送了第一条CAN报文 |
| 1秒后 | TX1滚动显示 | 发送了第二条CAN报文 |
| 循环接收 | T1R0→T1R1→T1R2... | 显示发送/接收计数 |
| 接收数据时 | RX1、RX2`... | 每收到一条计数RX |
| 场景 | LED显示 |
|---|---|
| 只有发送,无其他CAN节点 | CAN-DEMO→TX1→T1R0(一直不变) |
| 有另一个CAN节点回复 | CAN-DEMO→TX1→RX1→T1R1→RX2... |
| 收到很多数据 | 频繁显示RX1、RX2、RX3... |

| 序号 | 工具 | 作用 | 厂家 |
|---|---|---|---|
| 1 | Arduino UNO R3 开发板 | 数据包收发 | Arduino |
| 2 | CAN总线模块 | CAN控制器+CAN收发器 | zave |
| 3 | CAN总线模块 | CAN控制器+CAN收发器 | zave |
| 4 | Arduino Nano 开发板 | 数据包收发 | Arduino |
| Arduino UNO R3 开发板 | CAN总线模块 | CAN总线模块 | Arduino Nano 开发板 |
|---|---|---|---|
| 5V | VCC | VCC | 5V |
| GND | GND | GND | GND |
| 10 | CS | CS | D10 |
| 12 | SO | SO | D12 |
| 11 | SI | SI | D11 |
| 13 | SCK | SCK | D13 |
| 2 | INT | INT | D2 |
| -- | CAN_H | CAN_H | -- |
| -- | CAN_L | CAN_L | -- |
#include "SPI.h"
#include "mcp2515.h"
unsigned long txCount = 0;
unsigned long rxCount = 0;
bool txDone = false;
#define RX_BUF_SIZE 64
uint8_t canRxBuffer[RX_BUF_SIZE];
int rxIndex = 0;
unsigned long lastDisplayTime = 0;
const unsigned long DISPLAY_INTERVAL = 3000;
// ========== MCP2515 CAN 模块 ==========
struct can_frame canMsg1;
struct can_frame canMsg2;
struct can_frame canMsg;
MCP2515 mcp2515(10);
void setup()
{
Serial.begin(115200);
delay(5000);
mcp2515.reset();
mcp2515.setBitrate(CAN_125KBPS);
mcp2515.setNormalMode();
// 初始化发送消息1
canMsg1.can_id = 0x0001;
canMsg1.can_dlc = 8;
canMsg1.data[0] = 0x00;
canMsg1.data[1] = 0x01;
canMsg1.data[2] = 0x02;
canMsg1.data[3] = 0x03;
canMsg1.data[4] = 0x04;
canMsg1.data[5] = 0x05;
canMsg1.data[6] = 0x06;
canMsg1.data[7] = 0x07;
// 初始化发送消息2
canMsg2.can_id = 0x0002;
canMsg2.can_dlc = 8;
canMsg2.data[0] = 0x00;
canMsg2.data[1] = 0x01;
canMsg2.data[2] = 0x02;
canMsg2.data[3] = 0x03;
canMsg2.data[4] = 0x04;
canMsg2.data[5] = 0x05;
canMsg2.data[6] = 0x06;
canMsg2.data[7] = 0x07;
sendCanFrame();
txDone = true;
}
void loop()
{
receiveCanFrame();
unsigned long now = millis();
if (now - lastDisplayTime >= DISPLAY_INTERVAL)
{
lastDisplayTime = now;
String status = "TX:" + String(txCount) + " RX:" + String(rxCount);
Serial.println(status.c_str());
}
}
// ========== 发送CAN报文 ==========
void sendCanFrame()
{
mcp2515.sendMessage(&canMsg1);
mcp2515.sendMessage(&canMsg2);
txCount += 2;
String msg = "TX:" + String(txCount);
Serial.println(msg.c_str());
delay(500);
}
// ========== 接收CAN报文 ==========
void receiveCanFrame()
{
while (mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK)
{
rxCount++;
String msg = "RX[" + String(rxCount) + "] ";
if (canMsg.can_id & CAN_EFF_FLAG)
{
msg += "ID:0x" + String(canMsg.can_id & CAN_EFF_MASK, HEX) + "(EXT) ";
}
else
{
msg += "ID:0x" + String(canMsg.can_id & CAN_SFF_MASK, HEX) + "(STD) ";
}
msg += "DLC:" + String(canMsg.can_dlc) + " DATA:";
for (int i = 0; i < canMsg.can_dlc; i++)
{
if (canMsg.data[i] < 0x10)
{
msg += "0";
}
msg += String(canMsg.data[i], HEX);
if (i < canMsg.can_dlc - 1)
{
msg += " ";
}
}
Serial.println(msg.c_str());
}
}

