学者之家电子论坛--打造电子工程师共同致富的平台's Archiver

xhming 发表于 2008-5-29 22:34

[求助]不可思议的sja100通信错误!!!

<p>我用S51+SJA1000+TJA1050做的两个板子,连接在一起通信,互相发送接收;现在出现问题:<br/><br/>接收数据后,判断是否有数据溢出,有就清除数据溢出并释放缓冲区,没有的话就直接释放缓冲区,可是每次接收数据后同样是显示数据溢出,进行数据溢出处理。(即使我只发送一次也是如此)<br/>请问这个怎么解决??<br/><br/><br/>下面是我的程序:&nbsp;</p><p>#include &lt;reg51.h&gt;<br/>#include &lt;stdio.h&gt;<br/>#include &lt;intrins.h&gt;<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&nbsp; 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/>&nbsp;外部中断0处理程序&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;-------------------------------------------------------------------------------------------*/ <br/>void&nbsp; ex0_Val(void)&nbsp; interrupt&nbsp;&nbsp; 0<br/>{ <br/>&nbsp; //保存sja1000中断标志<br/>&nbsp; CanBusFlag=ReadSjaReg(REG_INTERRUPT);<br/>}</p><p>void Config_SJA(void)<br/>{<br/>&nbsp;&nbsp; WriteSjaReg(REG_CONTROL,0x01);<br/>&nbsp;&nbsp; WriteSjaReg(REG_CDR,0x48);<br/>&nbsp;&nbsp; WriteSjaReg(REG_ACR,0x01);<br/>&nbsp;&nbsp; WriteSjaReg(REG_AMR,0x00);<br/>&nbsp;&nbsp; WriteSjaReg(REG_OCR,0xaa);<br/>&nbsp;&nbsp; WriteSjaReg(REG_BTR0,0x01);<br/>&nbsp;&nbsp; WriteSjaReg(REG_BTR1,0x1c); //250kbps<br/>&nbsp;&nbsp; WriteSjaReg(REG_CONTROL, 0x1E);&nbsp; //进入操作模式&nbsp;&nbsp; <br/>}</p><p>void&nbsp; SendData(void)<br/>{<br/>&nbsp;&nbsp;&nbsp; unsigned char datalong;<br/>&nbsp;&nbsp;&nbsp; unsigned char i;</p><p>&nbsp;if((ReadSjaReg(REG_CONTROL)&amp;0x01)==0) //JA1000处于工作模式<br/>&nbsp;{&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; SendBuf[0] = 0x11;<br/>&nbsp;&nbsp;&nbsp;&nbsp; SendBuf[1] = 0x28;<br/>&nbsp;&nbsp;for (i=0; i&lt;8; i++)<br/>&nbsp;&nbsp;&nbsp;SendBuf[i+2]=testdata[i];&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp; if((ReadSjaReg(REG_STATUS)&amp;0x10)!=0x10)<br/>&nbsp;&nbsp; {<br/>&nbsp;&nbsp;if((ReadSjaReg(REG_STATUS)&amp;0x08)==0x08)<br/>&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp; if((ReadSjaReg(REG_STATUS)&amp;0x04)==0x04)<br/>&nbsp;&nbsp;&nbsp; {&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *((unsigned&nbsp;char xdata *)REG_TxBuffer1) = SendBuf[0];<br/>&nbsp;&nbsp;&nbsp;*((unsigned&nbsp;char xdata *)REG_TxBuffer2) = SendBuf[1];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; datalong = SendBuf[1] &amp; 0x0f;<br/>&nbsp;&nbsp;&nbsp;if(datalong!=0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *((unsigned&nbsp;char xdata *)REG_TxBuffer3) = SendBuf[2];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *((unsigned&nbsp;char xdata *)REG_TxBuffer4) = SendBuf[3];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *((unsigned&nbsp;char xdata *)REG_TxBuffer5) = SendBuf[4];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *((unsigned&nbsp;char xdata *)REG_TxBuffer6) = SendBuf[5];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *((unsigned&nbsp;char xdata *)REG_TxBuffer7) = SendBuf[6];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *((unsigned&nbsp;char xdata *)REG_TxBuffer8) = SendBuf[7];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *((unsigned&nbsp;char xdata *)REG_TxBuffer9) = SendBuf[8];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *((unsigned&nbsp;char xdata *)REG_TxBuffer10) = SendBuf[9];<br/>&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BCAN_CMD_PRG(TR_CMD); //置位发送请求位<br/>&nbsp;&nbsp;&nbsp;P2_0=0; <br/>&nbsp;&nbsp;&nbsp; }&nbsp;<br/>&nbsp;&nbsp;}<br/>&nbsp;&nbsp; }&nbsp;&nbsp; <br/>&nbsp;}<br/>&nbsp;else //SJA1000在复位模式<br/>&nbsp;{<br/>&nbsp;&nbsp;Config_SJA();<br/>&nbsp;} <br/>}</p><p>//can发送数据<br/>void&nbsp;&nbsp; CanSend_Prg(void)<br/>{&nbsp;<br/>&nbsp;P2_1 = 0;<br/>}</p><p>//接收处理<br/>void&nbsp;&nbsp; CanRcv_Prg(void)<br/>{<br/>&nbsp;&nbsp; unsigned char DataLong;<br/>&nbsp;&nbsp; <br/>&nbsp;&nbsp; if(ReadSjaReg(REG_STATUS) &amp; 0x01 == 0x01)<br/>&nbsp;&nbsp; { <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RcvBuf[0] = *((unsigned char xdata *)REG_RxBuffer1);<br/>&nbsp;&nbsp;&nbsp; RcvBuf[1] = *((unsigned char xdata *)REG_RxBuffer2);</p><p>&nbsp;&nbsp;&nbsp; DataLong = RcvBuf[1]&amp;0x0f;</p><p>&nbsp;&nbsp;&nbsp; if(DataLong == 0x08)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RcvBuf[2] = *((unsigned char xdata *)REG_RxBuffer3);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RcvBuf[3] = *((unsigned char xdata *)REG_RxBuffer4);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RcvBuf[4] = *((unsigned char xdata *)REG_RxBuffer5);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RcvBuf[5] = *((unsigned char xdata *)REG_RxBuffer6);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RcvBuf[6] = *((unsigned char xdata *)REG_RxBuffer7);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RcvBuf[7] = *((unsigned char xdata *)REG_RxBuffer8);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RcvBuf[8] = *((unsigned char xdata *)REG_RxBuffer9);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RcvBuf[9] = *((unsigned char xdata *)REG_RxBuffer10);<br/>&nbsp;&nbsp;&nbsp; }</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ReadSjaReg(REG_STATUS) &amp; 0x03 == 0x03)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WriteSjaReg(REG_COMMAND,0x0c); //释放缓冲区并清除溢出标志<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; P2_2 = 0;&nbsp; //(问题就在这里!!!!!!!!!!!!!!!!!!!!!!)<br/>&nbsp;&nbsp;&nbsp;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/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WriteSjaReg(REG_COMMAND,0x04); //释放缓冲区<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; P2_3 = 0;<br/>&nbsp;&nbsp;&nbsp;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/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp; }<br/>}</p><p>麻烦高手赐教!!非常感谢···<br/>void&nbsp;&nbsp; CanErr_Prg(void) //发现错误后处理<br/>{<br/>&nbsp;&nbsp; &nbsp;Config_SJA();<br/>&nbsp;P2_4 = 0;<br/>}</p><p>void&nbsp;&nbsp; CanDtOver_Prg(void)//超载处理<br/>{&nbsp;<br/>&nbsp;&nbsp;&nbsp; printf("dtoverprg!\n");<br/>&nbsp;&nbsp;&nbsp; BCAN_CMD_PRG(COS_CMD); //清除超载状态(数据溢出)<br/>&nbsp;P2_5=0;<br/>}</p><p>void&nbsp;&nbsp; CanWui_Prg(void)//唤醒中断处理<br/>{<br/>&nbsp;//P2_4 = 0;<br/>}</p><p><br/>void delay(int j)<br/>{<br/>&nbsp;idata int i;<br/>&nbsp;while(j&gt;0)<br/>&nbsp;{<br/>&nbsp;&nbsp;for(i=0;i&lt;1000;i++)<br/>&nbsp;&nbsp;{}<br/>&nbsp;&nbsp;j--;<br/>&nbsp;}<br/>}<br/>/*-------------------------------------------------------------------------------------------<br/>&nbsp;----------------------------------------主程序----------------------------------------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;-------------------------------------------------------------------------------------------*/ <br/>main()<br/>{ &nbsp;<br/>&nbsp;TMOD=0x20;<br/>&nbsp;TH1=0xfd;<br/>&nbsp;TL1=0xfd;<br/>&nbsp;TCON = 0x50;<br/>&nbsp;SCON = 0x50;<br/>&nbsp;PCON = 0x00;<br/>&nbsp;TI = 1;<br/>&nbsp;RI = 0;<br/>&nbsp;&nbsp;<br/>&nbsp;IT0 = 1; EX0 = 1;<br/>&nbsp;EA = 1;</p><p>&nbsp;delay(10);<br/>&nbsp;<br/>&nbsp;Config_SJA();</p><p>&nbsp;while(1)<br/>&nbsp;{<br/>&nbsp;&nbsp;delay(200);</p><p>&nbsp;&nbsp;SendData();<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp; &nbsp;if(_testbit_(CanRcv_Good))&nbsp;&nbsp; CanRcv_Prg();&nbsp; //是接收中断标志<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;if(_testbit_(CanSend_Good))&nbsp; CanSend_Prg();&nbsp; //是发送中断标志</p><p>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;if(_testbit_(CanErrFlag))&nbsp;&nbsp;&nbsp; CanErr_Prg();&nbsp; //是错误中断标志</p><p>&nbsp;&nbsp;if(_testbit_(CanDtOverFlag)) CanDtOver_Prg();//是数据溢出标志</p><p>&nbsp;&nbsp; &nbsp;&nbsp;if(_testbit_(CanWuiFlag))&nbsp;&nbsp;&nbsp; CanWui_Prg();&nbsp; //是唤醒中断标志</p><p>&nbsp;}<br/>}&nbsp;&nbsp; </p><p></p>

