ocrobot:alpha:canbus:main
差别
这里会显示出您选择的修订版和当前版本之间的差别。
| 后一修订版 | 前一修订版 | ||
| ocrobot:alpha:canbus:main [2019/07/02 05:47] – 创建 董凯萍 | ocrobot:alpha:canbus:main [2025/10/11 02:55] (当前版本) – 外部编辑 127.0.0.1 | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| + | ====== ALPHA CANBUS总线模块 ====== | ||
| + | ALPHA CANBUS总线模块是一款独立控制器局域网络(Controller Area Network, CAN)协议控制器,完全支持 CAN V2.0B 技术规范。该器件能发送和接收标准和扩展数据帧以及远程帧。模块自带的两个验收屏蔽寄存器和六个验收滤波寄存器可以过滤掉不想要的报文,因此减少了主单片(MCU)的开销。ALPHA CANBUS总线模块与MCU的连接是通过业界标准串行外设接口(Searial Peripheral Interface, SPI)来实现的。 | ||
| + | ===== 参数 ===== | ||
| + | 1、完全支持 CAN V2.0B 技术规范,通讯速率为1 Mb/s: | ||
| + | |||
| + | - 0-8 字节长的数据字段 | ||
| + | |||
| + | - 标准和扩展数据帧及远程帧 | ||
| + | |||
| + | 2、 接收缓冲器、验收屏蔽寄存器和验收滤波寄存器: | ||
| + | |||
| + | - 两个接收缓冲器,可优先存储报文 | ||
| + | |||
| + | - 六个 29 位验收滤波寄存器 | ||
| + | |||
| + | - 二个 29 位验收屏蔽寄存器 | ||
| + | |||
| + | 3、 对头两个数据字节进行滤波 (针对标准数据帧) | ||
| + | |||
| + | 4、 三个发送缓冲器,具有优先级设定及发送中止功能 | ||
| + | |||
| + | 5、高速 SPI 接口 (10 MHz): 支持 0,0 和 1,1 的 SPI 模式 | ||
| + | |||
| + | 6、单触发模式确保报文发送只尝试一次 | ||
| + | |||
| + | 7、 带有可编程预分频器的时钟输出引脚: 可用作其他器件的时钟源 | ||
| + | |||
| + | 8、 可用起始帧信号 (Start-of-Frame, SOF),用于监控 SOF 信号:可用于时隙协议和/或总线诊断以检测早期总线性能退化 | ||
| + | |||
| + | 9、 带有可选使能设定的中断输出引脚 | ||
| + | |||
| + | 10、 “缓冲器满”输出引脚可配置为: | ||
| + | |||
| + | - 各接收缓冲器的中断引脚 | ||
| + | |||
| + | - 通用数字输出引脚 | ||
| + | |||
| + | 11、“请求发送 (Request-to-Send, RTS)”输入引脚可各自配置为: | ||
| + | |||
| + | - 各发送缓冲器的控制引脚,用于请求立即发送报文 | ||
| + | |||
| + | - 通用数字输入引脚 | ||
| + | |||
| + | 12、 低功耗的 CMOS 技术: | ||
| + | |||
| + | - 工作电压范围 2.7V 至 5.5V | ||
| + | |||
| + | - 5 mA 典型工作电流 | ||
| + | |||
| + | - 1 µA 典型待机电流 (休眠模式) | ||
| + | |||
| + | 13、 工作温度范围: | ||
| + | |||
| + | - 工业级 (I):-40°C 至 +85°C | ||
| + | |||
| + | - 扩展级 (E):-40°C 至 +125°C | ||
| + | ===== 参考图片 ===== | ||
| + | {{: | ||
| + | {{: | ||
| + | ====== 例程 ====== | ||
| + | 发送端代码(主控板为D21G18A): | ||
| + | <code cpp> | ||
| + | |||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | struct can_frame canMsg1; | ||
| + | struct can_frame canMsg2; | ||
| + | MCP2515 mcp2515(A5); | ||
| + | |||
| + | |||
| + | void setup() { | ||
| + | |||
| + | canMsg1.can_id | ||
| + | canMsg1.can_dlc = 8; | ||
| + | canMsg1.data[0] = 0x8E; | ||
| + | canMsg1.data[1] = 0x87; | ||
| + | canMsg1.data[2] = 0x32; | ||
| + | canMsg1.data[3] = 0xFA; | ||
| + | canMsg1.data[4] = 0x26; | ||
| + | canMsg1.data[5] = 0x8E; | ||
| + | canMsg1.data[6] = 0xBE; | ||
| + | canMsg1.data[7] = 0x86; | ||
| + | |||
| + | canMsg2.can_id | ||
| + | canMsg2.can_dlc = 8; | ||
| + | canMsg2.data[0] = 0x0E; | ||
| + | canMsg2.data[1] = 0x00; | ||
| + | canMsg2.data[2] = 0x00; | ||
| + | canMsg2.data[3] = 0x08; | ||
| + | canMsg2.data[4] = 0x01; | ||
| + | canMsg2.data[5] = 0x00; | ||
| + | canMsg2.data[6] = 0x00; | ||
| + | canMsg2.data[7] = 0xA0; | ||
| + | | ||
| + | while (!SerialUSB); | ||
| + | SerialUSB.begin(115200); | ||
| + | SPI.begin(); | ||
| + | | ||
| + | mcp2515.reset(); | ||
| + | mcp2515.setBitrate(CAN_125KBPS); | ||
| + | mcp2515.setNormalMode(); | ||
| + | | ||
| + | SerialUSB.println(" | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | | ||
| + | mcp2515.sendMessage(& | ||
| + | mcp2515.sendMessage(& | ||
| + | |||
| + | SerialUSB.println(" | ||
| + | | ||
| + | delay(100); | ||
| + | |||
| + | } | ||
| + | |||
| + | </ | ||
| + | 接收端代码 | ||
| + | <code cpp> | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | struct can_frame canMsg; | ||
| + | MCP2515 mcp2515(A5); | ||
| + | |||
| + | |||
| + | void setup() { | ||
| + | SerialUSB.begin(115200); | ||
| + | SPI.begin(); | ||
| + | | ||
| + | mcp2515.reset(); | ||
| + | mcp2515.setBitrate(CAN_125KBPS); | ||
| + | mcp2515.setNormalMode(); | ||
| + | | ||
| + | SerialUSB.println(" | ||
| + | SerialUSB.println(" | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | | ||
| + | if (mcp2515.readMessage(& | ||
| + | | ||
| + | SerialUSB.print(canMsg.can_id, | ||
| + | SerialUSB.print(" | ||
| + | SerialUSB.print(canMsg.can_dlc, | ||
| + | SerialUSB.print(" | ||
| + | | ||
| + | for (int i = 0; i< | ||
| + | | ||
| + | SerialUSB.print(canMsg.data[i], | ||
| + | SerialUSB.print(" | ||
| + | |||
| + | } | ||
| + | |||
| + | SerialUSB.println(); | ||
| + | } | ||
| + | |||
| + | } | ||
| + | |||
| + | </ | ||
| + | ===== 下载 ===== | ||
| + | **库文件:**{{ : | ||
| + | |||
| + | **技术手册:**{{ : | ||
| + | |||
| + | **原理图:** | ||
