聚豐項目 > AB32VG1 RT-Thread CAN總線收發(fā)
本項目在 ab32vg1 開發(fā)板上通過模擬口實現(xiàn)了 spi 協(xié)議并與 mcp2515 芯片通信,完成了收發(fā) can 幀的功能。
march1993
分享march1993
團隊成員
march1993 技術(shù)負責(zé)人
使用到的硬件如下:
1. AB32VG1 本尊
本來是想用自帶的 SPI 收發(fā)器的,奈何沒有文檔,不過學(xué)會了大家的套路,用 GPIO 直接實現(xiàn)了 SPI 協(xié)議,肝就完事兒了!
2. MCP2515
MCP2515 我用的很多,不過都是在 arm linux 平臺上的,直接加載驅(qū)動用 SocketCAN 的,這次在嵌入式平臺上沒有現(xiàn)成的驅(qū)動了,照著大家的代碼寫,肝就完事兒了!
3. 一汽流出的ARS410OD雷達
從自己的庫存里掏出了一個雷達,沒想到還是 OEM 品,沒有 datasheet,本來是想讀取數(shù)據(jù)做個上位機可視化一下的,可惜沒有格式文檔,肝不動了!
開發(fā)環(huán)境:
- RT-Thread 版本 latest- RT
- Thread Studio版本 V2.1.2
- AB32VG1 開發(fā)板 BSP 版本 V2.0
Gitee 項目地址:https://gitee.com/march1993/ab32vg1-rt-thread-mcp2515
我平時是個前端工程師,偶爾寫寫 GO 語言后端的,有關(guān)嵌入式的知識都還停留在學(xué)校里,不過這次非常出乎意料,RT-Thread 代碼非常好上手,AB32VG1 的開發(fā)調(diào)試也絕頂方便。寫好代碼,編譯,downloader 直接刷固件然后可以直接讀寫串口,可能是我見識短淺,不過當(dāng)我第一次看到 downloader 刷完直接有一個 shell 可以用而且代碼里可以用 rt_kprintf 的時候我是驚呆了的,時代真的變了,嵌入式開發(fā)原來可以這么容易。
下面一段是設(shè)置 SPI 的代碼
下面一段是初始化 MCP2515 的代碼,挺好用
void mcp2515_initialize(void) { // https://www.cnblogs.com/yikoulinux/p/13706054.html mcp2515_reset(); //復(fù)位 mcp2515_send(0x0f, 0x80); //CANCTRL寄存器--進入配置模式 中文DATASHEET 58頁 // 可以設(shè)置的波特率 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 引腳控制寄存器和狀態(tài)寄存器 中文DATASHEET 29 頁 // mcp2515_send(0x0f, 0x40); //CAN控制寄存器--回環(huán)模式,用于測試 mcp2515_send(0x0f, 0x00); //CAN控制寄存器--正常模式 }
下面一段代碼是用于控制 MCP2515 寄存器的,可以看到這里調(diào)用了 RT-Thread 的 SPI 庫函數(shù) 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 庫函數(shù)的,不過還要實現(xiàn)完整的協(xié)議棧,肝不動了,連著幾天肝到天亮可不太行。
下圖是連接示意圖,左邊是MCP2515模塊,中間是 AB32VG1 本尊,右邊是 ARS410OD
ARS410OD 通過 CAN 總線和 MCP2515 相連,MCP2515 通過 SPI 總線和 AB32VG1 相連
下圖顯示了從收發(fā)器里讀取出來的 CAN 幀
最后還有一個視頻可以看,可以看到串口刷刷的在翻頁,數(shù)據(jù)刷的賊快,這說明啥,說明 AB32VG1 牛逼!