[求助]不可思议的sja100通信错误!!!
<p>我用S51+SJA1000+TJA1050做的两个板子,连接在一起通信,互相发送接收;现在出现问题:<br/><br/>接收数据后,判断是否有数据溢出,有就清除数据溢出并释放缓冲区,没有的话就直接释放缓冲区,可是每次接收数据后同样是显示数据溢出,进行数据溢出处理。(即使我只发送一次也是如此)<br/>请问这个怎么解决??<br/><br/><br/>下面是我的程序: </p><p>#include <reg51.h><br/>#include <stdio.h><br/>#include <intrins.h><br/>#include "SJA_BCANCONF.H"</p><p>unsigned char RcvBuf[10];<br/>unsigned char SendBuf[10];</p><p>unsigned char testdata[8] = {0x55,0x44,0x33,0x22,0x11,0x00,0x11,0x22};</p><p>static unsigned char bdata CanBusFlag=0;<br/>sbit CanRcv_Good = CanBusFlag^0;<br/>sbit CanSend_Good = CanBusFlag^1;<br/>sbit CanErrFlag = CanBusFlag^2;<br/>sbit CanDtOverFlag = CanBusFlag^3;<br/>sbit CanWuiFlag = CanBusFlag^4;</p><p>sbit P2_0 = P2^0;<br/>sbit P2_1 = P2^1;<br/>sbit P2_2 = P2^2;<br/>sbit P2_3 = P2^3;<br/>sbit P2_4 = P2^4;<br/>sbit P2_5 = P2^5;<br/>/*-------------------------------------------------------------------------------------------<br/> 外部中断0处理程序 <br/> -------------------------------------------------------------------------------------------*/ <br/>void ex0_Val(void) interrupt 0<br/>{ <br/> //保存sja1000中断标志<br/> CanBusFlag=ReadSjaReg(REG_INTERRUPT);<br/>}</p><p>void Config_SJA(void)<br/>{<br/> WriteSjaReg(REG_CONTROL,0x01);<br/> WriteSjaReg(REG_CDR,0x48);<br/> WriteSjaReg(REG_ACR,0x01);<br/> WriteSjaReg(REG_AMR,0x00);<br/> WriteSjaReg(REG_OCR,0xaa);<br/> WriteSjaReg(REG_BTR0,0x01);<br/> WriteSjaReg(REG_BTR1,0x1c); //250kbps<br/> WriteSjaReg(REG_CONTROL, 0x1E); //进入操作模式 <br/>}</p><p>void SendData(void)<br/>{<br/> unsigned char datalong;<br/> unsigned char i;</p><p> if((ReadSjaReg(REG_CONTROL)&0x01)==0) //JA1000处于工作模式<br/> { <br/> SendBuf[0] = 0x11;<br/> SendBuf[1] = 0x28;<br/> for (i=0; i<8; i++)<br/> SendBuf[i+2]=testdata[i]; <br/> if((ReadSjaReg(REG_STATUS)&0x10)!=0x10)<br/> {<br/> if((ReadSjaReg(REG_STATUS)&0x08)==0x08)<br/> {<br/> if((ReadSjaReg(REG_STATUS)&0x04)==0x04)<br/> { <br/> *((unsigned char xdata *)REG_TxBuffer1) = SendBuf[0];<br/> *((unsigned char xdata *)REG_TxBuffer2) = SendBuf[1];<br/> datalong = SendBuf[1] & 0x0f;<br/> if(datalong!=0)<br/> {<br/> *((unsigned char xdata *)REG_TxBuffer3) = SendBuf[2];<br/> *((unsigned char xdata *)REG_TxBuffer4) = SendBuf[3];<br/> *((unsigned char xdata *)REG_TxBuffer5) = SendBuf[4];<br/> *((unsigned char xdata *)REG_TxBuffer6) = SendBuf[5];<br/> *((unsigned char xdata *)REG_TxBuffer7) = SendBuf[6];<br/> *((unsigned char xdata *)REG_TxBuffer8) = SendBuf[7];<br/> *((unsigned char xdata *)REG_TxBuffer9) = SendBuf[8];<br/> *((unsigned char xdata *)REG_TxBuffer10) = SendBuf[9];<br/> }<br/> BCAN_CMD_PRG(TR_CMD); //置位发送请求位<br/> P2_0=0; <br/> } <br/> }<br/> } <br/> }<br/> else //SJA1000在复位模式<br/> {<br/> Config_SJA();<br/> } <br/>}</p><p>//can发送数据<br/>void CanSend_Prg(void)<br/>{ <br/> P2_1 = 0;<br/>}</p><p>//接收处理<br/>void CanRcv_Prg(void)<br/>{<br/> unsigned char DataLong;<br/> <br/> if(ReadSjaReg(REG_STATUS) & 0x01 == 0x01)<br/> { <br/> RcvBuf[0] = *((unsigned char xdata *)REG_RxBuffer1);<br/> RcvBuf[1] = *((unsigned char xdata *)REG_RxBuffer2);</p><p> DataLong = RcvBuf[1]&0x0f;</p><p> if(DataLong == 0x08)<br/> { <br/> RcvBuf[2] = *((unsigned char xdata *)REG_RxBuffer3);<br/> RcvBuf[3] = *((unsigned char xdata *)REG_RxBuffer4);<br/> RcvBuf[4] = *((unsigned char xdata *)REG_RxBuffer5);<br/> RcvBuf[5] = *((unsigned char xdata *)REG_RxBuffer6);<br/> RcvBuf[6] = *((unsigned char xdata *)REG_RxBuffer7);<br/> RcvBuf[7] = *((unsigned char xdata *)REG_RxBuffer8);<br/> RcvBuf[8] = *((unsigned char xdata *)REG_RxBuffer9);<br/> RcvBuf[9] = *((unsigned char xdata *)REG_RxBuffer10);<br/> }</p><p> if(ReadSjaReg(REG_STATUS) & 0x03 == 0x03)<br/> {<br/> WriteSjaReg(REG_COMMAND,0x0c); //释放缓冲区并清除溢出标志<br/> P2_2 = 0; //(问题就在这里!!!!!!!!!!!!!!!!!!!!!!)<br/> printf("Data: %2BX, %2BX,%2BX, %2BX, %2BX, %2BX, %2BX, %2BX, %2BX, %2BX\n", RcvBuf[0],RcvBuf[1],RcvBuf[2],RcvBuf[3],RcvBuf[4],RcvBuf[5],RcvBuf[6],RcvBuf[7],RcvBuf[8],RcvBuf[9]);<br/> }<br/> else<br/> { <br/> WriteSjaReg(REG_COMMAND,0x04); //释放缓冲区<br/> P2_3 = 0;<br/> printf("Data: %2BX, %2BX, %2BX, %2BX, %2BX, %2BX, %2BX, %2BX\n", RcvBuf[2],RcvBuf[3],RcvBuf[4],RcvBuf[5],RcvBuf[6],RcvBuf[7],RcvBuf[8],RcvBuf[9]);<br/> }<br/> }<br/>}</p><p>麻烦高手赐教!!非常感谢···<br/>void CanErr_Prg(void) //发现错误后处理<br/>{<br/> Config_SJA();<br/> P2_4 = 0;<br/>}</p><p>void CanDtOver_Prg(void)//超载处理<br/>{ <br/> printf("dtoverprg!\n");<br/> BCAN_CMD_PRG(COS_CMD); //清除超载状态(数据溢出)<br/> P2_5=0;<br/>}</p><p>void CanWui_Prg(void)//唤醒中断处理<br/>{<br/> //P2_4 = 0;<br/>}</p><p><br/>void delay(int j)<br/>{<br/> idata int i;<br/> while(j>0)<br/> {<br/> for(i=0;i<1000;i++)<br/> {}<br/> j--;<br/> }<br/>}<br/>/*-------------------------------------------------------------------------------------------<br/> ----------------------------------------主程序---------------------------------------- <br/> -------------------------------------------------------------------------------------------*/ <br/>main()<br/>{ <br/> TMOD=0x20;<br/> TH1=0xfd;<br/> TL1=0xfd;<br/> TCON = 0x50;<br/> SCON = 0x50;<br/> PCON = 0x00;<br/> TI = 1;<br/> RI = 0;<br/> <br/> IT0 = 1; EX0 = 1;<br/> EA = 1;</p><p> delay(10);<br/> <br/> Config_SJA();</p><p> while(1)<br/> {<br/> delay(200);</p><p> SendData();<br/> <br/> if(_testbit_(CanRcv_Good)) CanRcv_Prg(); //是接收中断标志<br/> <br/> if(_testbit_(CanSend_Good)) CanSend_Prg(); //是发送中断标志</p><p> if(_testbit_(CanErrFlag)) CanErr_Prg(); //是错误中断标志</p><p> if(_testbit_(CanDtOverFlag)) CanDtOver_Prg();//是数据溢出标志</p><p> if(_testbit_(CanWuiFlag)) CanWui_Prg(); //是唤醒中断标志</p><p> }<br/>} </p><p></p> 斑竹 帮帮忙啊 <p>各位网友好呀,真不好意思,最近放暑假我在打工,所以没有时间上网看帖子。包吃住八百元每月,一定很少吧,没办法谁叫咱是学生呢?况且家里地震了。</p><p> 你的程序我看了问题我想在以下:</p><p> <br/> if(_testbit_(CanRcv_Good)) CanRcv_Prg(); //是接收中断标志<br/> <br/> if(_testbit_(CanSend_Good)) CanSend_Prg(); //是发送中断标志</p><p> if(_testbit_(CanErrFlag)) CanErr_Prg(); //是错误中断标志</p><p> if(_testbit_(CanDtOverFlag)) CanDtOver_Prg();//是数据溢出标志</p><p> if(_testbit_(CanWuiFlag)) CanWui_Prg(); //是唤醒中断标志</p><p> 这个在主程序中,每次都要顺序的执行完,肯定不行的,你想这样的话每次你的 if(_testbit_(CanErrFlag)) CanErr_Prg(); //是错误中断标志 也会执行的呀。</p><p> 这里应该是接受到正确的就跳过错误呀。</p> <p>刚才用错号了哈!</p><p>各位网友好呀,真不好意思,最近放暑假我在打工,所以没有时间上网看帖子。包吃住八百元每月,一定很少吧,没办法谁叫咱是学生呢?况且家里地震了。</p><p> 你的程序我看了问题我想在以下:</p><p> <br/> if(_testbit_(CanRcv_Good)) CanRcv_Prg(); //是接收中断标志<br/> <br/> if(_testbit_(CanSend_Good)) CanSend_Prg(); //是发送中断标志</p><p> if(_testbit_(CanErrFlag)) CanErr_Prg(); //是错误中断标志</p><p> if(_testbit_(CanDtOverFlag)) CanDtOver_Prg();//是数据溢出标志</p><p> if(_testbit_(CanWuiFlag)) CanWui_Prg(); //是唤醒中断标志</p><p> 这个在主程序中,每次都要顺序的执行完,肯定不行的,你想这样的话每次你的 if(_testbit_(CanErrFlag)) CanErr_Prg(); //是错误中断标志 也会执行的呀。</p><p> 这里应该是接受到正确的就跳过错误呀。</p>页:
[1]