This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS 28335 eCAN transmit data loss



Hi,I'm using TMS28335 as a moto control,during the CAN communicate test,I found data lost during transmit.

1.I use four MailBox as transmit ,which is MailBox 0,MailBox 2,MailBox 3 and MailBox 4,the MailBox 0 has the highest priority and the MailBox  has the lowest priority.

2.I send the four MailBox  each 10 ms,I put the data into MailBox one by one,and set the TRS at last(only the four TRS is set)

3.I check the TA ,if TA is Set,I rest TA by write 1,if TA is 0 just check another one(I did't use while to check TA,as it block other program)

4.during my test ,I receive 769 messages from MailBox 0(highest priority),and 744 messages from MailBox 2 , MailBox 3 and MailBox4 .

MailBox 2 ,MailBox3 and MailBox 4 each successful transmit 744 messages while MailBox 0 successful transmit 769 messages.I don‘t  know why the num of message do not same,I have chang the USB-CAN test and PC software to test and the result is same.

5.below is my code:

void CAN_TRANS(void)
{
    if (Count_10Ms_Flag_0 == 1)
	{
	    CAN_VAR();
	    CAN_TRANS_DATA();
	}
}
void CAN_TRANS_DATA(void)
{
    EALLOW;

	/******************************** 351************************************/
	/*ECanbMboxes.MBOX4.MDL.byte.BYTE0 = (Mc_Torque_Pwm & 0x0000FF00) >> 8;
	ECanbMboxes.MBOX4.MDL.byte.BYTE1 = (Mc_Torque_Pwm & 0x000000FF);
	ECanbMboxes.MBOX4.MDL.byte.BYTE2 = (Iphase & 0x0000FF00) >> 8;
	ECanbMboxes.MBOX4.MDL.byte.BYTE3 = (Iphase & 0x000000FF);*/
	ECanbMboxes.MBOX4.MDL.byte.BYTE0 = (Fault_Flag_0 & 0xFF000000) >> 24;
	ECanbMboxes.MBOX4.MDL.byte.BYTE1 = (Fault_Flag_0 & 0x00FF0000) >> 16;
	ECanbMboxes.MBOX4.MDL.byte.BYTE2 = (Fault_Flag_0 & 0x0000FF00) >> 8;
	ECanbMboxes.MBOX4.MDL.byte.BYTE3 = (Fault_Flag_0 & 0x000000FF);
	ECanbMboxes.MBOX4.MDH.byte.BYTE4 = (Fault_Flag_1 & 0xFF000000) >> 24;
	ECanbMboxes.MBOX4.MDH.byte.BYTE5 = (Fault_Flag_1 & 0x00FF0000) >> 16;
	ECanbMboxes.MBOX4.MDH.byte.BYTE6 = (Fault_Flag_1 & 0x0000FF00) >> 8;
	ECanbMboxes.MBOX4.MDH.byte.BYTE7 = (Fault_Flag_1 & 0x000000FF);
	/*ECanbMboxes.MBOX4.MDL.byte.BYTE0 = (interruptcount & 0xFF000000) >> 24;
	ECanbMboxes.MBOX4.MDL.byte.BYTE1 = (interruptcount & 0x00FF0000) >> 16;
	ECanbMboxes.MBOX4.MDL.byte.BYTE2 = (interruptcount & 0x0000FF00) >> 8;
	ECanbMboxes.MBOX4.MDL.byte.BYTE3 = (interruptcount & 0x000000FF);
	ECanbMboxes.MBOX4.MDH.byte.BYTE4 = (whilecount & 0xFF000000) >> 24;
	ECanbMboxes.MBOX4.MDH.byte.BYTE5 = (whilecount & 0x00FF0000) >> 16;
	ECanbMboxes.MBOX4.MDH.byte.BYTE6 = (whilecount & 0x0000FF00) >> 8;
	ECanbMboxes.MBOX4.MDH.byte.BYTE7 = (whilecount & 0x000000FF);*/

	//ECanbRegs.CANTRS.bit.TRS4 = 1;

	/******************************** 216************************************/
	Can3[0] = ((Can_Csm216_Cnt & 0x0F) << 4) + ((Can_Tm_Temp & 0x00F0) >> 4);
	Can3[1] = ((Can_Tm_Temp & 0x000F) << 4)+ ((Can_Tmi_Igbt_Temp & 0x00F0) >> 4);
	Can3[2] = ((Can_Tmi_Igbt_Temp & 0x000F) << 4) + ((Can_Mc_Mode & 0x07) << 1) + ((Can_Pcu_Sys_Sts_1 & 0x0010) >> 4);
	Can3[3] = ((Can_Pcu_Sys_Sts_1 & 0x000F) << 4) + ((Can_Tm_Continue_Neg_Trq & 0x3C0) >> 6);
	Can3[4] = ((Can_Tm_Continue_Neg_Trq & 0x003F) << 2) + ((Can_Tm_Continue_Pos_Trq & 0x0300) >> 8);
	Can3[5] = (Can_Tm_Continue_Pos_Trq & 0x00FF);
	Can3[6] = Can_Tmi_Dtc & 0x00FF;
	 
	Can_Csm216_Cnt = Can_Csm216_Cnt + 1;
	if (Can_Csm216_Cnt > 15)
	{
	    Can_Csm216_Cnt = 0;
	}

	Can_Tmi_Csm216 = crc8Compute(Can3,7);

	ECanbMboxes.MBOX3.MDL.byte.BYTE0 = Can_Tmi_Csm216;
	ECanbMboxes.MBOX3.MDL.byte.BYTE1 = Can3[0] & 0xFF;
	ECanbMboxes.MBOX3.MDL.byte.BYTE2 = Can3[1] & 0xFF;
	ECanbMboxes.MBOX3.MDL.byte.BYTE3 = Can3[2] & 0xFF;
	ECanbMboxes.MBOX3.MDH.byte.BYTE4 = Can3[3] & 0xFF;
	ECanbMboxes.MBOX3.MDH.byte.BYTE5 = Can3[4] & 0xFF;
	ECanbMboxes.MBOX3.MDH.byte.BYTE6 = Can3[5] & 0xFF;
	ECanbMboxes.MBOX3.MDH.byte.BYTE7 = Can3[6] & 0xFF;
			
	//ECanbRegs.CANTRS.bit.TRS3 = 1;

	/******************************** 215************************************/
	Can2[0] = ((Can_Csm215_Cnt & 0x0F) << 4) + ((Can_Tm_Peak_10s_Neg_Trq & 0x03C0) >> 6);
	Can2[1]= ((Can_Tm_Peak_10s_Neg_Trq & 0x003F) << 2) + ((Can_Tm_Peak_10s_Pos_Trq & 0x0300) >> 8);
	Can2[2] = Can_Tm_Peak_10s_Pos_Trq & 0x00FF;
	Can2[3] = (Can_Tm_Peak_2s_Neg_Trq & 0x03FC) >> 2;
	Can2[4] = ((Can_Tm_Peak_2s_Neg_Trq & 0x0003) << 6) + ((Can_Tm_Peak_2s_Pos_Trq & 0x03F0) >> 4);
	Can2[5] = ((Can_Tm_Peak_2s_Pos_Trq & 0x000F) << 4) + ((Can_Tm_ASC_Failure & 0x01) << 3) + (Can_Tm_Active_Discharge_State & 0x07);
	Can2[6] = 0;

	Can_Csm215_Cnt = Can_Csm215_Cnt + 1;
	if (Can_Csm215_Cnt > 15)
	{
	    Can_Csm215_Cnt = 0;
	}

	Can_Tmi_Csm215 = crc8Compute(Can2,7);

	ECanbMboxes.MBOX2.MDL.byte.BYTE0 = Can_Tmi_Csm215;
	ECanbMboxes.MBOX2.MDL.byte.BYTE1 = Can2[0];
	ECanbMboxes.MBOX2.MDL.byte.BYTE2 = Can2[1];
	ECanbMboxes.MBOX2.MDL.byte.BYTE3 = Can2[2];
	ECanbMboxes.MBOX2.MDH.byte.BYTE4 = Can2[3];
	ECanbMboxes.MBOX2.MDH.byte.BYTE5 = Can2[4];
	ECanbMboxes.MBOX2.MDH.byte.BYTE6 = Can2[5];
	ECanbMboxes.MBOX2.MDH.byte.BYTE7 = Can2[6];
	//ECanbMboxes.MBOX2.MDH.byte.BYTE4 = ((Can_Tm_Active_Discharge_State & 0x07) << 4) + ((Can_Tm_Peak_2s_Neg_Trq & 0x0300) >> 8);

	//ECanbRegs.CANTRS.bit.TRS2 = 1;

   /******************************** 212************************************/
	Can0[0] = ((Can_Csm212_Cnt & 0x0F) << 4) + ((Can_Tm_Bus_C & 0x0F00) >> 8);
    Can0[1] = Can_Tm_Bus_C & 0x00FF;
    Can0[2] = (Can_Tm_Speed & 0x7C00) >> 10;
    Can0[3] = (Can_Tm_Speed & 0x03FC) >> 2;
    Can0[4] = ((Can_Tm_Speed & 0x0003) << 6) + ((Can_Tm_Bus_V & 0x0FC0) >> 6);
    Can0[5] = ((Can_Tm_Bus_V & 0x003F) << 2) + ((Can_Tm_Torque & 0x0300) >> 8);
    Can0[6] = Can_Tm_Torque & 0x00FF;

	Can_Csm212_Cnt = Can_Csm212_Cnt + 1;
	if (Can_Csm212_Cnt > 15)
	{
		Can_Csm212_Cnt = 0;
	}
	Can_Tmi_Csm212 = crc8Compute(Can0,7);

    ECanbMboxes.MBOX0.MDL.byte.BYTE0 = Can_Tmi_Csm212;
	ECanbMboxes.MBOX0.MDL.byte.BYTE1 = Can0[0];
	ECanbMboxes.MBOX0.MDL.byte.BYTE2 = Can0[1];
	ECanbMboxes.MBOX0.MDL.byte.BYTE3 = Can0[2];
	ECanbMboxes.MBOX0.MDH.byte.BYTE4 = Can0[3];
	ECanbMboxes.MBOX0.MDH.byte.BYTE5 = Can0[4];
	ECanbMboxes.MBOX0.MDH.byte.BYTE6 = Can0[5];//((Can_Pcu_Err_Sts & 0x0F) << 4) + ((Can_Tm_Bus_V & 0x0F00) >> 8);
	ECanbMboxes.MBOX0.MDH.byte.BYTE7 = Can0[6];

    //ECanbRegs.CANTRS.bit.TRS0 = 1;
	ECanbRegs.CANTRS.all = 0x0000001d;
	EDIS;	 
} 

  • if I modify my trans fun as below ,I can receive the same num of message from the four MailBox.

    I put the data into MailBox and then set the TRS.I check the TA in a short time,if the TA is set or time out I write 1 to TA.


    void CAN_TRANS_DATA(void) { Uint16 Count; Uint16 count0 = 0; Uint16 count2 = 0; Uint16 count3 = 0; struct ECAN_REGS ECanbShadow; EALLOW; /********************************212************************************/ Can0_Byte1 = ((Can_Csm212_Cnt & 0x0F) << 4) + ((Can_Tm_Bus_C & 0x0F00) >> 8); Can0_Byte2 = Can_Tm_Bus_C & 0x00FF; Can0_Byte3 = (Can_Tm_Speed & 0x7C00) >> 10; Can0_Byte4 = (Can_Tm_Speed & 0x03FC) >> 2; Can0_Byte5 = ((Can_Tm_Speed & 0x0003) << 6) + ((Can_Tm_Bus_V & 0x0FC0) >> 6); Can0_Byte6 = ((Can_Tm_Bus_V & 0x003F) << 2) + ((Can_Tm_Torque & 0x0300) >> 8); Can0_Byte7 = Can_Tm_Torque & 0x00FF; Can_Csm212_Cnt = Can_Csm212_Cnt + 1; Value0_1 = (Can0_Byte7 << 8) + Can0_Byte6; Value0_2 = (Can0_Byte5 << 8) + Can0_Byte4; Value0_3 = (Can0_Byte3 << 8) + Can0_Byte2; Value0_4 = (Can0_Byte1 << 8) + 0x00; //CRC0_VALUE = 0x011D; CRC0_VALUE = 0x8E80; Can_Tmi_Csm212 = 0; while(1) { if((Value0_1 & 0x8000) == 0x8000) { Value0_1 = Value0_1 ^ CRC0_VALUE; } else { Value0_1 = Value0_1 << 1; if((Value0_2 & 0x8000) == 0x8000) { Value0_1 = Value0_1 | 1; } Value0_2 = Value0_2 << 1; if((Value0_3 & 0x8000) == 0x8000) { Value0_2 = Value0_2 | 1; } Value0_3 = Value0_3 << 1; if((Value0_4 & 0x8000) == 0x8000) { Value0_3 = Value0_3 | 1; } Value0_4 = Value0_4 << 1; count0 ++; } if(count0 == 56) { Can_Tmi_Csm212 = ((Value0_1 & 0xFF00) >> 8); break; } } ECanbMboxes.MBOX0.MDL.byte.BYTE0 = Can_Tmi_Csm212 & 0xFF; ECanbMboxes.MBOX0.MDL.byte.BYTE1 = Can0_Byte1 & 0xFF; ECanbMboxes.MBOX0.MDL.byte.BYTE2 = Can0_Byte2 & 0xFF; ECanbMboxes.MBOX0.MDL.byte.BYTE3 = Can0_Byte3 & 0xFF; ECanbMboxes.MBOX0.MDH.byte.BYTE4 = Can0_Byte4 & 0xFF; ECanbMboxes.MBOX0.MDH.byte.BYTE5 = Can0_Byte5 & 0xFF; ECanbMboxes.MBOX0.MDH.byte.BYTE6 = Can0_Byte6 & 0xFF;//((Can_Pcu_Err_Sts & 0x0F) << 4) + ((Can_Tm_Bus_V & 0x0F00) >> 8); ECanbMboxes.MBOX0.MDH.byte.BYTE7 = Can0_Byte7 & 0xFF; ECanbRegs.CANTRS.all = 0x1; ECanbShadow.CANTA.all = ECanbRegs.CANTA.all; Count = 0; while((ECanbRegs.CANTA.all & 0x1) != 0x1) // check if message is sent { Count++; if(Count >= 1000) { Count = 0; break; } } if (Can_Csm212_Cnt > 15) { Can_Csm212_Cnt = 0; } ECanbRegs.CANTA.all = 0x1; // ECanbRegs.CANTA.all=ECanbShadow.CANTA.all; /******************************** 215************************************/ Can2_Byte1 = ((Can_Csm215_Cnt & 0x0F) << 4) + ((Can_Tm_Peak_10s_Neg_Trq & 0x03C0) >> 6); Can2_Byte2 = ((Can_Tm_Peak_10s_Neg_Trq & 0x003F) << 2) + ((Can_Tm_Peak_10s_Pos_Trq & 0x0300) >> 8); Can2_Byte3 = Can_Tm_Peak_10s_Pos_Trq & 0x00FF; Can2_Byte4 = (Can_Tm_Peak_2s_Neg_Trq & 0x03FC) >> 2; Can2_Byte5 = ((Can_Tm_Peak_2s_Neg_Trq & 0x0003) << 6) + ((Can_Tm_Peak_2s_Pos_Trq & 0x03F0) >> 4); Can2_Byte6 = ((Can_Tm_Peak_2s_Pos_Trq & 0x000F) << 4) + ((Can_Tm_ASC_Failure & 0x01) << 3) + (Can_Tm_Active_Discharge_State & 0x07); //Can2_Byte7 = Can_Tmi_Dtc & 0x00FF; Can_Csm215_Cnt = Can_Csm215_Cnt + 1; Value2_1 = (Can2_Byte7 << 8) + Can2_Byte6; Value2_2 = (Can2_Byte5 << 8) + Can2_Byte4; Value2_3 = (Can2_Byte3 << 8) + Can2_Byte2; Value2_4 = (Can2_Byte1 << 8) + 0x00; //CRC2_VALUE = 0x011D; CRC2_VALUE = 0x8E80; Can_Tmi_Csm215 = 0; while(1) { if((Value2_1 & 0x8000) == 0x8000) { Value2_1 = Value2_1 ^ CRC2_VALUE; } else { Value2_1 = Value2_1 << 1; if((Value2_2 & 0x8000) == 0x8000) { Value2_1 = Value2_1 | 1; } Value2_2 = Value2_2 << 1; if((Value2_3 & 0x8000) == 0x8000) { Value2_2 = Value2_2 | 1; } Value2_3 = Value2_3 << 1; if((Value2_4 & 0x8000) == 0x8000) { Value2_3 = Value2_3 | 1; } Value2_4 = Value2_4 << 1; count2 ++; } if(count2 == 56) { Can_Tmi_Csm215 = ((Value2_1 & 0xFF00) >> 8); break; } } ECanbMboxes.MBOX2.MDL.byte.BYTE0 = Can_Tmi_Csm215 & 0xFF; ECanbMboxes.MBOX2.MDL.byte.BYTE1 = Can2_Byte1 & 0xFF; ECanbMboxes.MBOX2.MDL.byte.BYTE2 = Can2_Byte2 & 0xFF; ECanbMboxes.MBOX2.MDL.byte.BYTE3 = Can2_Byte3 & 0xFF; ECanbMboxes.MBOX2.MDH.byte.BYTE4 = Can2_Byte4 & 0xFF; ECanbMboxes.MBOX2.MDH.byte.BYTE5 = Can2_Byte5 & 0xFF; ECanbMboxes.MBOX2.MDH.byte.BYTE6 = Can2_Byte6 & 0xFF; ECanbMboxes.MBOX2.MDH.byte.BYTE7 = Can2_Byte7 & 0xFF; //ECanbMboxes.MBOX2.MDH.byte.BYTE4 = ((Can_Tm_Active_Discharge_State & 0x07) << 4) + ((Can_Tm_Peak_2s_Neg_Trq & 0x0300) >> 8); ECanbRegs.CANTRS.all = 0x4; ECanbShadow.CANTA.all = ECanbRegs.CANTA.all; Count = 0; while((ECanbRegs.CANTA.all & 0x4) != 0x4) //check if message is sent { Count++; if(Count >= 1000) { Count = 0; break; } } if (Can_Csm215_Cnt > 15) { Can_Csm215_Cnt = 0; } ECanbRegs.CANTA.all = 0x4; //写1清除发送应答位 ECanbRegs.CANTA.all=ECanbShadow.CANTA.all; /********************************发送3邮箱内容 216************************************/ Can3_Byte1 = ((Can_Csm216_Cnt & 0x0F) << 4) + ((Can_Tm_Temp & 0x00F0) >> 4); Can3_Byte2 = ((Can_Tm_Temp & 0x000F) << 4)+ ((Can_Tmi_Igbt_Temp & 0x00F0) >> 4); Can3_Byte3 = ((Can_Tmi_Igbt_Temp & 0x000F) << 4) + ((Can_Mc_Mode & 0x07) << 1) + ((Can_Pcu_Sys_Sts_1 & 0x0010) >> 4); Can3_Byte4 = ((Can_Pcu_Sys_Sts_1 & 0x000F) << 4) + ((Can_Tm_Continue_Neg_Trq & 0x3C0) >> 6); Can3_Byte5 = ((Can_Tm_Continue_Neg_Trq & 0x003F) << 2) + ((Can_Tm_Continue_Pos_Trq & 0x0300) >> 8); Can3_Byte6 = (Can_Tm_Continue_Pos_Trq & 0x00FF); Can3_Byte7 = Can_Tmi_Dtc & 0x00FF; Can_Csm216_Cnt = Can_Csm216_Cnt + 1; Value3_1 = (Can3_Byte7 << 8) + Can3_Byte6; Value3_2 = (Can3_Byte5 << 8) + Can3_Byte4; Value3_3 = (Can3_Byte3 << 8) + Can3_Byte2; Value3_4 = (Can3_Byte1 << 8) + 0x00; //CRC3_VALUE = 0x011D; CRC3_VALUE = 0x8E80; Can_Tmi_Csm216 = 0; while(1) { if((Value3_1 & 0x8000) == 0x8000) { Value3_1 = Value3_1 ^ CRC3_VALUE; } else { Value3_1 = Value3_1 << 1; if((Value3_2 & 0x8000) == 0x8000) { Value3_1 = Value3_1 | 1; } Value3_2 = Value3_2 << 1; if((Value3_3 & 0x8000) == 0x8000) { Value3_2 = Value3_2 | 1; } Value3_3 = Value3_3 << 1; if((Value3_4 & 0x8000) == 0x8000) { Value3_3 = Value3_3 | 1; } Value3_4 = Value3_4 << 1; count3 ++; } if(count3 == 56) { Can_Tmi_Csm216 = ((Value3_1 & 0xFF00) >> 8); break; } } ECanbMboxes.MBOX3.MDL.byte.BYTE0 = Can_Tmi_Csm216 & 0xFF; ECanbMboxes.MBOX3.MDL.byte.BYTE1 = Can3_Byte1 & 0xFF; ECanbMboxes.MBOX3.MDL.byte.BYTE2 = Can3_Byte2 & 0xFF; ECanbMboxes.MBOX3.MDL.byte.BYTE3 = Can3_Byte3 & 0xFF; ECanbMboxes.MBOX3.MDH.byte.BYTE4 = Can3_Byte4 & 0xFF; ECanbMboxes.MBOX3.MDH.byte.BYTE5 = Can3_Byte5 & 0xFF; ECanbMboxes.MBOX3.MDH.byte.BYTE6 = Can3_Byte6 & 0xFF; ECanbMboxes.MBOX3.MDH.byte.BYTE7 = Can3_Byte7 & 0xFF; ECanbRegs.CANTRS.all = 0x8; ECanbShadow.CANTA.all = ECanbRegs.CANTA.all; Count = 0; while((ECanbRegs.CANTA.all & 0x8) != 0x8) //check if message is sent { Count++; if(Count >= 1000) { Count = 0; break; } } if (Can_Csm216_Cnt > 15) { Can_Csm216_Cnt = 0; } ECanbRegs.CANTA.all = 0x8; // ECanbRegs.CANTA.all=ECanbShadow.CANTA.all; /******************************** 311************************************/ /*ECanbMboxes.MBOX4.MDL.byte.BYTE0 = (Mc_Torque_Pwm & 0x0000FF00) >> 8; ECanbMboxes.MBOX4.MDL.byte.BYTE1 = (Mc_Torque_Pwm & 0x000000FF); ECanbMboxes.MBOX4.MDL.byte.BYTE2 = (Iphase & 0x0000FF00) >> 8; ECanbMboxes.MBOX4.MDL.byte.BYTE3 = (Iphase & 0x000000FF);*/ ECanbMboxes.MBOX4.MDL.byte.BYTE0 = (Fault_Flag_0 & 0xFF000000) >> 24; ECanbMboxes.MBOX4.MDL.byte.BYTE1 = (Fault_Flag_0 & 0x00FF0000) >> 16; ECanbMboxes.MBOX4.MDL.byte.BYTE2 = (Fault_Flag_0 & 0x0000FF00) >> 8; ECanbMboxes.MBOX4.MDL.byte.BYTE3 = (Fault_Flag_0 & 0x000000FF); ECanbMboxes.MBOX4.MDH.byte.BYTE4 = (Fault_Flag_1 & 0xFF000000) >> 24; ECanbMboxes.MBOX4.MDH.byte.BYTE5 = (Fault_Flag_1 & 0x00FF0000) >> 16; ECanbMboxes.MBOX4.MDH.byte.BYTE6 = (Fault_Flag_1 & 0x0000FF00) >> 8; ECanbMboxes.MBOX4.MDH.byte.BYTE7 = (Fault_Flag_1 & 0x000000FF); ECanbRegs.CANTRS.all = 0x10; ECanbShadow.CANTA.all = ECanbRegs.CANTA.all; Count = 0; while((ECanbRegs.CANTA.all & 0x10) != 0x10) //check if message is sent { Count++; if(Count >= 1000) { Count = 0; break; } } ECanbRegs.CANTA.all = 0x10; // ECanbRegs.CANTA.all=ECanbShadow.CANTA.all; EDIS; }

  • Tang,

                Perhaps you could modify your code to just transmit  incrementing numbers with the mailbox number appended. This may clue you in on which messages are "missing". This is clearly a software issue. Since the transmit priority of the mailboxes are fixed, you should be able to deterministically check the TA bits in order. If you have some CAN bus analyzer, you could examine the traffic and ensure the transmission sequence is as expected...