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;
}