Board logo

标题: 求助CAN总线 [打印本页]

作者: Evangeline    时间: 2006-1-7 14:02     标题: 求助CAN总线

大虾们:


  我在用DP256做CAN总线的收发实验!


    下面是我的CAN1的发送程序,为什么发不出去啊,在while(!(CAN1TFLG&0x01));处死循环....


     CAN1TBSEL=CAN1TFLG;  //Transmit Buffer Selection
     CAN1TXIDR0=0x01;
     CAN1TXIDR1=0x00;     //MSCAN 1 Transmit Identifier Register
     CAN1TXIDR2=0x04;
     CAN1TXIDR3=0x08;
     for(i=0;*(MsgOut+i)!='\0';i++)
     *((char *)&CAN1TXDSR0+i)=*(MsgOut+i);  //MSCAN 1 Transmit Data Segment Register
     CAN1TXDLR=i;              //
     CAN1TXTBPR=0x00;          //设置发送缓冲区优先级
     CAN1TFLG=CAN1TBSEL;       //清除发送缓冲标志
     while(!(CAN1TFLG&0x01));  //只用了一次发送任务,只要CAN1TFLG==1,就发送成功   
     printp("CAN1 SEND\n");


为什么啊,谢谢先!!!



 


作者: yjbmtc    时间: 2006-1-8 20:56


CAN1TFLG=CAN1TBSEL; //清除发送缓冲标志
while(!(CAN1TFLG&0x01)); //只用了一次发送任务,只要CAN1TFLG==1,就发送成功
是通过什么证明是死循环呢?
用断点看的吗?




作者: wang_r00    时间: 2006-1-9 14:51

byte temp;

CAN1TBSEL=CAN1TFLG; //Transmit Buffer Selection
temp=CAN1TBSEL;

如:
CAN1TBSEL=CAN1TFLG; //如CAN1TBSEL=CAN1TFLG=0x00000110;
temp=CAN1TBSEL; //赋值后,CAN1TBSEL=0x00000010;

作者: Evangeline    时间: 2006-1-10 21:02

楼上的wang_r00,我用你的方法,发送还是不成功啊!(或者是接收不成功,但是直接观察CPU的发送引脚电平也没有变化)
其时,我觉得用
CAN1TBSEL=CAN1TFLG; //如CAN1TBSEL=CAN1TFLG=0x00000110;
temp=CAN1TBSEL; //赋值后,CAN1TBSEL=0x00000010;
CAN1TFLG=temp;
与用
CAN1TBSEL=CAN1TFLG;//选择发送寄存器
CAN1TFLG=CAN1TBSEL;//清除空标志,开始发送
应该是一样的吧![em10]
作者: Evangeline    时间: 2006-1-10 21:16

CAN1TBSEL=CAN1TFLG; //Transmit Buffer Selection
temp=CAN1TBSEL;
CAN1TXIDR0=ID0[0];
CAN1TXIDR1=ID0[1]&0xE0;

CAN1TXDSR0=0x41;
CAN1TXDSR1=0x42;
CAN1TXDSR2=0x43;
CAN1TXDSR3=0x44;
CAN1TXDSR4=0x45;
CAN1TXDSR5=0x46;
CAN1TXDSR6=0x47;
CAN1TXDSR7=0x48;

CAN1TXDLR=8; //
CAN1TXTBPR=0x00; //设置发送缓冲区优先级
CAN1TFLG=temp; //清除发送缓冲标志
while(!(CAN1TFLG&0x01));
   发送程序的核心.....
大侠们指正啊!!1[em06]
作者: Evangeline    时间: 2006-1-10 21:19

