打印
[CAN-bus/DeviceNet]

CAN验收滤波器

[复制链接]
3587|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ljt4810|  楼主 | 2007-6-4 10:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位老师好!
  我最近做了个CAN通信,已经调通,但有很多问题不明白,请指教!
  我用的是BasicCAN模式,自收自发,但设置的ID号不起作用,什么都收请帮忙分析一下.接收自己发送的还是别的发送的是不是看ID啊?谢谢!
   write_can(31,0x48);  //时钟分频器
     write_can(4,0x10);  //验收代码ID 080
     write_can(5,0x45);  //验收屏蔽寄存器 
     write_can(6,0x01);  //btr0
     write_can(7,0x1c);  //btr1 
     write_can(8,0xaa);  //输出控制寄存器

相关帖子

沙发
桂电飞天鼠| | 2007-6-4 12:22 | 只看该作者

Basic没有自收自发模式,只有在Peli模式下才有

够简洁的了!

使用特权

评论回复
板凳
ljt4810|  楼主 | 2007-6-4 13:03 | 只看该作者

CAN验收滤波器

BasicCAN不能接收自己发送的吗?但是我的已经调通了,我只用了一个节点,数据发送到CAN总线上,然后从接收缓冲器里读,通过串口返到PC机上,发的和接收的一致啊,我上面发的程序是初始化的寄存器设置,我也用两个节点调过,通,但是还是什么都接收,麻烦帮忙分析一下

使用特权

评论回复
地板
wxj1952| | 2007-6-4 16:25 | 只看该作者

无效数据

未经接收中断通告的数据,是MAC层的无效数据。BASIC方式下也能自收发?我别误导了你,

使用特权

评论回复
5
ljt4810|  楼主 | 2007-6-4 17:13 | 只看该作者

接收中断

 接收中断是指控制寄存器中"接收中断使能"位置1吗?

使用特权

评论回复
6
wxj1952| | 2007-6-4 20:36 | 只看该作者

至少2点程序错误

1、没有发送/接收中断程序。没有接收中断程序如何知道网络上的数据什么时候到来?什么时候读取?用查询程序?

2、 write_can(4,0x10);  //验收代码ID 080
     write_can(5,0x45);  //验收屏蔽寄存器 
是什么意思?这样写到底希望过滤什么ID?应该 write_can(5,0x00); 吧。


接收中断是指IR.0=1引发的中断。

使用特权

评论回复
7
ljt4810|  楼主 | 2007-6-5 08:23 | 只看该作者

ARM程序

   我用的是LPC2131+SJA1000+TJA1050,ARM c语言与C语言有所不同,我本以为是寄存器设置的问题,所以只发了初始化,我发送接收数据用的查询.
  void init_can()
{  uint8 dat;
    IO0CLR  = CS;    // 0x40800000;INT|CS;
    
    write_can(0,0x01);//控制寄存器,进入复位模式,并且禁能所有中断源
     write_can(31,0x48);  //时钟分频器
     write_can(4,0xaa);  //验收代码ID 550
     write_can(5,0x00);  //验收屏蔽寄存器 
     write_can(6,0x01);  //btr0
     write_can(7,0x1c);  //btr1 
     write_can(8,0xaa);  //输出控制寄存器
     delay(2);
     write_can(0,0x06); //退出复位模式,并且使能发送中断和接收中断
     dat= read_can(0);
     
     while((dat&0x01)==1) //判断是否复位
     {
     write_can(0,0x06);
     }
     }
void Tx1(void)  //发送子程序
{ uint8 i;
  uint8 addr=10;
  uint8 snd1[10]={0xaa,0x28,0x19,0x83,0x02,0x12,0x44,0x53,0x48,0x12};
  write_can(0,0x06);  //使能发送中断和接收中断,控制寄存器
  for(i=0;i<10;i++)
    {
     write_can(addr,snd1);
     addr++;
     delay(100);
    }
   write_can(1,0x05);// 启动发送,置位发送请求位
   delay(100);
 }

uint8 receive()   //接收数据,并发到串口上

uint8 i; 
receive_data[0]=read_can(0x14);
receive_data[1]=read_can(0x15);
receive_data[2]=read_can(0x16);//data1
receive_data[3]=read_can(0x17);//data2
receive_data[4]=read_can(0x18);//data3
receive_data[5]=read_can(0x19);//data4
receive_data[6]=read_can(0x1a);//data5
receive_data[7]=read_can(0x1b);//data6
receive_data[8]=read_can(0x1c);//data7
receive_data[9]=read_can(0x1d);//data8
for(i=0;i<10;i++)
 {
    UART0_SendByte(receive_data); // 向串口发送字符串
   delay(10);
 }  
