现在把我编写的一段程序贴出来。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.
}
} |