打印
[ZLG-ARM]

SJA1000两个节点通信的问题

[复制链接]
2126|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
年轻不在|  楼主 | 2010-7-11 17:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
两个CAN节点,一个待测试的板(自测试已经没问题),一个USBCAN,进行通信,Peli模式,波特率同为1M,测试板发送一帧后,进错误中断:
几个寄存器的值如下:
SR  IR  TXERR  RXERR  ECC

80  20   20       50     A6
A4  F4   7F       00     53
A4  F4   7F       00     D9

用USBCAN给测试节点发数据,测试节点没有反应。
请教大家这是什么原因啊?

相关帖子

沙发
米其林r| | 2010-7-11 17:13 | 只看该作者
bit T=0;
sbit    LED_RED = P1^1;
sbit    LED_GRE = P1^0;

void InitCan()
{


P2_7 = 0;

EA = 0;
IT0=0;

SJAIntEn=0;

P1_6 = 0;
   
do
{
  ModeControlReg = 0x01;
  Delayms(500);
}while((ModeControlReg & 0x01)==0);

ClockDivideReg=0x88;//选择模式,关闭时钟输出
InterruptEnReg=0x03;//开中断

AcceptCode0Reg=0xa5;
AcceptCode1Reg=0x20;
AcceptCode2Reg=0x00;
AcceptCode3Reg=0x00;
AccepMask0Reg=0xff;
AccepMask1Reg=0xff;
AccepMask2Reg=0xff;
AccepMask3Reg=0xff;
/*
BusTiming0Reg =0x03;
BusTiming1Reg =0xff;
OutControlReg =0xaa;
RxBufstartAdr = 0;
TxErrCountReg = 0;
ErrCodeCapReg = 0;  */
do
{
  ModeControlReg = 0x0c;
}while((ModeControlReg&0x04) != 0x04);

SJAIntEn=1;
EA = 1;
}

void Ext0_ISR (void) interrupt 0
{               
T=1;
SendSBUF(InterruptReg);
return;
}

void main()
{
    unsigned char i1;
InitComm();
InitTimer();

P2_7 = 0;
P1_6 = 1;
Delayms(500);
InitCan();

i1=StatusReg;
SendSBUF(i1);


Delayms(5000);

i1=StatusReg;
SendSBUF(i1);
TxFramInFo = 0x08; /*SFF(data) DLC8 */
TxBuffer1 = 0xA5; /*标识符1 A5 1010 0101 */
TxBuffer2 = 0x20; /*标识符2 20 0010 0000 */
TxBuffer3 = 0x51; /*data1 =51 */
TxBuffer4 = 0x52;
TxBuffer5 = 0x53;
TxBuffer6 = 0x54;
TxBuffer7 = 0x55;
TxBuffer8 = 0x56;
TxBuffer9 = 0x57;
TxBuffer10 = 0x58; /*data8 =58 */
/*启动发送 */
CommandReg =0x10; /*置位发送请求位*/


i1=StatusReg;
SendSBUF(i1);
Delayms(5);
i1=StatusReg;
SendSBUF(i1);

while(1)
{
  if(T)  LED_GRE=~LED_GRE;
  LED_RED = ~LED_RED;
  Delayms(5000);
}

}
输出为3C 3C 98 30 十六进制没有中断 我的程序有什么问题 谢谢

使用特权

评论回复
板凳
思行合一| | 2010-7-11 17:13 | 只看该作者
你好像没有复位啊?SR应为0x0c时才能发送,先硬件复位,再进入复位模式。硬件复位后要等一两个微秒才能读写寄存器。

我的初始化程序和主程序如下:



//sja1000复位
void can_reset(void)
{
   PORTE &=~BIT(PE0);//低电平有效
   delay_us(2);
   PORTE|=BIT(PE0); //复位结束
   delay_us(2);
}



