首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

CAN总线的通信问题

CAN总线的通信问题

我在用GZ16做CAN总线,但是现在两个节点都能发送和接受数据,可是接受到的不是我发送的,郁闷死了, 下面是一些寄存器设置       
CIDAR0=0x00; CIDAR1=0x00;CIDAR2=0x00;CIDAR3=0x00;
CIDMR0=0xFF;  CIDMR1=0xFF;CIDMR2=0xFF;CIDMR3=0xFF;
IDR00=0x55;IDR01=0x00;


我还有点不明白的就是如果CIDMR中不设置成FF,IDR中的数值是不是要和CIDAR中的数值相同才能接受啊


希望各位大侠指点,急啊!谢谢
                          

哈哈,当然不能全为FF
如果全为FF,你接收不对应该算正常吧
请问楼上这位大哥,那应该怎么设置呢,能否给举个例子啊?还有CAN总线不是有ID吗,那ID是不是通过以上三个寄存器来决定啊?本人是菜鸟,请各位大侠指教!
标志符接收屏蔽寄存器CANIDMR0-3
标志符屏蔽寄存器决定标志符接收寄存器中哪几位与标志符过滤有关
0 – 标志符寄存器中的该位必须与标志符接收寄存器中的该位相同
1 – 忽略标志符接收寄存器中的该位

标志符接收寄存器CANIDAR0-3
在接收报文的过程中,标志符接收寄存器中的值将会与接收缓冲区中标志符寄存器中的值按位比较,比较的结果会根据标志符屏蔽寄存器的值被屏蔽。

如果标志符通过标志符接收寄存器和屏蔽寄存器的标准,MSCAN通知CPU已经接收到ID符合要求的报文

CMCR0 = 0x01; //CAN模块为软复位状态
CMCR1 = 0x00; //时钟源为外部晶体/2 2M
//CMCR1 = 0x04; //时钟源为外部晶体/2 2M

CBTR0 = 0x80;
//SJW1,SJW0,10,3个周期同步。100000,20分频,为100KC。10100000 A0H
CBTR1 = 0xfa; //1,3个采样位,0000000,分频为0,波特率为100K

CIDAC = 0x00; //接收滤波为32位滤波,击中事件使用1个字节
//标识符号验收寄存器0~3
CIDAR0 = 0x00; //滤波使它接收一帧08B7D8D2(45BFB1A4)
CIDAR1 = 0x00;
CIDAR2 = 0x00;
CIDAR3 = 0x00;
//标识符屏蔽寄存器0~3
CIDMR0 = 0xFF;
CIDMR1 = 0xFF;
CIDMR2 = 0xFF;
CIDMR3 = 0xFF; //不进行过滤

CMCR0 = 0x00; //把CAN模块设置为数据输入输出状态
//while(CMCR0_SYNCH==0){;} //等待同步

CRIER = 0x01; //CAN接收中断使能
欢迎大家到汽车电子群2838085!
让我们推动中国汽车前进!
你是几个字节的ID啊
看上面你好像是用了2个啊
欢迎大家到汽车电子群2838085!
让我们推动中国汽车前进!
CIDAR0-CIDAR3要根据你接收的ID来进行设置,把32位填到4个寄存器就行了。CIDMR0-CIDMR3是确定哪些位要进行验收屏蔽,全设为0xff没什么用,把无关紧要的位设为1,其他全设成0就OK了。
坚持到底,有恒则成!
IDR中放的是你本身节点的ID。
坚持到底,有恒则成!
谢谢各位的大侠的指教,现在我用汇编写的程序调通了,但是C语言的还没有调通。不过我现在懂得该怎么用了!谢谢了!
返回列表