CAN通讯,现象太怪了!
前天出现CAN通讯不能连续的问题,能发送能接收,就是不能连续通讯。经检查是因为波特率没设置好,发送子程序没有判断总线状态。今天终于能让其连续通讯了,但怪问题又出现了:一个节点经AD装换的数据发送,另一个节点接收,通讯几次后又不能进行了。有时候接收到两个数,三个数,最多十几个数就停了,示波器也看不到发送的数了。必须发送端复位才能再次通讯。
有经验的大侠帮帮忙呗,时间紧,任务重,小弟先感谢了! 补充说明:我用LPC2119+82C250方案,中间加电源隔离模块,光耦隔离。 估计还是波特率的问题,你查2119的错误状态寄存器,应该是错误超过255而溢出导致bus-off。
建议重新设置采样点,使波特率误差小于5% void CanInit()
{
PCONP|=~((int32)0x03<<12);
PINSEL1&=~((uint32)0x03<<18); //使能CAN
PINSEL1|=((uint32)0x01<<18);
C1MOD=C1MOD|0x01; //进入设置模式
C1MOD=C1MOD|0x01; //进入设置模式
if(C1MOD&0x01==0x01)
{
C1EWL = 0x60; //设置报警越限
C1BTR = (1<<23)|(1<<20)|(3<<16)|(0<<14)|17; //设置CAN波特率
C1IER = 0x00; //设置中断函数
// C1MOD=(C1MOD|0xfc)&0x03;
AFMR=0x03;
}
C1MOD=C1MOD&0xfe; //退出软件复位
C1MOD=C1MOD&0xfe; //退出软件复位
}
波特率写入寄存器C1BTR,那你说应该是怎样设定啊?发送和接收都得改吧。。 我手头没有硬件仿真,只能通过观察现象,查阅资料,问前辈,进行好困难啊,,, voidCanSend()
{
uint32 temp;
do
{
temp=C1GSR;
}
while((temp>>7)&0x00000001==0x00000001); //总线关闭一直等待
temp=C1GSR;
if(temp>>2&0x00000001==0x00000001) //发送缓冲区1是否为空
{
C1TFI1 = (0<<31)|(0<<30)|(8<<16)|0x00; // 帧信息:数据帧,8位数据
C1TID1 = 0xAA; // 帧ID:0xAA
//C1TDA1 = 0x05030202;
//C1TDB1 = 0x08070606;
C1TDA1 = (dat<<24)|(dat<<16)|(dat<<8)|dat; // 前四个字节
C1TDB1 = (dat<<24)|(dat<<16)|(dat<<8)|dat; // 后四个字节
}
C1CMR= 1<<5|1; // 选择第1缓冲区发送
//delay(100);
do
{
temp=C1GSR;
}
while((temp>>3)&0x00000001!=0x00000001); //等待发送完成
} while(1)
{
temp=C1GSR;
if(temp&0x01==0x01 && C1RID==0xAA)
{
dat=(C1RDA>>24)&0xff;dat=(C1RDA>>16)&0xff;
dat=(C1RDA>>8)&0xff; dat=C1RDA&0xff;
dat=(C1RDB>>24)&0xff;dat=(C1RDB>>16)&0xff;
dat=(C1RDB>>8)&0xff; dat=C1RDB&0xff;
}C1CMR=0x04;
LCDrefreash1();
temp=0;
}
这是接收的部分,通过查询的方式,吧收到的数据写入数组,然后区刷新液晶显示,初始化和发送的一样。 lpc是不是arm?
arm没仿真的? 应该是硬件没匹配好 LPC是ARM啊,有硬件仿真接口我没用,我用的是串口下载,因为电脑上没有并口嘛。硬件的话我用的两端120欧的终端电阻,收发器用了100k的斜率电阻,都满足要求啊,。?? 你数据多久采集一次?波特率较低的情况下,如果还没有发送结束,你又有新报文要发,是会出错的。
楼主简单描述一下硬件条件,接线情况以及程序大概流程吧,你可以在发送结束的位置加个几毫秒的延时试试。 搞定了,确实是波特率没有设置好。呵呵, 搞定了,确实是波特率没有设置好。呵呵,
zhangyuhui305 发表于 2010-5-24 16:25 https://bbs.21ic.com/images/common/back.gif
恭喜,解决了就好.
页:
[1]