关于基于SJA1000的can节点通信

shuigongtianlan   2010-3-14 10:38 楼主
本人做了两个基于SJA1000的can节点,每个节点在PELI模式下都能实现自发自收,但连在总线上时不能通信。
当一个节点发送数据时,查了SR的状态标志位0x08,一直为1,说明上次的发送还未处理完,应该是没有收到另外一个节点的应答信号吧。我查了资料,要收到另外一个节点的应答信号,只要另外一个节点的波特率和初始化都正确的话就可以了,但是两个节点的初始化都是没问题的,至于波特率我换了好多个都是不行。
我的收发器用的是82c251,斜率电阻用47k
望哪个高手能解答一下

回复评论 (7)

上次的发送还未处理完,说明总线忙,查查为什么。
点赞  2010-3-14 13:14
82c251 S脚拉低了吗?线长度过长,终端电阻加了吗?SJA1000输出脚设置对吗?最好先用示波器看看总线上有数据在发送不。
点赞  2010-3-14 23:49
还是一样的问题,一个节点收不到另外一个节点的应答信号,发送标志位一直为1,我查了另外一个节点的接入点(82c251的RX),有波形输入啊,那硬件应该没问题啊,自检也可以啊,程序我找了好多个,难道是程序的问题?我用普通的线连起来的,大概有30cm长而已,有接终端电阻

#include "SJA_BCANCONF.H"
#include


/* 初始化SJA1000                       */
unsigned char SJA1000_Config_Normal()
{
if(BCAN_CREATE_COMMUNATION()) return 1;//读写测试寄存器失败

if(BCAN_ENTER_RETMODEL()) return 2; //复位失败

if(BCAN_SET_OUTCLK (0x1a,0x88)) return 4;//设置OCR=0X1A,T0推挽输出         CDR=0X00,peli模式,输入没有启用旁路功能 时钟输出为 fOSC/2                          失败

if(BCAN_SET_BANDRATE(0x00)) return 3; //设置波特率通信          失败


if(BCAN_SET_OBJECT(0x44,0x55,0x66,0x00,0x00,0x00,0x00,0x0f)) return 5;

if(BCAN_MODE_COMMUNATION(0x08)) return 8;//设置单滤波模式          包括恢复到工作模式

return 0;//初始化成功
}

#include "regx52.h"                         //创作时间2009-03-04
#include
#include "lcd1602.c"
#include "key.c"
#include"SJA_BCANCONF.c"
bit SuccessFlag=1;
unsigned test=1;
unsigned temp;
//
void main()
{
SJA1000_RST=1;

delay1ms(200); //启动等待,等LCD讲入工作状态
LCDInit(); //LCD初始化

SJA1000_RST=0;//SJA1000硬件复位
delay1ms(2);

SJA1000_RST=1;       
delay1ms(5);


DisplayOneChar(5,0,SJA1000_Config_Normal()+'0');//SJA1000 initial


                                 SuccessFlag=BCAN_DATA_WRITE(SendData);//发数据
                                 
                                 if(!SuccessFlag)
                                 {
                                 DisplayOneChar(10, 0, '0');
                                 BCAN_CMD_PRG(TR_CMD); //启动发送命令
                                 }
                                 else         DisplayOneChar(10, 0, '1');
       
                                 

                                SJA_BCANAdr = REG_STATUS; //访问地址指向状态寄存器
                                 temp=*SJA_BCANAdr;

                                 DisplayOneChar(4, 1, temp/100+'0');//显示SR的值
                                DisplayOneChar(5, 1,(temp/10)%10+'0');
                               DisplayOneChar(6, 1,temp%10+'0');
                                temp&=0x20;
                                 while(temp == 0x20)            //检查是否发送完成
                                  {
                                         DisplayOneChar(11, 0, '1');
                                  temp=*SJA_BCANAdr;
                                 DisplayOneChar(4, 1, temp/100+'0');
                                 DisplayOneChar(5, 1,(temp/10)%10+'0');
                                 DisplayOneChar(6, 1,temp%10+'0');
                                temp&=0x20;
                                   }

                                 DisplayOneChar(11, 0, '0');
       
               
                                  test^=1;
                                 led3=test;//test跟踪按键的变化
                               
                                 }break;

       
                                   SJA_BCANAdr= REG_Receive_Counter;//查看接收缓冲区中信息的个数
                                  temp=*SJA_BCANAdr;
                                   DisplayOneChar(14, 1, temp/10+'0');
                                    DisplayOneChar(15, 1, temp%10+'0');

                                 
                                  SuccessFlag=BCAN_DATA_RECEIVE(ReceiveData);//接收数据
                                 if(!SuccessFlag)
                                   {
                                 
                                 DisplayOneChar(15, 0, '0');
                                  for(k=0;k<13;k++)//显示数据
                                     {
                                  DisplayOneChar(k, 1, ReceiveData[k]+'0');
                                      }
                                        }
                               else         DisplayOneChar(15, 0, '1');       
                                  
                              
while(1);
}

code unsigned char SendData[13]={0x88,0x44,0x55,0x66,0x00,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x02};  //扩展帧,长度为8
unsigned char ReceiveData[13]={0,0,0,0,0,0,0,0,0,0,0,0,0}; //存放接收数据
点赞  2010-3-15 22:06
嘿嘿,两年前俺的毕业设计,呜呜。我忘记了。
点赞  2010-3-16 11:13
发送数据后我查了SR寄存器,值为0x30,说明又在传输数据又在接受数据,可我设置的是正常工作模式,不是自检模式啊,自检模式之前调过了可以用,真是晕啊,
点赞  2010-3-16 12:31
没弄过,

MARK, 学习下 、
点赞  2010-3-16 12:35
今天终于实现了两个点的通信了,原来是板上的晶振引脚虚焊了,但是奇怪的是居然自检成功了,CAN_H和CAN_L上有波形,真是郁闷,不过总算搞定了。。
点赞  2010-3-18 18:34
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复