write_can(1,0x04);//释放,接收缓冲器中载有信息内容被释放 
return 1;
}

 int main (void)
{ init_can();
 delay(10);
 while(1) 
  {
   Tx1();
  
   delay(1000000);
   receive();
   } 
  return 0;
    }







使用特权

评论回复
8
wxj1952| | 2007-6-5 09:12 | 只看该作者

不错,干净,简洁。

1、 write_can(0,0x06); //退出复位模式,并且使能发送中断和接收中断
     dat= read_can(0);
     
     while((dat&0x01)==1) //判断是否复位---//错,只读了一次dat
     {
     write_can(0,0x06);
     }

改:do{ write_can(0,0x06); //退出复位模式,并且使能发送中断和接收中断
     dat= read_can(0);
   while(!(dat&0x06));

2、 write_can(1,0x05);// 启动发送,置位发送请求位----  //改:0x01


   ? 怎么查询发送成功和接收?应该是SR.3 和SR.0。
   ? 概念好像错了,启动发送后,延时,然后就接收?你怎么知道,550是否有信息到达?你怎么知道你的551信息已经确实到达了550,并且已经被妥收?
    用你这段程序,连不连网都是一样的,都通的。就好像你的PC机没连网一样。
    那么,跟谁通信?

使用特权

评论回复
9
ljt4810|  楼主 | 2007-6-5 10:19 | 只看该作者

to wxj1952

   首先对你表示感谢!这两天与你的交流让我学到了很多知识,对一些概念没有很好的理解,导致了我方向性的错误,浪费了很多时间.根据你的指导我收改了编程,现在已经通了,验收滤波器也起作用了,让我对CAN总线的理解又进了一大步.谢谢!,再次表示感谢!

使用特权

评论回复
10
wxj1952| | 2007-6-5 16:28 | 只看该作者

恭喜!

到底是自动化专业的。

使用特权

评论回复
11
ljt4810|  楼主 | 2007-6-6 13:58 | 只看该作者

又发现问题

  今天调试CAN总线时又发现问题了,当我发送{0xaa,0x08,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88}时正确,但发送
{0xaa,0x08,0x00,0x22,0x33,0x44,0x55,0x66,0x77,0x88}时出现问题了,0x00不接收,只接收了9个数,我又发送{0xaa,0x01,0x00}时显示AA 01
发送{0xaa,0x02,0x00,0x01}时显示AA 02 01
 真怪!大家有没有出现这样的问题,过来分析一下.

使用特权

评论回复
12
wxj1952| | 2007-6-6 19:19 | 只看该作者

没问题。

CAN收到了。串口程序问题。把串口奇偶校验改一下。

使用特权

评论回复
13
ljt4810|  楼主 | 2007-6-6 19:37 | 只看该作者

没奇偶校验啊?

  我的串口程序没用奇偶校验啊?

使用特权

评论回复
14
wxj1952| | 2007-6-7 10:40 | 只看该作者

所以会出现这类问题。

难怪。一定把它加上再试试。检测0000000应该用奇校验吧。

使用特权

评论回复
15
ljt4810|  楼主 | 2007-6-11 09:40 | 只看该作者

AD采集的数据怎样用CAN传送?

  我从AD采集的数据怎样从CAN总线上传送?
   Buf[0]=0xaa;
      Buf[1]=0x06;
      Buf[2]=0x45;
      Buf[3]=0x00;
      Buf[4]=(two*90)/3300;
      Buf[5]=(three*180)/3300;
      Buf[6]=0x05;
      Buf[7]=(one*40)/3300;   //AD采集的数据
      for(i=0;i<8;i++)
    {
     write_can(addr,Buf);
     addr++;
     delay(100);
    }
   
   write_can(1,0x01);// 启动发送,置位发送请求位
 麻烦各位老师看看什么地方不对?
   

使用特权

评论回复
16
wxj1952| | 2007-6-11 10:45 | 只看该作者

少了发送缓冲区地址

 addr=0x13;   PELI。或BASIC--0x0c
 for(i=0;i<8;i++)
    {
     write_can(addr++,Buf);
     //addr++;
     delay(100);
    }
还有ID等等。

使用特权

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

本版积分规则

3

主题

19

帖子

0

粉丝