xhming 发表于 2008-5-31 11:17

斑竹&nbsp;&nbsp; 帮帮忙啊

tongfeiwa 发表于 2008-6-30 13:22

<p>各位网友好呀,真不好意思,最近放暑假我在打工,所以没有时间上网看帖子。包吃住八百元每月,一定很少吧,没办法谁叫咱是学生呢?况且家里地震了。</p><p>  你的程序我看了问题我想在以下:</p><p>   <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(_testbit_(CanRcv_Good))&nbsp;&nbsp; CanRcv_Prg();&nbsp; //是接收中断标志<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;if(_testbit_(CanSend_Good))&nbsp; CanSend_Prg();&nbsp; //是发送中断标志</p><p>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;if(_testbit_(CanErrFlag))&nbsp;&nbsp;&nbsp; CanErr_Prg();&nbsp; //是错误中断标志</p><p>&nbsp;&nbsp;if(_testbit_(CanDtOverFlag)) CanDtOver_Prg();//是数据溢出标志</p><p>&nbsp;&nbsp; &nbsp;&nbsp;if(_testbit_(CanWuiFlag))&nbsp;&nbsp;&nbsp; CanWui_Prg();&nbsp; //是唤醒中断标志</p><p>  这个在主程序中,每次都要顺序的执行完,肯定不行的,你想这样的话每次你的  if(_testbit_(CanErrFlag))&nbsp;&nbsp;&nbsp; CanErr_Prg();&nbsp; //是错误中断标志   也会执行的呀。</p><p>  这里应该是接受到正确的就跳过错误呀。</p>

