打印
[CAN-bus/DeviceNet]

CAN通讯,现象太怪了!

[复制链接]
2866|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhangyuhui305|  楼主 | 2010-5-23 16:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前天出现CAN通讯不能连续的问题,能发送能接收,就是不能连续通讯。经检查是因为波特率没设置好,发送子程序没有判断总线状态。
      今天终于能让其连续通讯了,但怪问题又出现了:一个节点经AD装换的数据发送,另一个节点接收,通讯几次后又不能进行了。有时候接收到两个数,三个数,最多十几个数就停了,示波器也看不到发送的数了。必须发送端复位才能再次通讯。
      有经验的大侠帮帮忙呗,时间紧,任务重,小弟先感谢了!

相关帖子

沙发
zhangyuhui305|  楼主 | 2010-5-23 16:24 | 只看该作者
补充说明:我用LPC2119+82C250方案,中间加电源隔离模块,光耦隔离。

使用特权

评论回复
板凳
lnskngdc| | 2010-5-24 09:08 | 只看该作者
估计还是波特率的问题,你查2119的错误状态寄存器,应该是错误超过255而溢出导致bus-off。
建议重新设置采样点,使波特率误差小于5%

使用特权

评论回复
地板
zhangyuhui305|  楼主 | 2010-5-24 09:34 | 只看该作者
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,那你说应该是怎样设定啊?发送和接收都得改吧。。

使用特权

评论回复
5
zhangyuhui305|  楼主 | 2010-5-24 09:36 | 只看该作者
我手头没有硬件仿真,只能通过观察现象,查阅资料,问前辈,进行好困难啊,,,

使用特权

评论回复
6
zhangyuhui305|  楼主 | 2010-5-24 09:38 | 只看该作者
void  CanSend()
{
        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[0]<<24)|(dat[1]<<16)|(dat[2]<<8)|dat[3];        // 前四个字节
                C1TDB1 = (dat[4]<<24)|(dat[5]<<16)|(dat[6]<<8)|dat[7];        // 后四个字节               
        }
        C1CMR  = 1<<5|1;                                                                            // 选择第1缓冲区发送
        //delay(100);
        do
        {
                 temp=C1GSR;
        }
        while((temp>>3)&0x00000001!=0x00000001);                                        //等待发送完成
}

使用特权

评论回复
7
zhangyuhui305|  楼主 | 2010-5-24 09:40 | 只看该作者
while(1)
    {
                        temp=C1GSR;
                        if(temp&0x01==0x01 && C1RID==0xAA)
                        {
                                dat[0]=(C1RDA>>24)&0xff;  dat[1]=(C1RDA>>16)&0xff;
                                dat[2]=(C1RDA>>8)&0xff;   dat[3]=C1RDA&0xff;
                                dat[4]=(C1RDB>>24)&0xff;  dat[5]=(C1RDB>>16)&0xff;
                                dat[6]=(C1RDB>>8)&0xff;   dat[7]=C1RDB&0xff;
                        }C1CMR=0x04;       
                        LCDrefreash1();                       
                        temp=0;
        }
这是接收的部分,通过查询的方式,吧收到的数据写入数组,然后区刷新液晶显示,初始化和发送的一样。

使用特权

评论回复
8
zjswuyunbo| | 2010-5-24 13:02 | 只看该作者
lpc是不是arm?
arm没仿真的?

使用特权

评论回复
9
cys_a| | 2010-5-24 13:20 | 只看该作者
应该是硬件没匹配好

使用特权

评论回复
10
zhangyuhui305|  楼主 | 2010-5-24 14:31 | 只看该作者
LPC是ARM啊,有硬件仿真接口我没用,我用的是串口下载,因为电脑上没有并口嘛。硬件的话我用的两端120欧的终端电阻,收发器用了100k的斜率电阻,都满足要求啊,。??

使用特权

评论回复
11
lnskngdc| | 2010-5-24 16:03 | 只看该作者
你数据多久采集一次?波特率较低的情况下,如果还没有发送结束,你又有新报文要发,是会出错的。
楼主简单描述一下硬件条件,接线情况以及程序大概流程吧,你可以在发送结束的位置加个几毫秒的延时试试。

使用特权

评论回复
12
zhangyuhui305|  楼主 | 2010-5-24 16:25 | 只看该作者
搞定了,确实是波特率没有设置好。呵呵,

使用特权

评论回复
13
lnskngdc| | 2010-5-24 21:06 | 只看该作者
搞定了,确实是波特率没有设置好。呵呵,
zhangyuhui305 发表于 2010-5-24 16:25

恭喜,解决了就好.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

15

帖子

1

粉丝