Board logo

标题: [求助]关于MOTO芯片的CAN通讯问题 [打印本页]

作者: strongchen    时间: 2005-3-3 14:46

现在把我编写的一段程序贴出来。CAN12共有三个发送缓冲区,我们通常这样做:先测试哪个为空,为空就用它发,所有的TBPR寄存器都设成一样的。这样就不会有问题,该程序经过测试,能正常使用。如果TBPR设得不一样,会发生一些奇怪的问题,比如会产生一些ERROR FRAME等,这些我们都测试过。



/************************CAN Transmission************************/



void CANTrans(void)
{
unsigned char BufferEmpty=0;

BufferEmpty=CTFLG;
if(BufferEmpty&1)
{
  TB0IDR0=0x61;
  TB0IDR1=0x60;  //ECU1_CC ID.



  TB0DLR=8;   //data length=8.

  TB0DSR0=ADResult[0];
  TB0DSR1=ADResult[1];
  TB0DSR2=ADResult[2];
  TB0DSR3=ADResult[3];
  TB0DSR4=ADResult[4];
  TB0DSR5=ADResult[5];
  TB0DSR6=0;
  TB0DSR7=0;   //confirm data segment.

  TB0TBPR=1;   //confirm data buffer priority.

  CTFLG=0x01;   //buffer0 starts transmission.
}
else if(BufferEmpty&2)
{
  TB1IDR0=0x61;
  TB1IDR1=0x60;  //ECU1_CC ID.



  TB1DLR=8;   //data length=8.

  TB1DSR0=ADResult[0];
  TB1DSR1=ADResult[1];
  TB1DSR2=ADResult[2];
  TB1DSR3=ADResult[3];
  TB1DSR4=ADResult[4];
  TB1DSR5=ADResult[5];
  TB1DSR6=0;
  TB1DSR7=0;   //confirm data segment.

  TB1TBPR=1;   //confirm data buffer priority.

  CTFLG=0x02;   //buffer0 starts transmission.
}
else if(BufferEmpty&4)
{
  TB2IDR0=0x61;
  TB2IDR1=0x60;  //ECU1_CC ID.



  TB2DLR=8;   //data length=8.

  TB2DSR0=ADResult[0];
  TB2DSR1=ADResult[1];
  TB2DSR2=ADResult[2];
  TB2DSR3=ADResult[3];
  TB2DSR4=ADResult[4];
  TB2DSR5=ADResult[5];
  TB2DSR6=0;
  TB2DSR7=0;   //confirm data segment.

  TB2TBPR=1;   //confirm data buffer priority.

  CTFLG=0x04;   //buffer0 starts transmission.
}
}
作者: jsbychm    时间: 2005-3-4 12:22

非常感谢strongchen的回复
那就是Datasheet说明中有问题了.
我这就用你的方法测试一下.有什么问题还请你多赐教!
作者: jackenxv    时间: 2005-3-16 17:10

embedded everywhere,intelligence everywhere!
作者: hlzhangxt    时间: 2005-3-16 17:24     标题: 不太明白

我不懂什么CAN, 但我可看懂你的程序。
CTFLG一定是某标志寄存器。
BufferEmpty=CTFLG;
if(BufferEmpty&1) 如果成立,说明 CTFLG = 0x01,       可为什么在条件成立的后,又要赋值 CTFLG = 0x01, 是否多次一举?



[em07][em07][em07][em07]
作者: jsbychm    时间: 2005-3-16 17:48     标题: [求助]关于MOTO芯片的CAN通讯问题

请教高手关于MOTO芯片的MSCAN通讯问题.
我用的是MC9S12DG128,它内部的CAN通信控制器有3个发送缓冲区,按它的Datasheet中说的只要设置发送缓冲区内部的优先级就可指定发送顺序,但我测试的结果却不是这样。

具体如下:
CAN0TXTBPR 设置为1,2,3,4,……,255
按说应该先发送优先级设为1的缓冲区,再发送优先级为2的缓冲区,依次是3,4……,
可我测试下来发送的顺序总是按它物理上那个最低的缓冲区先发送,只有最低的缓冲区为空时才发送物理上次低的缓冲区。优先级好像没什么用。


请高手指教,或是做过这个的给我发一段发送程序参考一下。谢谢!

[em27][em27]
作者: hlzhangxt    时间: 2005-3-16 17:48     标题: 搞错了

条件成立,只是说明 CTFLAG 末尾是 1[em10][em10][em10]




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