[CAN-bus/DeviceNet] 在BASIC模式下,只有一个can节点,我该怎么调试?

[复制链接]
 楼主| 8yuuu 发表于 2007-9-12 14:02 | 显示全部楼层 |阅读模式
是这样的,我现在只有一个sja1000的CAN节点,工作在BASIC模式下,好象在这种模式下不能进行自发自收?<br />那我该怎么调试这块板子的正确性啊?
 楼主| 8yuuu 发表于 2007-9-12 16:17 | 显示全部楼层

还有,我已经置Transmit&nbsp;Interrupt&nbsp;Enable为1了,为什么我发送一数据包后,SJA1000不产生中断?会有什么原因呢?<br /><br />我发送的字节是这样的:0x00&nbsp;0x01&nbsp;0x22<br />0x00的意思是ID3--ID10的位总裁都为0.<br />0x01的意思是ID0--ID2的位总裁都为0,RTR为0,意思这是数据包,DLC0--                       DLC3为1 表示1个数据<br /><br />数据为0x22<br />
桂电飞天鼠 发表于 2007-9-12 21:21 | 显示全部楼层

rt

1,Basic一个节点没法做实验,可用Peli模式,其有自测试模式,其程序跟Basic差不了多少的;<br />2,由于Basic不能通信,所以也没中断可言.
 楼主| 8yuuu 发表于 2007-9-13 08:17 | 显示全部楼层

仍然有疑

对于桂电飞天鼠的解答,我仍然有疑问:<br />1&nbsp;Basic和Peli模式下的程序差不多?我看datasheet上两种模式的寄存器都不一样,程序会差不多?<br />2&nbsp;Basic不能通信?&nbsp;&nbsp;那不就象是Basic模式名寸实亡
wxj1952 发表于 2007-9-13 08:23 | 显示全部楼层

Basic模式可以自测试。

但是需要一些另类方法。好像以前贴过。
桂电飞天鼠 发表于 2007-9-13 14:08 | 显示全部楼层

呵呵

1,我说的一样,指的是结构一样,不就是寄存器多一些?<br />2,另类的测试方法没试过,你试过了希望能够分享一下~~~
wxj1952 发表于 2007-9-14 09:47 | 显示全部楼层

其实算不上另类

