聚丰项目 > AB32VG1 RT-Thread CAN总线收发
本项目在 ab32vg1 开发板上通过模拟口实现了 spi 协议并与 mcp2515 芯片通信,完成了收发 can 帧的功能。
march1993
分享march1993
团队成员
march1993 技术负责人
使用到的硬件如下:
1. AB32VG1 本尊
本来是想用自带的 SPI 收发器的,奈何没有文档,不过学会了大家的套路,用 GPIO 直接实现了 SPI 协议,肝就完事儿了!
2. MCP2515
MCP2515 我用的很多,不过都是在 arm linux 平台上的,直接加载驱动用 SocketCAN 的,这次在嵌入式平台上没有现成的驱动了,照着大家的代码写,肝就完事儿了!
3. 一汽流出的ARS410OD雷达
从自己的库存里掏出了一个雷达,没想到还是 OEM 品,没有 datasheet,本来是想读取数据做个上位机可视化一下的,可惜没有格式文档,肝不动了!
开发环境:
- RT-Thread 版本 latest- RT
- Thread Studio版本 V2.1.2
- AB32VG1 开发板 BSP 版本 V2.0
Gitee 项目地址:https://gitee.com/march1993/ab32vg1-rt-thread-mcp2515
我平时是个前端工程师,偶尔写写 GO 语言后端的,有关嵌入式的知识都还停留在学校里,不过这次非常出乎意料,RT-Thread 代码非常好上手,AB32VG1 的开发调试也绝顶方便。写好代码,编译,downloader 直接刷固件然后可以直接读写串口,可能是我见识短浅,不过当我第一次看到 downloader 刷完直接有一个 shell 可以用而且代码里可以用 rt_kprintf 的时候我是惊呆了的,时代真的变了,嵌入式开发原来可以这么容易。
下面一段是设置 SPI 的代码
下面一段是初始化 MCP2515 的代码,挺好用
void mcp2515_initialize(void) { // https://www.cnblogs.com/yikoulinux/p/13706054.html mcp2515_reset(); //复位 mcp2515_send(0x0f, 0x80); //CANCTRL寄存器--进入配置模式 中文DATASHEET 58页 // 可以设置的波特率 5K 10K 15K 20K 25K 40K 50K 80K 100K 125K 200K 400K 500K 667K 800K 1M // https://www.kvaser.com/support/calculators/bit-timing-calculator/ mcp2515_send(0x2A, 0x00); //CNF1位定时配置寄器 中文DATASHEET 41-42页 mcp2515_send(0x29, 0x88); //CNF2位定时配置寄器 中文DATASHEET 41-42页 mcp2515_send(0x28, 0x03); //CNF3位定时配置寄器 中文DATASHEET 41-43页 mcp2515_send(0x2B, 0x1f); //CANINTE中断使能寄存器 中文DATASHEET 50 页 mcp2515_send(0x60, 0x60); //RXB0CTRL接收缓冲器0 控制寄存器 中文DATASHEET 27 页 //write_byte_2515(0x70, 0x20); //接收缓冲器1控制寄存器 mcp2515_bit_modify(0x0C, 0x0f, 0x0f); //BFPCTRL_RXnBF 引脚控制寄存器和状态寄存器 中文DATASHEET 29 页 // mcp2515_send(0x0f, 0x40); //CAN控制寄存器--回环模式,用于测试 mcp2515_send(0x0f, 0x00); //CAN控制寄存器--正常模式 }
下面一段代码是用于控制 MCP2515 寄存器的,可以看到这里调用了 RT-Thread 的 SPI 库函数 rt_spi_transfer_message,抽象的还挺好用的。
void mcp2515_send(unsigned char addr, unsigned char data) { struct rt_spi_message message = { 0 }; unsigned char buf[3] = { 0x02, addr, data }; message.send_buf = buf; message.length = 3; message.cs_take = 1; message.cs_release = 1; rt_spi_transfer_message(spi, &message); }
本来还想用 RT-Thread 的 CAN 库函数的,不过还要实现完整的协议栈,肝不动了,连着几天肝到天亮可不太行。
下图是连接示意图,左边是MCP2515模块,中间是 AB32VG1 本尊,右边是 ARS410OD
ARS410OD 通过 CAN 总线和 MCP2515 相连,MCP2515 通过 SPI 总线和 AB32VG1 相连
下图显示了从收发器里读取出来的 CAN 帧
最后还有一个视频可以看,可以看到串口刷刷的在翻页,数据刷的贼快,这说明啥,说明 AB32VG1 牛逼!