[CAN-bus/DeviceNet] CAN验收滤波器

[复制链接]
 楼主| ljt4810 发表于 2007-6-4 10:29 | 显示全部楼层 |阅读模式
各位老师好!<br />  我最近做了个CAN通信,已经调通,但有很多问题不明白,请指教!<br />  我用的是BasicCAN模式,自收自发,但设置的ID号不起作用,什么都收请帮忙分析一下.接收自己发送的还是别的发送的是不是看ID啊?谢谢!<br />  &nbsp;write_can(31,0x48);&nbsp;&nbsp;//时钟分频器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write_can(4,0x10);&nbsp;&nbsp;//验收代码ID&nbsp;080<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write_can(5,0x45);&nbsp;&nbsp;//验收屏蔽寄存器&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write_can(6,0x01);&nbsp;&nbsp;//btr0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write_can(7,0x1c);&nbsp;&nbsp;//btr1&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write_can(8,0xaa);&nbsp;&nbsp;//输出控制寄存器
桂电飞天鼠 发表于 2007-6-4 12:22 | 显示全部楼层

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

够简洁的了!<br />
 楼主| ljt4810 发表于 2007-6-4 13:03 | 显示全部楼层

CAN验收滤波器

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

无效数据

未经接收中断通告的数据,是MAC层的无效数据。BASIC方式下也能自收发?我别误导了你,
 楼主| ljt4810 发表于 2007-6-4 17:13 | 显示全部楼层

接收中断

 接收中断是指控制寄存器中"接收中断使能"位置1吗?
wxj1952 发表于 2007-6-4 20:36 | 显示全部楼层

至少2点程序错误

1、没有发送/接收中断程序。没有接收中断程序如何知道网络上的数据什么时候到来?什么时候读取?用查询程序?<br /><br />2、&nbsp;write_can(4,0x10);&nbsp;&nbsp;//验收代码ID&nbsp;080<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write_can(5,0x45);&nbsp;&nbsp;//验收屏蔽寄存器&nbsp;<br />是什么意思?这样写到底希望过滤什么ID?应该&nbsp;write_can(5,0x00);&nbsp;吧。<br /><br /><br />接收中断是指IR.0=1引发的中断。
 楼主| ljt4810 发表于 2007-6-5 08:23 | 显示全部楼层

ARM程序

