标题: CAN总线的通信问题 [打印本页]
作者: 加密咖啡 时间: 2006-8-3 16:14 标题: 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中的数值相同才能接受啊
希望各位大侠指点,急啊!谢谢
作者: toofree 时间: 2006-8-4 11:19
哈哈,当然不能全为FF
如果全为FF,你接收不对应该算正常吧
作者: 加密咖啡 时间: 2006-8-4 16:08
请问楼上这位大哥,那应该怎么设置呢,能否给举个例子啊?还有CAN总线不是有ID吗,那ID是不是通过以上三个寄存器来决定啊?本人是菜鸟,请各位大侠指教!
作者: yunfeng 时间: 2006-8-7 10:24
标志符接收屏蔽寄存器CANIDMR0-3
标志符屏蔽寄存器决定标志符接收寄存器中哪几位与标志符过滤有关
0 – 标志符寄存器中的该位必须与标志符接收寄存器中的该位相同
1 – 忽略标志符接收寄存器中的该位
标志符接收寄存器CANIDAR0-3
在接收报文的过程中,标志符接收寄存器中的值将会与接收缓冲区中标志符寄存器中的值按位比较,比较的结果会根据标志符屏蔽寄存器的值被屏蔽。
如果标志符通过标志符接收寄存器和屏蔽寄存器的标准,MSCAN通知CPU已经接收到ID符合要求的报文
作者: zhwdy81 时间: 2006-8-7 13:09
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接收中断使能
作者: zhwdy81 时间: 2006-8-7 13:11
你是几个字节的ID啊
看上面你好像是用了2个啊
作者: ygs090608 时间: 2006-8-7 16:52
CIDAR0-CIDAR3要根据你接收的ID来进行设置,把32位填到4个寄存器就行了。CIDMR0-CIDMR3是确定哪些位要进行验收屏蔽,全设为0xff没什么用,把无关紧要的位设为1,其他全设成0就OK了。
作者: ygs090608 时间: 2006-8-7 16:55
IDR中放的是你本身节点的ID。
作者: 加密咖啡 时间: 2006-8-8 14:34
谢谢各位的大侠的指教,现在我用汇编写的程序调通了,但是C语言的还没有调通。不过我现在懂得该怎么用了!谢谢了!
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) |
Powered by Discuz! 7.0.0 |