void MSCAN_INITIAL(void)
{
  CAN0CTL0_INITRQ=1;
  CAN1CTL0_INITRQ=1;         //the MSCAN Initialization Mode
  while(!CAN0CTL1_INITAK);
  while(!CAN1CTL1_INITAK);   //确认MSCAN进入了Initialization Mode

  CAN0IDAC=0x10;               //4*16位接收滤波模式
  CAN1IDAC=0x10;
 
  CAN0IDAR0=ID0[0];
  CAN1IDAR0=ID1[0];
  CAN0IDAR1=ID0[1];
  CAN1IDAR1=ID1[1];
  CAN0IDAR2=ID0[2];
  CAN1IDAR2=ID1[2];
  CAN0IDAR3=ID0[3];        //MSCAN Identifier Acceptance Registers
  CAN1IDAR3=ID1[3];
  CAN0IDAR4=0x41;
  CAN1IDAR4=0x41;
  CAN0IDAR5=0x41;
  CAN1IDAR5=0x41;
  CAN0IDAR6=0x41;
  CAN1IDAR6=0x41;
  CAN0IDAR7=0x41;
  CAN1IDAR7=0x41;

  CAN0IDMR0=0xFF;
  CAN0IDMR1=0xFF;
  CAN0IDMR2=0xFF;
  CAN0IDMR3=0xFF;
  CAN0IDMR4=0xFF;
  CAN0IDMR5=0xFF;        //MSCAN Identifier Mask Registers
  CAN0IDMR6=0xFF;
  CAN0IDMR7=0xFF;

  CAN1IDMR0=0xFF;
  CAN1IDMR1=0xFF;
  CAN1IDMR2=0xFF;
  CAN1IDMR3=0xFF;
  CAN1IDMR4=0xFF;
  CAN1IDMR5=0xFF;
  CAN1IDMR6=0xFF;
  CAN1IDMR7=0xFF;

  CAN0BTR0=0x63;      //Synchronization jump width 2 Tq clock cycles
  CAN1BTR0=0x63;      //Baud Rate Prescaler Bin 100001=34 Prescaler value
 
  CAN0BTR1=0x13;      //SAMP=1time segment 2=2 Tq clock cycles
  CAN1BTR1=0x13;      //time segment 1=4 Tq clock cycles
 
  CAN0CTL1_CANE=1;    //CAN0 enable && Oscillator Clock.
  CAN1CTL1_CANE=1;    //CAN1 enable
 
 
  CAN0CTL0_INITRQ=0;  //INITRQ=0
  CAN1CTL0_INITRQ=0;
  while(CAN0CTL1_INITAK);
  while(CAN1CTL1_INITAK);    //确认MSCAN退出了Initialization Mode

  CAN0RIER=0x01;             //CAN0  Interrupt Enable
  CAN0CTL0_TIME = 1;
  CAN1CTL0_TIME = 1;
}

帮我看看是不是初始化的问题??

我现在只要实现能发能收就行....CAN1发送,CAN0接收!!

[此贴子已经被作者于2006-1-10 21:19:47编辑过]


作者: wang_r00    时间: 2006-1-13 06:35

CAN1TBSEL=CAN1TFLG; //Transmit Buffer Selection
temp = CAN1TBSEL;
CAN1TXIDR0=0x01;
CAN1TXIDR1=0x00; //MSCAN 1 Transmit Identifier Register
CAN1TXIDR2=0x04;
CAN1TXIDR3=0x08;
for(i=0;*(MsgOut+i)!='\0';i++)
*((char *)&CAN1TXDSR0+i)=*(MsgOut+i); //MSCAN 1 Transmit Data Segment Register
CAN1TXDLR=i; //***** CAN1TXDLR 最多8个字节 ****//
//// CAN1TXTBPR=0x00; //设置发送缓冲区优先级
CAN1TFLG=CAN1TBSEL; //清除发送缓冲标志
while(!(CAN1TFLG&temp)); //只用了一次发送任务,只要CAN1TFLG==1,就发送成功
printp("CAN1 SEND\n");

这样试试,初始化程序没问题。




作者: Evangeline    时间: 2006-1-13 12:11

    还是有以前的问题!!(直接示波器观察CPU引脚电平都没有变化...)
  是不是硬件的问题呢???
  上面为我的硬件硬图(是按照美信的demo图画的)。[em20]

[此贴子已经被作者于2006-1-13 12:11:07编辑过]


作者: lby    时间: 2006-1-23 16:43

楼主调出来了么?我遇到的问题和你的一样啊。
作者: lby    时间: 2006-1-25 21:24

调试CAN网通信和调试串口不同,必须有两块两个节点挂在网上才能发送成功,否则就需要使用自发自收模式。
作者: Evangeline    时间: 2006-2-16 19:22

经过了一个寒假,我还是没能调出来啊!求高手指点啊!
或者多提宝贵意见,大家共同学习啊!!
盼望中.........................




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0