&nbsp;&nbsp;&nbsp;我用的是LPC2131+SJA1000+TJA1050,ARM&nbsp;c语言与C语言有所不同,我本以为是寄存器设置的问题,所以只发了初始化,我发送接收数据用的查询.<br />  void&nbsp;init_can()<br />{  uint8&nbsp;dat;<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0CLR&nbsp;&nbsp;=&nbsp;CS;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;0x40800000;INT|CS;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;write_can(0,0x01);//控制寄存器,进入复位模式,并且禁能所有中断源<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write_can(31,0x48);&nbsp;&nbsp;//时钟分频器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write_can(4,0xaa);&nbsp;&nbsp;//验收代码ID&nbsp;550<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write_can(5,0x00);&nbsp;&nbsp;//验收屏蔽寄存器&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write_can(6,0x01);&nbsp;&nbsp;//btr0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write_can(7,0x1c);&nbsp;&nbsp;//btr1&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write_can(8,0xaa);&nbsp;&nbsp;//输出控制寄存器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay(2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write_can(0,0x06);&nbsp;//退出复位模式,并且使能发送中断和接收中断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dat=&nbsp;read_can(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((dat&0x01)==1)&nbsp;//判断是否复位<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write_can(0,0x06);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />void&nbsp;Tx1(void)  //发送子程序<br />{ uint8&nbsp;i;<br />&nbsp;&nbsp;uint8&nbsp;addr=10;<br />&nbsp;&nbsp;uint8&nbsp;snd1[10]={0xaa,0x28,0x19,0x83,0x02,0x12,0x44,0x53,0x48,0x12};<br />&nbsp;&nbsp;write_can(0,0x06);&nbsp;&nbsp;//使能发送中断和接收中断,控制寄存器<br />&nbsp;&nbsp;for(i=0;i&lt10;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write_can(addr,snd1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay(100);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;write_can(1,0x05);//&nbsp;启动发送,置位发送请求位<br />&nbsp;&nbsp;&nbsp;delay(100);<br />&nbsp;}<br /><br />uint8&nbsp;receive()   //接收数据,并发到串口上<br />{&nbsp;<br />uint8&nbsp;i;&nbsp;<br />receive_data[0]=read_can(0x14);<br />receive_data[1]=read_can(0x15);<br />receive_data[2]=read_can(0x16);//data1<br />receive_data[3]=read_can(0x17);//data2<br />receive_data[4]=read_can(0x18);//data3<br />receive_data[5]=read_can(0x19);//data4<br />receive_data[6]=read_can(0x1a);//data5<br />receive_data[7]=read_can(0x1b);//data6<br />receive_data[8]=read_can(0x1c);//data7<br />receive_data[9]=read_can(0x1d);//data8<br />for(i=0;i&lt10;i++)<br />&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;UART0_SendByte(receive_data); //&nbsp;向串口发送字符串<br />&nbsp;&nbsp;&nbsp;delay(10);<br />&nbsp;}&nbsp;&nbsp;<br />write_can(1,0x04);//释放,接收缓冲器中载有信息内容被释放&nbsp;<br />return&nbsp;1;<br />}<br /><br />&nbsp;int&nbsp;main&nbsp;(void)<br />{&nbsp;init_can();<br />&nbsp;delay(10);<br />&nbsp;while(1)&nbsp;<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;Tx1();<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;delay(1000000);<br />&nbsp;&nbsp;&nbsp;receive();<br />&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;return&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><br /><br /><br /><br /><br /><br />
wxj1952 发表于 2007-6-5 09:12 | 显示全部楼层

不错,干净,简洁。

1、&nbsp;write_can(0,0x06);&nbsp;//退出复位模式,并且使能发送中断和接收中断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dat=&nbsp;read_can(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((dat&0x01)==1)&nbsp;//判断是否复位---//错,只读了一次dat<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write_can(0,0x06);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />改:do{&nbsp;write_can(0,0x06);&nbsp;//退出复位模式,并且使能发送中断和接收中断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dat=&nbsp;read_can(0);<br />&nbsp;&nbsp;&nbsp;while(!(dat&0x06));<br /><br />2、&nbsp;write_can(1,0x05);//&nbsp;启动发送,置位发送请求位----&nbsp;&nbsp;//改:0x01<br /><br /><br />&nbsp;&nbsp;&nbsp;?&nbsp;怎么查询发送成功和接收?应该是SR.3&nbsp;和SR.0。<br />&nbsp;&nbsp;&nbsp;?&nbsp;概念好像错了,启动发送后,延时,然后就接收?你怎么知道,550是否有信息到达?你怎么知道你的551信息已经确实到达了550,并且已经被妥收?<br />&nbsp;&nbsp;&nbsp;&nbsp;用你这段程序,连不连网都是一样的,都通的。就好像你的PC机没连网一样。<br />&nbsp;&nbsp;&nbsp;&nbsp;那么,跟谁通信?
 楼主| ljt4810 发表于 2007-6-5 10:19 | 显示全部楼层

to wxj1952

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

恭喜!

到底是自动化专业的。
 楼主| ljt4810 发表于 2007-6-6 13:58 | 显示全部楼层

又发现问题

  今天调试CAN总线时又发现问题了,当我发送{0xaa,0x08,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88}时正确,但发送<br />{0xaa,0x08,0x00,0x22,0x33,0x44,0x55,0x66,0x77,0x88}时出现问题了,0x00不接收,只接收了9个数,我又发送{0xaa,0x01,0x00}时显示AA 01<br />发送{0xaa,0x02,0x00,0x01}时显示AA&nbsp;02&nbsp;01<br /> 真怪!大家有没有出现这样的问题,过来分析一下.
wxj1952 发表于 2007-6-6 19:19 | 显示全部楼层

没问题。

CAN收到了。串口程序问题。把串口奇偶校验改一下。
 楼主| ljt4810 发表于 2007-6-6 19:37 | 显示全部楼层

没奇偶校验啊?

  我的串口程序没用奇偶校验啊?
wxj1952 发表于 2007-6-7 10:40 | 显示全部楼层

所以会出现这类问题。

难怪。一定把它加上再试试。检测0000000应该用奇校验吧。
 楼主| ljt4810 发表于 2007-6-11 09:40 | 显示全部楼层

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

  我从AD采集的数据怎样从CAN总线上传送?<br />   Buf[0]=0xaa;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Buf[1]=0x06;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Buf[2]=0x45;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Buf[3]=0x00;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Buf[4]=(two*90)/3300;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Buf[5]=(three*180)/3300;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Buf[6]=0x05;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Buf[7]=(one*40)/3300;&nbsp;  //AD采集的数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt8;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write_can(addr,Buf);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay(100);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;write_can(1,0x01);//&nbsp;启动发送,置位发送请求位<br /> 麻烦各位老师看看什么地方不对?<br />&nbsp;&nbsp;&nbsp;
wxj1952 发表于 2007-6-11 10:45 | 显示全部楼层

少了发送缓冲区地址

&nbsp;addr=0x13;&nbsp;&nbsp;&nbsp;PELI。或BASIC--0x0c<br />&nbsp;for(i=0;i&lt8;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write_can(addr++,Buf);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//addr++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay(100);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />还有ID等等。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

19

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部