zhangyuhui305 发表于 2010-5-23 16:16

CAN通讯,现象太怪了!

前天出现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,那你说应该是怎样设定啊?发送和接收都得改吧。。

zhangyuhui305 发表于 2010-5-24 09:36

我手头没有硬件仿真,只能通过观察现象,查阅资料,问前辈,进行好困难啊,,,

zhangyuhui305 发表于 2010-5-24 09:38

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);                                        //等待发送完成
}

zhangyuhui305 发表于 2010-5-24 09:40

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;
        }
这是接收的部分,通过查询的方式,吧收到的数据写入数组,然后区刷新液晶显示,初始化和发送的一样。

zjswuyunbo 发表于 2010-5-24 13:02

lpc是不是arm?
arm没仿真的?

cys_a 发表于 2010-5-24 13:20

应该是硬件没匹配好

zhangyuhui305 发表于 2010-5-24 14:31

LPC是ARM啊,有硬件仿真接口我没用,我用的是串口下载,因为电脑上没有并口嘛。硬件的话我用的两端120欧的终端电阻,收发器用了100k的斜率电阻,都满足要求啊,。??

lnskngdc 发表于 2010-5-24 16:03

你数据多久采集一次?波特率较低的情况下,如果还没有发送结束,你又有新报文要发,是会出错的。
楼主简单描述一下硬件条件,接线情况以及程序大概流程吧,你可以在发送结束的位置加个几毫秒的延时试试。

zhangyuhui305 发表于 2010-5-24 16:25

搞定了,确实是波特率没有设置好。呵呵,

lnskngdc 发表于 2010-5-24 21:06

搞定了,确实是波特率没有设置好。呵呵,
zhangyuhui305 发表于 2010-5-24 16:25 https://bbs.21ic.com/images/common/back.gif
恭喜,解决了就好.
页: [1]
查看完整版本: CAN通讯,现象太怪了!