打印
[CAN-bus/DeviceNet]

不可思议的sja100通信错误!!!

[复制链接]
2103|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xhming|  楼主 | 2008-5-27 22:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用S51+SJA1000+TJA1050做的两个板子,连接在一起通信,一个发送一个接收;现在出现以下几个问题:

接收数据后,判断是否有数据溢出,有就清除数据溢出并释放缓冲区,没有的话就直接释放缓冲区,可是每次接收数据后同样是显示数据溢出,进行数据溢出处理。(即使我只发送一次也是如此)
请问这个怎么解决??


下面是我的发送程序和接收处理程序:

void SendData(void)
{
unsigned char datalong;
SendBuf[0] = 0x11;
SendBuf[1] = 0x28;
if((ReadSjaReg(REG_CONTROL)&0x01)==0) //JA1000处于工作模式

for (i=0; i<8; i++)
SendBuf[i+2]=testdata

if((ReadSjaReg(REG_STATUS)&0x08)==0x08)
{
if((ReadSjaReg(REG_STATUS)&0x04)==0x04)

*((unsigned char xdata *)REG_TxBuffer1) = SendBuf[0];
*((unsigned char xdata *)REG_TxBuffer2) = SendBuf[1];
datalong = SendBuf[1] & 0x0f;
if(datalong!=0)
{
*((unsigned char xdata *)REG_TxBuffer3) = SendBuf[2];
*((unsigned char xdata *)REG_TxBuffer4) = SendBuf[3];
*((unsigned char xdata *)REG_TxBuffer5) = SendBuf[4];
*((unsigned char xdata *)REG_TxBuffer6) = SendBuf[5];
*((unsigned char xdata *)REG_TxBuffer7) = SendBuf[6];
*((unsigned char xdata *)REG_TxBuffer8) = SendBuf[7];
*((unsigned char xdata *)REG_TxBuffer9) = SendBuf[8];
*((unsigned char xdata *)REG_TxBuffer10) = SendBuf[9];
}
BCAN_CMD_PRG(TR_CMD); //置位发送请求位
P2_0=0;


}
else //SJA1000在复位模式
{
Config_SJA();

}


//接收处理程序

void CanRcv_Prg(void)
{
unsigned char DataLong; 
if(ReadSjaReg(REG_STATUS) & 0x01 == 0x01)//工作模式下

RcvBuf[0] = *((unsigned char xdata *)REG_RxBuffer1);
RcvBuf[1] = *((unsigned char xdata *)REG_RxBuffer2);
DataLong = RcvBuf[1]&0x0f;

if(DataLong != 0)

RcvBuf[2] = *((unsigned char xdata *)REG_RxBuffer3);
RcvBuf[3] = *((unsigned char xdata *)REG_RxBuffer4);
RcvBuf[4] = *((unsigned char xdata *)REG_RxBuffer5);
RcvBuf[5] = *((unsigned char xdata *)REG_RxBuffer6);
RcvBuf[6] = *((unsigned char xdata *)REG_RxBuffer7);
RcvBuf[7] = *((unsigned char xdata *)REG_RxBuffer8);
RcvBuf[8] = *((unsigned char xdata *)REG_RxBuffer9);
RcvBuf[9] = *((unsigned char xdata *)REG_RxBuffer10);
}
if(ReadSjaReg(REG_STATUS) & 0x03 == 0x03)
{
WriteSjaReg(REG_COMMAND,0x0c); //释放缓冲区并清除溢出标志
P2_2 = 0; //(问题就在这里!!!!!!!!!)
}
else

WriteSjaReg(REG_COMMAND,0x04); //释放缓冲区
}
}
}


相关帖子

沙发
桂电飞天鼠| | 2008-5-28 01:00 | 只看该作者

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

如果确确实实是只发一帧,那应该不会溢出的啊~
你把这个溢出判断去掉,看看数据接收正常不

使用特权

评论回复
板凳
xhming|  楼主 | 2008-5-28 10:35 | 只看该作者

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

下面是我的主程序
main()
{
   init_CPU();
   init_SJA();
  // while(1)
//{
   delay(200);
   senddata();
   if(_testbit_(CanRcv_Good))   CanRcv_Prg();     //是接收中断标志
   
   if(_testbit_(CanSend_Good))  CanSend_Prg(); //是发送中断标志

   if(_testbit_(CanErrFlag))    CanErr_Prg();     //是错误中断标志

   if(_testbit_(CanDtOverFlag)) CanDtOver_Prg();//是数据溢出标志

   if(_testbit_(CanWuiFlag))    CanWui_Prg();     //是唤醒中断标志
//}
}
这样的话不就是才发送一次吗?但是也出现溢出啊

使用特权

评论回复
地板
xhming|  楼主 | 2008-5-28 10:42 | 只看该作者

接着

即使我去掉这个判断
刚开接收数据的时候是对的,但是过一会就显示溢出。

使用特权

评论回复
5
桂电飞天鼠| | 2008-5-28 20:31 | 只看该作者

re

1,保证只发送一次的话,要把命令寄存的AT位(中止发送位)用上,这样才能保证只会发一帧;

2,1050最低波特率为20K(参考资料);

3,1050的第八脚要悬空;

3,如果为第一次通信实验,把接收端的AMR设为0xff,即全部接收,不作过滤;

然后再细看数据手册的注意事项

使用特权

评论回复
6
lin404| | 2008-5-29 10:45 | 只看该作者

RE

先检查你的初始化。有可能是验收那没设置好,你发出来的信息又被自己接收。SJA1000的FIFO满了就溢出报错。

使用特权

评论回复
7
xhming|  楼主 | 2008-5-29 10:52 | 只看该作者

re

但是就算我把各自的ACR设置成另外板子的ID,同样也溢出啊

使用特权

评论回复
8
lin404| | 2008-5-29 10:55 | 只看该作者

re

你的AMR是怎么设置的?不会是0FFH吧。设置成00H了?

使用特权

评论回复
9
xhming|  楼主 | 2008-5-29 11:02 | 只看该作者

re

我现在第一个板子发送的ID是0x01  另外一个是0x11

所以第一个班子的ACR/AMR  0x11/0x00  第2个0x01/0x00
这样对吗?

使用特权

评论回复
10
xhming|  楼主 | 2008-5-29 11:08 | 只看该作者

goon

这样一来  这两个板子不就只能接收对方发送过来的数据了吗?
这个应该没问题吧  可是同样有数据溢出,请8楼的赐教!!

使用特权

评论回复
11
lin404| | 2008-5-29 11:36 | 只看该作者

RE

你的出错后,仲裁丢失捕捉寄存器和错误寄存器释放了?还有你的自测试模式能过?

使用特权

评论回复
12
xhming|  楼主 | 2008-5-29 11:45 | 只看该作者

re

我是在BasicCAN模式下的

使用特权

评论回复
13
xhming|  楼主 | 2008-5-29 20:59 | 只看该作者

求助

各位大侠:
    懂的麻烦帮我看看吧  指导以下错误,非常感谢!!!!

使用特权

评论回复
14
xhming|  楼主 | 2008-5-30 18:45 | 只看该作者

re

两位哥们  再帮忙看看吧 

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

41

帖子

0

粉丝