void sja1000_init(void)
{
   
   Write_Sja1000(MOD,0x01);
    while(!(Read_Sja1000(MOD)&0x01))
   {
      Write_Sja1000(MOD,0x01);
   }

   XBYTE[CDR]=0xC8;//时钟分频寄存器, 选择PeliCAN模式,关闭时钟输出(CLKOUT)
   XBYTE[OCR]=0x1a;//输出控制寄存器

   XBYTE[IER]=0xFF;//

   XBYTE[BTR0]=0x00;//1000Kbps,总线定时寄存器
   XBYTE[BTR1]=0x14;

   XBYTE[AC0]=0x00;// 接收代码寄存器
   XBYTE[AC1]=0x00;
   XBYTE[AC2]=0x00;
   XBYTE[AC3]=0x00;
  
   XBYTE[ACM0]=0xFF;//接收屏蔽寄存器
   XBYTE[ACM1]=0xFF;
   XBYTE[ACM2]=0xFF;
   XBYTE[ACM3]=0xFF;
  

   XBYTE[IR]=0x00;
   XBYTE[RXERR]=0x00;
   XBYTE[TXERR]=0x00;
   XBYTE[BSA]=0x00;
   
   XBYTE[CMR]=0x04;

   XBYTE[MOD]=0x04;//退出复位模式
   while(XBYTE[MOD] != 0x04)
   {
      Write_Sja1000(MOD,0x04);
   }
}

void Send_Data(void)
{
    uchar state;

//初始化标示码头信息
    send_buf[0] = 0x88; //.7=1--扩展帧;.6=0--数据帧; .0-.3=100--数据长度为8字节
    send_buf[1] = 0x00; //本帧信息的ID
    send_buf[2] = 0x00;
    send_buf[3] = 0x00;
    send_buf[4] = 0x00;

//初始化发送数据单元
    send_buf[5]  = 0x00;//发送的第1个字节数据
    send_buf[6]  = 0x02; //2
    send_buf[7]  = 0x03; //3
    send_buf[8]  = 0x04; //4
    send_buf[9]  = 0x05; //5
    send_buf[10] = 0x06; //6
    send_buf[11] = 0x07; //7
    send_buf[12] = 0x08; //8
//初始化数据信息


    CLI();  //关闭全局中断
//查询SJA1000是否处于接收状态,当SJA1000不处于接收状态时才可继续执行
    do
    {
       state = XBYTE[SR]; ////SR为SJA1000的状态寄存器
    }while( state & 0x10 );  //SR.4=1 正在接收,等待直到 SR.4=0
//---------查询SJA1000是否处于发送完毕状态----------//
    do
    {
         state = XBYTE[SR];
    }while(!(state & 0x08)); //SR.3=0,发送请求未处理完,等待直到SR.3=1
//---------------查询发送缓冲器状态-----------------//
    do
    {
      state = XBYTE[SR];
    }while(!(state & 0x04)); //SR.2=0,发送缓冲器被锁。等待直到SR.2=1
//将待发送的一帧数据信息存入SJA1000的相应寄存器中
XBYTE[TXF]  = send_buf[0];
XBYTE[TXI1] = send_buf[1];
XBYTE[TXI2] = send_buf[2];
XBYTE[TXI3] = send_buf[3];
XBYTE[TXI4] = send_buf[4];
XBYTE[TXD1] = send_buf[5];
XBYTE[TXD2] = send_buf[6];
XBYTE[TXD3] = send_buf[7];
XBYTE[TXD4] = send_buf[8];
XBYTE[TXD5] = send_buf[9];
XBYTE[TXD6] = send_buf[10];
XBYTE[TXD7] = send_buf[11];
XBYTE[TXD8] = send_buf[12];

XBYTE[CMR] = 0x10;        //自接收

SEI();                   //开启CPU中断
}





void main(void)
{
  unsigned int tmp=0;
  CLI(); //disable all interrupts
  Port_Init();
  uart_int();
  can_reset();
  delay_us(5);
  sja1000_init();
  delay_us(10);


  Send_Data();
}

使用特权

评论回复
地板
年轻不在|  楼主 | 2010-7-11 17:14 | 只看该作者
w我发AA收到的是下面的    对吗?

13 C0 40 16 08 D4 0A FF 13 81 40 66 40 00 0D 81

13 60 20 16 08 D4 1A FF 13 82 B3 40 A0 88 FC

13 C1 40 16 08 D4 2A FF 13 83 40 66 40 00 0F C1

使用特权

评论回复
5
想实习去| | 2010-7-11 17:14 | 只看该作者
这些不对,正确的话,IR为0x01(IER=0x01)或0x03(IER=0x03);

使用特权

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

本版积分规则

106

主题

447

帖子

1

粉丝