TA的每日心情 | 开心 昨天 12:47 |
---|
签到天数: 157 天 [LV.7]常住居民III
高级会员
- 积分
- 839
|
本帖最后由 suncat0504 于 2024-2-16 15:46 编辑
我用STC32G12K128搭建了CAN通讯电路,使用的是两个CAN通讯模块,收发器使用TJA1050。电路形式如下:
测试程序中,CAN1和CAN2周期性发送不同数据。
结果测试中发现CAN1发送的数据,总是被CAN1自己接收。CAN2发送的数据,总是被CAN2接收。处在相同的网络中,CAN1和CAN2不是都应该能接收吗?
之后在初始化CAN1加了单模式过滤,期待CAN1只接收CAN2的发送数据,CAN2能接受CAN1和CAN2的数据。结果CAN1和CAN2都只能发送,不接收了。
初始化部分的代码:
// 总线验收代码寄存器
// CAN1_ID = 0x01303132;
// CAN2_ID = 0x03333435;
// 对CAN1,ACR配置成CAN2的ID
CanID = CAN2_ID << 3; // 挤掉高位前3位
CAN_InitStructure.CAN_ACR0 = (u8)(CAN2_ID>>24);
// 总线验收代码寄存器
CAN_InitStructure.CAN_ACR1 = (u8)(CAN2_ID>>16);
// 总线验收代码寄存器
CAN_InitStructure.CAN_ACR2 = (u8)(CAN2_ID>>8);
// 总线验收代码寄存器
CAN_InitStructure.CAN_ACR3 = (u8)(CAN2_ID);
// 总线验收屏蔽寄存器
CAN_InitStructure.CAN_AMR0 = 0x00; //总线验收屏蔽寄存器 0~0xFF
// 总线验收屏蔽寄存器
CAN_InitStructure.CAN_AMR1 = 0x00;
// 总线验收屏蔽寄存器
CAN_InitStructure.CAN_AMR2 = 0x00;
// 总线验收屏蔽寄存器
CAN_InitStructure.CAN_AMR3 = 0x00;
CAN_Inilize(CAN1,&CAN_InitStructure); //CAN1 初始化
// 总线验收代码寄存器
// CAN1_ID = 0x01303132;
// CAN2_ID = 0x03333435;
// 对CAN2,ACR配置成CAN1的ID
CAN_InitStructure.CAN_ACR0 = 0x00; //总线验收代码寄存器 0~0xFF
// 总线验收代码寄存器
CAN_InitStructure.CAN_ACR1 = 0x00;
// 总线验收代码寄存器
CAN_InitStructure.CAN_ACR2 = 0x00;
// 总线验收代码寄存器
CAN_InitStructure.CAN_ACR3 = 0x00;
// 总线验收屏蔽寄存器
CAN_InitStructure.CAN_AMR0 = 0xFF; //总线验收屏蔽寄存器 0~0xFF
// 总线验收屏蔽寄存器
CAN_InitStructure.CAN_AMR1 = 0xFF;
// 总线验收屏蔽寄存器
CAN_InitStructure.CAN_AMR2 = 0xFF;
// 总线验收屏蔽寄存器
CAN_InitStructure.CAN_AMR3 = 0xFF;
CAN_Inilize(CAN2,&CAN_InitStructure); //CAN2 初始化
看了用户手册。用户手册中对于ID的描述中,诸如ID.n中的n,和ID的位编号是一致吗?B0就是ID.0?另外处理ID时,对扩展帧只处理ID0 ~ ID28,对于四个字节的ID,是不是就不要B31 ~B29了?
在单模式滤波时,AMR都设置为0, 设置ACR时,如何处理ID的配置,才能实现定向过滤指定的ID呢?
|
|