Qualcomm Arduino UNO Q开发板入门(二)

Darth Nihilus 2026-08-26 14:40:05

(五)基于 Qualcomm Arduino UNO Q开发板 的CAN总线通信

Qualcomm Arduino UNO Q开发板

实验工具

序号工具作用厂家
1Qualcomm Arduino UNO Q开发板数据包收发Qualcomm
2CAN总线模块CAN控制器+CAN收发器zave
3CAN分析仪读取分析CAN数据包芯世纪

实验过程

硬件连接

CAN分析仪CAN总线模块Qualcomm Arduino UNO Q开发板
--VCC5V
--GNDGND
--CS10
--SO12
--SI11
--SCK13
--INT2
CAN_HCAN_H--
CAN_LCAN_L--

软件设置

打开 Arduino App Lab ;

软件设置-1

点击“My Apps”,点击“Create new app”,点击“Create New App”;

软件设置-2

输入“CAN-DEMO”,点击“Create New”;

软件设置-3

点击“File”下“sketch”中“sketch.ino”,放入CAN-DEMO代码;

软件设置-4

点击“Add Sketch Library”,输入“ArduinoGraphics”,点击“Install”;

软件设置-5

点击“Add Sketch Library”,输入“autowp-mcp2515”,点击“Install”;

软件设置-6

点击“Run”,等待加载完成。

软件设置-7

实验代码

#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...显示发送/接收计数
接收数据时RX1RX2`...每收到一条计数RX

场景显示

场景LED显示
只有发送,无其他CAN节点CAN-DEMO→TX1→T1R0(一直不变)
有另一个CAN节点回复CAN-DEMO→TX1→RX1→T1R1→RX2...
收到很多数据频繁显示RX1、RX2、RX3...

接收侧

接收端

(六)基于Arduino UNO R3开发板 和 Arduino Nano开发板 的CAN总线通信

实验工具

序号工具作用厂家
1Arduino UNO R3 开发板数据包收发Arduino
2CAN总线模块CAN控制器+CAN收发器zave
3CAN总线模块CAN控制器+CAN收发器zave
4Arduino Nano 开发板数据包收发Arduino

实验过程

硬件连接

Arduino UNO R3 开发板CAN总线模块CAN总线模块Arduino Nano 开发板
5VVCCVCC5V
GNDGNDGNDGND
10CSCSD10
12SOSOD12
11SISID11
13SCKSCKD13
2INTINTD2
--CAN_HCAN_H--
--CAN_LCAN_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());
  }
}

实验效果

发送侧

发送侧

接收侧

接收侧

...全文
16 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

7,654

社区成员

发帖
与我相关
我的任务
社区描述
本论坛以AI、WoS 、XR、IoT、Auto、生成式AI等核心板块组成,为开发者提供便捷及高效的学习和交流平台。 高通开发者专区主页:https://qualcomm.csdn.net/
人工智能物联网机器学习 技术论坛(原bbs) 北京·东城区
社区管理员
  • csdnsqst0050
  • chipseeker
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