|
本帖最后由 blue 于 2021-10-22 18:32 编辑
STC16F支持CAN总线通讯,支持CAN2.0标准,支持标准帧和扩展帧,好好搭搭已经做了图形化模块,可以快速的开发。
一、所需器材
- 天问51-STC16F x2
- CAN总线接口驱动(TJA1050)模块 x2
- 公母杜邦线x8
- 双绞线若干米,本次测试采用的是5米8芯网线,每4芯拧为一根,测试导线电阻为1欧。
二、硬件连接
1.示意图
主板 P50(RX)--------RXD CAN模块
主板 P51(TX)--------TXD CAN模块
2.实物图
4. 电源设置
CAN模块供电为5V,需要设置主板和下载器上的两个跳线帽到5V端
三、程序
1. 发送
采用标准帧发送,CAN数据最大为8字节,如果需要发送大于8字节的数据,需要采用协议分段发送。
在线版例程:CAN发送
2.接收
接收到数据通过串口打印
在线版例程:CAN接收
四、效果
四、更多资料
有关CAN总线的介绍、协议、书籍等等详见附件
补充说明:
驱动默认没有使用硬件自动过滤ID,大部分场合需要自动过滤ID,减小CPU的负荷,可以自己修改驱动CANInit的这部分代码
单滤波设置如下:
- uint16 CanID = 0x3E3;
- CANSetBaudrate(); //设置波特率
-
- CanWriteReg(ACR0,CanID>>3); //总线验收代码寄存器
- CanWriteReg(ACR1,CanID<<5);
- CanWriteReg(ACR2,0x00);
- CanWriteReg(ACR3,0x00);
- CanWriteReg(AMR0,0x00); //总线验收屏蔽寄存器
- CanWriteReg(AMR1,0x1F);
- CanWriteReg(AMR2,0xFF);
- CanWriteReg(AMR3,0xFF);
-
- CanWriteReg(MR ,0x01); //单滤波设置
复制代码 双滤波设置如下:
- uint16 CanID1 = 0x111;
- uint16 CanID2 = 0x222;
- uint8 tempH = CanID2<<5;
- uint8 templ = (CanID1&0x0007);
-
- CANSetBaudrate(); //设置波特率
-
- CanWriteReg(ACR0,CanID1>>3); //总线验收代码寄存器
- CanWriteReg(ACR1,0x00);
- CanWriteReg(ACR2,CanID2>>3);
- CanWriteReg(ACR3,tempH | templ);
- //CanWriteReg(ACR3,0x42);
- CanWriteReg(AMR0,0x00); //总线验收屏蔽寄存器
- CanWriteReg(AMR1,0xFF);
- CanWriteReg(AMR2,0x00);
- CanWriteReg(AMR3,0x18);
-
- CanWriteReg(MR ,0x00); //双滤波设置
复制代码
有关这几个寄存器的说明,可以看下芯片手册,不在过多解释
|
|