不可思议的sja100通信错误!!!
我用S51+SJA1000+TJA1050做的两个板子,连接在一起通信,一个发送一个接收;现在出现以下几个问题:<br /><br />接收数据后,判断是否有数据溢出,有就清除数据溢出并释放缓冲区,没有的话就直接释放缓冲区,可是每次接收数据后同样是显示数据溢出,进行数据溢出处理。(即使我只发送一次也是如此)<br />请问这个怎么解决??<br /><br /><br />下面是我的发送程序和接收处理程序:<br /><br />void SendData(void)<br />{<br />unsigned char datalong;<br />SendBuf = 0x11;<br />SendBuf = 0x28;<br />if((ReadSjaReg(REG_CONTROL)&0x01)==0) //JA1000处于工作模式<br />{ <br />for (i=0; i<8; i++)<br />SendBuf=testdata; <br /><br />if((ReadSjaReg(REG_STATUS)&0x08)==0x08)<br />{<br />if((ReadSjaReg(REG_STATUS)&0x04)==0x04)<br />{ <br />*((unsigned char xdata *)REG_TxBuffer1) = SendBuf;<br />*((unsigned char xdata *)REG_TxBuffer2) = SendBuf;<br />datalong = SendBuf & 0x0f;<br />if(datalong!=0)<br />{<br />*((unsigned char xdata *)REG_TxBuffer3) = SendBuf;<br />*((unsigned char xdata *)REG_TxBuffer4) = SendBuf;<br />*((unsigned char xdata *)REG_TxBuffer5) = SendBuf;<br />*((unsigned char xdata *)REG_TxBuffer6) = SendBuf;<br />*((unsigned char xdata *)REG_TxBuffer7) = SendBuf;<br />*((unsigned char xdata *)REG_TxBuffer8) = SendBuf;<br />*((unsigned char xdata *)REG_TxBuffer9) = SendBuf;<br />*((unsigned char xdata *)REG_TxBuffer10) = SendBuf;<br />}<br />BCAN_CMD_PRG(TR_CMD); //置位发送请求位<br />P2_0=0;<br />} <br />} <br />}<br />else //SJA1000在复位模式<br />{<br />Config_SJA();<br />} <br />}<br /><br /><br />//接收处理程序<br /><br />void CanRcv_Prg(void)<br />{<br />unsigned char DataLong; <br />if(ReadSjaReg(REG_STATUS) & 0x01 == 0x01)//工作模式下<br />{ <br />RcvBuf = *((unsigned char xdata *)REG_RxBuffer1);<br />RcvBuf = *((unsigned char xdata *)REG_RxBuffer2);<br />DataLong = RcvBuf&0x0f;<br /><br />if(DataLong != 0)<br />{ <br />RcvBuf = *((unsigned char xdata *)REG_RxBuffer3);<br />RcvBuf = *((unsigned char xdata *)REG_RxBuffer4);<br />RcvBuf = *((unsigned char xdata *)REG_RxBuffer5);<br />RcvBuf = *((unsigned char xdata *)REG_RxBuffer6);<br />RcvBuf = *((unsigned char xdata *)REG_RxBuffer7);<br />RcvBuf = *((unsigned char xdata *)REG_RxBuffer8);<br />RcvBuf = *((unsigned char xdata *)REG_RxBuffer9);<br />RcvBuf = *((unsigned char xdata *)REG_RxBuffer10);<br />}<br />if(ReadSjaReg(REG_STATUS) & 0x03 == 0x03)<br />{<br />WriteSjaReg(REG_COMMAND,0x0c); //释放缓冲区并清除溢出标志<br />P2_2 = 0; //(问题就在这里!!!!!!!!!)<br />}<br />else<br />{ <br />WriteSjaReg(REG_COMMAND,0x04); //释放缓冲区<br />}<br />}<br />}<br /><br /><br />你说的只发一次(一帧),你是怎么保证的?
如果确确实实是只发一帧,那应该不会溢出的啊~<br />你把这个溢出判断去掉,看看数据接收正常不在主程序里面,我只发送一次,没有用while
下面是我的主程序<br />main()<br />{<br /> init_CPU();<br /> init_SJA();<br /> // while(1)<br />//{<br /> delay(200);<br /> senddata();<br /> if(_testbit_(CanRcv_Good)) CanRcv_Prg(); //是接收中断标志<br /> <br /> if(_testbit_(CanSend_Good)) CanSend_Prg(); //是发送中断标志<br /><br /> if(_testbit_(CanErrFlag)) CanErr_Prg(); //是错误中断标志<br /><br /> if(_testbit_(CanDtOverFlag)) CanDtOver_Prg();//是数据溢出标志<br /><br /> if(_testbit_(CanWuiFlag)) CanWui_Prg(); //是唤醒中断标志<br />//}<br />}<br />这样的话不就是才发送一次吗?但是也出现溢出啊接着
即使我去掉这个判断<br />刚开接收数据的时候是对的,但是过一会就显示溢出。re
1,保证只发送一次的话,要把命令寄存的AT位(中止发送位)用上,这样才能保证只会发一帧;<br /><br />2,1050最低波特率为20K(参考资料);<br /><br />3,1050的第八脚要悬空;<br /><br />3,如果为第一次通信实验,把接收端的AMR设为0xff,即全部接收,不作过滤;<br /><br />然后再细看数据手册的注意事项<br /><br />RE
先检查你的初始化。有可能是验收那没设置好,你发出来的信息又被自己接收。SJA1000的FIFO满了就溢出报错。re
但是就算我把各自的ACR设置成另外板子的ID,同样也溢出啊re
你的AMR是怎么设置的?不会是0FFH吧。设置成00H了?re
我现在第一个板子发送的ID是0x01 另外一个是0x11<br /><br />所以第一个班子的ACR/AMR 0x11/0x00 第2个0x01/0x00<br />这样对吗?goon
这样一来 这两个板子不就只能接收对方发送过来的数据了吗?<br />这个应该没问题吧 可是同样有数据溢出,请8楼的赐教!!RE
你的出错后,仲裁丢失捕捉寄存器和错误寄存器释放了?还有你的自测试模式能过?re
我是在BasicCAN模式下的求助
各位大侠:<br /> 懂的麻烦帮我看看吧 指导以下错误,非常感谢!!!!re
两位哥们 再帮忙看看吧 <br />
页:
[1]