无中生有 发表于 2008-6-30 13:25

<p>刚才用错号了哈!</p><p>各位网友好呀,真不好意思,最近放暑假我在打工,所以没有时间上网看帖子。包吃住八百元每月,一定很少吧,没办法谁叫咱是学生呢?况且家里地震了。</p><p>  你的程序我看了问题我想在以下:</p><p>   <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(_testbit_(CanRcv_Good))&nbsp;&nbsp; CanRcv_Prg();&nbsp; //是接收中断标志<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;if(_testbit_(CanSend_Good))&nbsp; CanSend_Prg();&nbsp; //是发送中断标志</p><p>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;if(_testbit_(CanErrFlag))&nbsp;&nbsp;&nbsp; CanErr_Prg();&nbsp; //是错误中断标志</p><p>&nbsp;&nbsp;if(_testbit_(CanDtOverFlag)) CanDtOver_Prg();//是数据溢出标志</p><p>&nbsp;&nbsp; &nbsp;&nbsp;if(_testbit_(CanWuiFlag))&nbsp;&nbsp;&nbsp; CanWui_Prg();&nbsp; //是唤醒中断标志</p><p>  这个在主程序中,每次都要顺序的执行完,肯定不行的,你想这样的话每次你的  if(_testbit_(CanErrFlag))&nbsp;&nbsp;&nbsp; CanErr_Prg();&nbsp; //是错误中断标志   也会执行的呀。</p><p>  这里应该是接受到正确的就跳过错误呀。</p>

页: [1]

Powered by Discuz! Archiver 7.1  © 2001-2009 Comsenz Inc.

302 Found

302 Found


nginx/1.8.0