BASIC模式自测试程序<br /><br />看起来,SJA1000的BASIC模式没有自测试方式,也就是独立节点的BASIC模式由于没有STM位的设置而不能产生发送中断。这样,一旦节点启动发送,就将不停地重发,使TXERR超过127而产生EI中断,进入迟缓状态,仍然重发不停。<br /><br />AT命令可以终止节点的重发状态,清除TR,使TBS发送缓冲器状态SR.2由锁定变为释放,这正是一个发送中断触发条件!<br /><br />因此,下面这段程序,利用AT(CMR=02)命令产生发送中断,并且在中断程序中进行接收。由于CAN控制器的特殊结构,发送的帧信息必然进入接收缓存,所以调试时,观察SJA1000地址20的内容,一定与10内容一样。否则就是软件/硬件(很少故障)设置有问题,主要查OCR寄存器设置内容,......<br /><br />程序与PELI自测试功能比较,缺陷为不能测试ACR/AMR的作用/设置正确与否。<br /><br /><br /><br />#pragma&nbsp;SMALL<br />#include&ltreg51.h&gt<br />#include&ltsjaregb.h&gt<br /><br />#define&nbsp;uchar&nbsp;unsigned&nbsp;char<br /><br />uchar&nbsp;xdata&nbsp;*SJA_Adr=0x7f00;<br />#define&nbsp;can_read(RegAdr)&nbsp;&nbsp;SJA_Adr[RegAdr]<br />#define&nbsp;can_write(RegAdr,Val)&nbsp;SJA_Adr[RegAdr]=Val<br /><br /><br />uchar&nbsp;Tbuffer[10]={0x55,0x08,0x41,0x42,0x43,0x44,0x45,0x48,0x49},Rbuffer[10];<br /><br />bdata&nbsp;uchar&nbsp;TK;<br />bdata&nbsp;uchar&nbsp;RK;<br />bdata&nbsp;uchar&nbsp;MK;<br />sbit&nbsp;ANold=TK^0;<br /><br />sbit&nbsp;RBF=MK^1;<br /><br />sbit&nbsp;ANnew=RK^0;<br /><br />sbit&nbsp;AN=P1^3;<br />sbit&nbsp;LED0=P1^0;<br />sbit&nbsp;LED1=P1^1;<br />sbit&nbsp;LED2=P1^2;<br /><br />void&nbsp;initial()&nbsp;&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;uchar&nbsp;c;<br />&nbsp;&nbsp;can_write(CR,0x41);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//复位模式<br /><br />can_write(CDR,0x4f);<br />can_write(OC,0x1a);&nbsp;<br />can_write(BTR0,0x05);<br />can_write(BTR1,0xff);<br />can_write(ACR,0x55);<br />can_write(AMR,0x00);<br /><br />can_write(CR,0x04);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//操作模式,发送中断允许,关闭EI中断。<br />&nbsp;&nbsp;<br /><br />void&nbsp;send()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//发送函数<br />{&nbsp;uchar&nbsp;j,TBS;<br />TBS=10;<br />for&nbsp;(j=0;j&lt10;j++)<br />{<br />can_write(TBS++,TXdata[j]);<br />}<br />can_write(CMR,0x01);<br />}<br /><br /><br />void&nbsp;receive()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//接收函数<br />{&nbsp;&nbsp;<br />uchar&nbsp;j,RBS;<br />RBS=20;<br />for&nbsp;(j=0;j&lt10;j++)<br />{<br />RXdata[j]=can_read(RBS++);<br />}<br />can_write(CMR,4);<br />RBF=0;<br />}<br /><br /><br />void&nbsp;delay(uchar&nbsp;abc)<br />{&nbsp;<br />while(--abc);<br />}<br /><br /><br />void&nbsp;main(void)<br />{<br />uchar&nbsp;c;<br />LED0=0;<br />RBF=0;<br />ANold=AN;<br />initial();<br />TCON=0x05;<br />IE=0x81;<br /><br />while(1)<br />{<br />while(AN==ANold);&nbsp;&nbsp;&nbsp;&nbsp;//按键变化一次,发送一次<br />delay(20);&nbsp;&nbsp;&nbsp;&nbsp;//消抖动<br />ANold=AN;<br />Tbuffer[4]=TK;<br /><br />send();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//发送<br />delay(10);<br />can_write(CMR,0x02);&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;AT命令产生发送中断<br />}<br />}<br /><br />void&nbsp;int0(void)&nbsp;interrupt&nbsp;0&nbsp;using&nbsp;0<br />{<br />&nbsp;&nbsp;uchar&nbsp;c;<br />LED1=!LED1;<br />c=can_read(IR);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清除中断<br />RBF=1;<br />receive();&nbsp;&nbsp;&nbsp;&nbsp;接收<br />RK=Rbuffer[4];<br />LED2=ANnew;<br />}<br />&nbsp;<br />
 楼主| 8yuuu 发表于 2007-9-14 16:08 | 显示全部楼层

我还是写了在pelican模式下工作

可是我发现,仍然进不了中断,我中断使能也使能了啊?不知道为什么?<br />我把初始化过程贴出来,忘指点下缺少了什么步骤吧?<br />uchar&nbsp;&nbsp;Config(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;if(BCAN_CREATE_COMMUNATION())&nbsp;&nbsp;&nbsp;//检测硬件接触正确性<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(BCAN_ENTER_RETMODEL())&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//进入复位状态<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;2;<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteSJAReg(REG_CDR,0xc8);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//选择PeliCAN模式,禁止分频输出<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteSJAReg(REG_MODE,0x05);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//选择双滤波&nbsp;&nbsp;自收自发模式<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;WriteSJAReg(REG_BTR0,0x00);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteSJAReg(REG_BTR1,0x14);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//波特率<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteSJAReg(REG_OCR,0x1a);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置推挽输出<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;WriteSJAReg(REG_ENINTERRUPT,0x03);//设置中断使能<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if(BCAN_QUIT_RETMODEL())&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//退出复位状态<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;3;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

68

帖子

0

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

24

主题

68

帖子

0

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