[CAN-bus/DeviceNet] 不可思议的sja100通信错误!!!

[复制链接]
 楼主| xhming 发表于 2008-5-27 22:08 | 显示全部楼层 |阅读模式
我用S51+SJA1000+TJA1050做的两个板子,连接在一起通信,一个发送一个接收;现在出现以下几个问题:<br /><br />接收数据后,判断是否有数据溢出,有就清除数据溢出并释放缓冲区,没有的话就直接释放缓冲区,可是每次接收数据后同样是显示数据溢出,进行数据溢出处理。(即使我只发送一次也是如此)<br />请问这个怎么解决??<br /><br /><br />下面是我的发送程序和接收处理程序:<br /><br />void&nbsp;SendData(void)<br />{<br />unsigned&nbsp;char&nbsp;datalong;<br />SendBuf[0]&nbsp;=&nbsp;0x11;<br />SendBuf[1]&nbsp;=&nbsp;0x28;<br />if((ReadSjaReg(REG_CONTROL)&0x01)==0)&nbsp;//JA1000处于工作模式<br />{&nbsp;<br />for&nbsp;(i=0;&nbsp;i&lt8;&nbsp;i++)<br />SendBuf[i+2]=testdata;&nbsp;<br /><br />if((ReadSjaReg(REG_STATUS)&0x08)==0x08)<br />{<br />if((ReadSjaReg(REG_STATUS)&0x04)==0x04)<br />{&nbsp;<br />*((unsigned&nbsp;char&nbsp;xdata&nbsp;*)REG_TxBuffer1)&nbsp;=&nbsp;SendBuf[0];<br />*((unsigned&nbsp;char&nbsp;xdata&nbsp;*)REG_TxBuffer2)&nbsp;=&nbsp;SendBuf[1];<br />datalong&nbsp;=&nbsp;SendBuf[1]&nbsp;&&nbsp;0x0f;<br />if(datalong!=0)<br />{<br />*((unsigned&nbsp;char&nbsp;xdata&nbsp;*)REG_TxBuffer3)&nbsp;=&nbsp;SendBuf[2];<br />*((unsigned&nbsp;char&nbsp;xdata&nbsp;*)REG_TxBuffer4)&nbsp;=&nbsp;SendBuf[3];<br />*((unsigned&nbsp;char&nbsp;xdata&nbsp;*)REG_TxBuffer5)&nbsp;=&nbsp;SendBuf[4];<br />*((unsigned&nbsp;char&nbsp;xdata&nbsp;*)REG_TxBuffer6)&nbsp;=&nbsp;SendBuf[5];<br />*((unsigned&nbsp;char&nbsp;xdata&nbsp;*)REG_TxBuffer7)&nbsp;=&nbsp;SendBuf[6];<br />*((unsigned&nbsp;char&nbsp;xdata&nbsp;*)REG_TxBuffer8)&nbsp;=&nbsp;SendBuf[7];<br />*((unsigned&nbsp;char&nbsp;xdata&nbsp;*)REG_TxBuffer9)&nbsp;=&nbsp;SendBuf[8];<br />*((unsigned&nbsp;char&nbsp;xdata&nbsp;*)REG_TxBuffer10)&nbsp;=&nbsp;SendBuf[9];<br />}<br />BCAN_CMD_PRG(TR_CMD);&nbsp;//置位发送请求位<br />P2_0=0;<br />}&nbsp;<br />}&nbsp;<br />}<br />else&nbsp;//SJA1000在复位模式<br />{<br />Config_SJA();<br />}&nbsp;<br />}<br /><br /><br />//接收处理程序<br /><br />void&nbsp;CanRcv_Prg(void)<br />{<br />unsigned&nbsp;char&nbsp;DataLong;&nbsp;<br />if(ReadSjaReg(REG_STATUS)&nbsp;&&nbsp;0x01&nbsp;==&nbsp;0x01)//工作模式下<br />{&nbsp;<br />RcvBuf[0]&nbsp;=&nbsp;*((unsigned&nbsp;char&nbsp;xdata&nbsp;*)REG_RxBuffer1);<br />RcvBuf[1]&nbsp;=&nbsp;*((unsigned&nbsp;char&nbsp;xdata&nbsp;*)REG_RxBuffer2);<br />DataLong&nbsp;=&nbsp;RcvBuf[1]&0x0f;<br /><br />if(DataLong&nbsp;!=&nbsp;0)<br />{&nbsp;<br />RcvBuf[2]&nbsp;=&nbsp;*((unsigned&nbsp;char&nbsp;xdata&nbsp;*)REG_RxBuffer3);<br />RcvBuf[3]&nbsp;=&nbsp;*((unsigned&nbsp;char&nbsp;xdata&nbsp;*)REG_RxBuffer4);<br />RcvBuf[4]&nbsp;=&nbsp;*((unsigned&nbsp;char&nbsp;xdata&nbsp;*)REG_RxBuffer5);<br />RcvBuf[5]&nbsp;=&nbsp;*((unsigned&nbsp;char&nbsp;xdata&nbsp;*)REG_RxBuffer6);<br />RcvBuf[6]&nbsp;=&nbsp;*((unsigned&nbsp;char&nbsp;xdata&nbsp;*)REG_RxBuffer7);<br />RcvBuf[7]&nbsp;=&nbsp;*((unsigned&nbsp;char&nbsp;xdata&nbsp;*)REG_RxBuffer8);<br />RcvBuf[8]&nbsp;=&nbsp;*((unsigned&nbsp;char&nbsp;xdata&nbsp;*)REG_RxBuffer9);<br />RcvBuf[9]&nbsp;=&nbsp;*((unsigned&nbsp;char&nbsp;xdata&nbsp;*)REG_RxBuffer10);<br />}<br />if(ReadSjaReg(REG_STATUS)&nbsp;&&nbsp;0x03&nbsp;==&nbsp;0x03)<br />{<br />WriteSjaReg(REG_COMMAND,0x0c);&nbsp;//释放缓冲区并清除溢出标志<br />P2_2&nbsp;=&nbsp;0;&nbsp;//(问题就在这里!!!!!!!!!)<br />}<br />else<br />{&nbsp;<br />WriteSjaReg(REG_COMMAND,0x04);&nbsp;//释放缓冲区<br />}<br />}<br />}<br /><br /><br />
桂电飞天鼠 发表于 2008-5-28 01:00 | 显示全部楼层

你说的只发一次(一帧),你是怎么保证的?

如果确确实实是只发一帧,那应该不会溢出的啊~<br />你把这个溢出判断去掉,看看数据接收正常不
 楼主| xhming 发表于 2008-5-28 10:35 | 显示全部楼层

在主程序里面,我只发送一次,没有用while

下面是我的主程序<br />main()<br />{<br />&nbsp;&nbsp;&nbsp;init_CPU();<br />&nbsp;&nbsp;&nbsp;init_SJA();<br />&nbsp;&nbsp;//&nbsp;while(1)<br />//{<br />&nbsp;&nbsp;&nbsp;delay(200);<br />&nbsp;&nbsp;&nbsp;senddata();<br />&nbsp;&nbsp;&nbsp;if(_testbit_(CanRcv_Good))&nbsp;&nbsp;&nbsp;CanRcv_Prg();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//是接收中断标志<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;if(_testbit_(CanSend_Good))&nbsp;&nbsp;CanSend_Prg();&nbsp;//是发送中断标志<br /><br />&nbsp;&nbsp;&nbsp;if(_testbit_(CanErrFlag))&nbsp;&nbsp;&nbsp;&nbsp;CanErr_Prg();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//是错误中断标志<br /><br />&nbsp;&nbsp;&nbsp;if(_testbit_(CanDtOverFlag))&nbsp;CanDtOver_Prg();//是数据溢出标志<br /><br />&nbsp;&nbsp;&nbsp;if(_testbit_(CanWuiFlag))&nbsp;&nbsp;&nbsp;&nbsp;CanWui_Prg();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//是唤醒中断标志<br />//}<br />}<br />这样的话不就是才发送一次吗?但是也出现溢出啊
 楼主| xhming 发表于 2008-5-28 10:42 | 显示全部楼层

接着

即使我去掉这个判断<br />刚开接收数据的时候是对的,但是过一会就显示溢出。
桂电飞天鼠 发表于 2008-5-28 20:31 | 显示全部楼层

re

1,保证只发送一次的话,要把命令寄存的AT位(中止发送位)用上,这样才能保证只会发一帧;<br /><br />2,1050最低波特率为20K(参考资料);<br /><br />3,1050的第八脚要悬空;<br /><br />3,如果为第一次通信实验,把接收端的AMR设为0xff,即全部接收,不作过滤;<br /><br />然后再细看数据手册的注意事项<br /><br />
lin404 发表于 2008-5-29 10:45 | 显示全部楼层

RE

先检查你的初始化。有可能是验收那没设置好,你发出来的信息又被自己接收。SJA1000的FIFO满了就溢出报错。
 楼主| xhming 发表于 2008-5-29 10:52 | 显示全部楼层

re

但是就算我把各自的ACR设置成另外板子的ID,同样也溢出啊
lin404 发表于 2008-5-29 10:55 | 显示全部楼层

re

你的AMR是怎么设置的?不会是0FFH吧。设置成00H了?
 楼主| xhming 发表于 2008-5-29 11:02 | 显示全部楼层

re

我现在第一个板子发送的ID是0x01&nbsp;&nbsp;另外一个是0x11<br /><br />所以第一个班子的ACR/AMR&nbsp;&nbsp;0x11/0x00&nbsp;&nbsp;第2个0x01/0x00<br />这样对吗?
 楼主| xhming 发表于 2008-5-29 11:08 | 显示全部楼层

goon

这样一来&nbsp;&nbsp;这两个板子不就只能接收对方发送过来的数据了吗?<br />这个应该没问题吧&nbsp;&nbsp;可是同样有数据溢出,请8楼的赐教!!
lin404 发表于 2008-5-29 11:36 | 显示全部楼层

RE

你的出错后,仲裁丢失捕捉寄存器和错误寄存器释放了?还有你的自测试模式能过?
 楼主| xhming 发表于 2008-5-29 11:45 | 显示全部楼层

re

我是在BasicCAN模式下的
 楼主| xhming 发表于 2008-5-29 20:59 | 显示全部楼层

求助

各位大侠:<br />&nbsp;&nbsp;&nbsp;&nbsp;懂的麻烦帮我看看吧&nbsp;&nbsp;指导以下错误,非常感谢!!!!
 楼主| xhming 发表于 2008-5-30 18:45 | 显示全部楼层

re

两位哥们&nbsp;&nbsp;再帮忙看看吧&nbsp;<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

41

帖子

0

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

14

主题

41

帖子

0

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