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.

Acknowledgement problem TMS320f28035

Other Parts Discussed in Thread: TMS320F28035

Hello ,

I m working on the CAN bus of the TMS320f28035.

I started with the basic stuff and just tried to send a message from mailbox 4 to mailbox4 and see if it is received . I followed the instructions from the data sheet step by step and i m able to watch the evolution of the system step by step from the watch window .everything is good till the acknowledgment step , TA.4 is not turning to one and the system is stuck in the loop.

I visualized the frames on the oscilloscope and i m getting data frames sent continuously from the TX pin and received on the RX pin of the other card just like the picture

so why the acknowledgment is not set ? even the RMP is not set ( that indicates that the message was received )

In addition,i tried analyzing the frame but i m not understanding how it is divided (where it begins and where are the data ...) .  I tried sending just zeroes and i m supposing i must visualize a long zero line but i didnt... it s always ups and downs.

here is my code (can.c)

#include "DSP2803x_ECan.h"
//#include "DSP2803x_Device.h" 


/*-----------------------------------------------------------+
|                         VARIABLES                          |
+-----------------------------------------------------------*/
 struct ECAN_REGS ECanaShadow;
 struct ECAN_REGS ECanbShadow;
 int test=0;


/*-----------------------------------------------------------+
|                         FUNCTIONS                          |
+-----------------------------------------------------------*/


// Fonction permettant de configurer une des 32 Mailbox disponible
// Param�tres :  Mbx-> num�ro de la mailbox (1 � 32)
//		 ID -> Addresse de la mailbox � mettre en hexa (exemple 0x301)
//		 Dir -> Direction de la mailbox ( 1:receive, 0: transmit)	
//		 Data_lenght -> Nombre de byte de donn�e � envoyer/recevoir( entre 0 et 8)
//		 Remote -> � utiliser lors d'une trame de requete (1: remote request, 0: normale)
//		 Auto_Ans -> � utiliser lorsqu'une mailbox doit r�pondre � une trame de requete 

void InitECan(void)
{
	EALLOW;
	
 	SysCtrlRegs.PCLKCR0.bit.ECANAENCLK=1;   

  	ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
	ECanaShadow.CANMC.bit.SCB = 1;// selectionner le mode eCAN
	ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
	
	/* Configure eCAN RX and TX pins for CAN operation using eCAN regs*/

    ECanaShadow.CANTIOC.all = ECanaRegs.CANTIOC.all;
    ECanaShadow.CANTIOC.bit.TXFUNC = 1;
    ECanaRegs.CANTIOC.all = ECanaShadow.CANTIOC.all;

    ECanaShadow.CANRIOC.all = ECanaRegs.CANRIOC.all;
    ECanaShadow.CANRIOC.bit.RXFUNC = 1;
    ECanaRegs.CANRIOC.all = ECanaShadow.CANRIOC.all;
	
    ECanaRegs.CANTA.all = 0xFFFFFFFF; //effacer ts TAn bits( acknowledgment) 
    ECanaRegs.CANRMP.all = 0xFFFFFFFF; // effacer ts RMPn bits ( les mailbox en contiennent  pas de msg )
    ECanaRegs.CANGIF0.all = 0xFFFFFFFF; // effacer les bits d'interruptions 
    ECanaRegs.CANGIF1.all = 0xFFFFFFFF;
 	ECanaShadow.CANTA.all = 0;
    ECanaShadow.CANAA.bit.AA4 = 0;     	         
    ECanaRegs.CANTA.all = ECanaShadow.CANTA.all;

	
	
	// Initialiser tous les bits de MSGTRL a zero
	
	ECanaMboxes.MBOX0.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX1.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX2.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX3.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX4.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX5.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX6.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX7.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX8.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX9.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX10.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX11.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX12.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX13.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX14.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX15.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX16.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX17.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX18.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX19.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX20.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX21.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX22.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX23.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX24.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX25.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX26.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX27.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX28.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX29.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX30.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX31.MSGCTRL.all = 0x00000000;
    
 	ECanaMboxes.MBOX0.MDL.all = 0x00000000;
 	ECanaMboxes.MBOX0.MDH.all = 0x00000000;

	// bit-time configuration
	
	ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
	ECanaShadow.CANMC.bit.CCR = 1 ;            // enter configuration mode 
	ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;

	 //and wait til CCE=1
	 
	  do
    {
     ECanaShadow.CANES.all = ECanaRegs.CANES.all;
    } while(ECanaShadow.CANES.bit.CCE != 1 );   // Wait for CCE bit to be set
    
	/*The following block is only for  60 MHz SYSCLKOUT (30 MHz CAN clock). Bit rate = 1 Mbps
	   See Note at end of file */
	    ECanbShadow.CANBTC.bit.BRPREG = 5;
		ECanbShadow.CANBTC.bit.TSEG2REG = 1;
		ECanbShadow.CANBTC.bit.TSEG1REG = 6;
		ECanbShadow.CANBTC.bit.SJWREG=1;

    ECanbShadow.CANBTC.bit.SAM = 1;
    ECanaRegs.CANBTC.all = ECanaShadow.CANBTC.all;

    ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
        ECanaShadow.CANMC.bit.CCR = 0 ;            // Set CCR = 0
    ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;

    // Wait until the CPU no longer has permission to change the configuration registers

    do
    {
      ECanaShadow.CANES.all = ECanaRegs.CANES.all;
    } while(ECanaShadow.CANES.bit.CCE != 0 ); // Wait for CCE bit to be cleared
    
     ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
     ECanaShadow.CANMC.bit.STM = 0 ;      // self test mode off (loopback not autorized)
     ECanaShadow.CANMC.bit.PDR=0;         // local power down not requested
     ECanaShadow.CANMC.bit.DBO=0;       // most significant byte first
     ECanaShadow.CANMC.bit.WUBA=0;      //module leaves powerdown after writing a yero to PDR
     ECanaShadow.CANMC.bit.CDR=0;       // normal operation mode
     ECanaShadow.CANMC.bit.ABO=0;
     ECanaShadow.CANMC.bit.SRES=0; //no effect
     ECanaShadow.CANMC.bit.MBNR=0;  //used with conjunction with the CDR
         
   	 ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;



/* Disable all Mailboxes  */

  ECanaRegs.CANME.all = 0; // Required before writing the MSGIDs
  test++;
  EDIS;
	
	
}


// fonction pr configurer un des Mailbox
void config_CAN_Mailbox(unsigned char Mbx, int ID, unsigned char Dir, unsigned char Data_lenght, unsigned char Remote, unsigned char Auto_Ans)
{

switch(Mbx){
	case 0:
	{
	ECanaShadow.CANMD.all = ECanaRegs.CANMD.all; // Lecture-�criture uniquement en 32bit
	ECanaShadow.CANMD.bit.MD0 = Dir;
	ECanaRegs.CANMD.all = ECanaShadow.CANMD.all; // Lecture-�criture uniquement en 32bit

	ECanaMboxes.MBOX0.MSGCTRL.bit.DLC = Data_lenght; 
	ECanaMboxes.MBOX0.MSGCTRL.bit.RTR=Remote;

	ECanaMboxes.MBOX0.MSGID.bit.AAM=Auto_Ans; 
	ECanaMboxes.MBOX0.MSGID.bit.IDE=0;
	ECanaMboxes.MBOX0.MSGID.bit.AME=0;
	ECanaMboxes.MBOX0.MSGID.bit.STDMSGID=ID;
	}break;
	case 1:
	{
	ECanaShadow.CANMD.all = ECanaRegs.CANMD.all; // Lecture-�criture uniquement en 32bit
	ECanaShadow.CANMD.bit.MD1 = Dir;
	ECanaRegs.CANMD.all = ECanaShadow.CANMD.all; // Lecture-�criture uniquement en 32bit

	ECanaMboxes.MBOX1.MSGCTRL.bit.DLC = Data_lenght;
	ECanaMboxes.MBOX1.MSGCTRL.bit.RTR=Remote;

	ECanaMboxes.MBOX1.MSGID.bit.AAM=Auto_Ans; 
	ECanaMboxes.MBOX1.MSGID.bit.IDE=0;
	ECanaMboxes.MBOX1.MSGID.bit.AME=0;
	ECanaMboxes.MBOX1.MSGID.bit.STDMSGID=ID;
	}break;
	case 2:
	{
	ECanaShadow.CANMD.all = ECanaRegs.CANMD.all; // Lecture-�criture uniquement en 32bit
	ECanaShadow.CANMD.bit.MD2 = Dir;
	ECanaRegs.CANMD.all = ECanaShadow.CANMD.all; // Lecture-�criture uniquement en 32bit

	ECanaMboxes.MBOX2.MSGCTRL.bit.DLC = Data_lenght;
	ECanaMboxes.MBOX2.MSGCTRL.bit.RTR=Remote;

	ECanaMboxes.MBOX2.MSGID.bit.AAM=Auto_Ans; 
	ECanaMboxes.MBOX2.MSGID.bit.IDE=0;
	ECanaMboxes.MBOX2.MSGID.bit.AME=0;
	ECanaMboxes.MBOX2.MSGID.bit.STDMSGID=ID;
	}break;
	case 3:
	{
	ECanaShadow.CANMD.all = ECanaRegs.CANMD.all; // Lecture-�criture uniquement en 32bit
	ECanaShadow.CANMD.bit.MD3 = Dir;
	ECanaRegs.CANMD.all = ECanaShadow.CANMD.all; // Lecture-�criture uniquement en 32bit

	ECanaMboxes.MBOX3.MSGCTRL.bit.DLC = Data_lenght;
	ECanaMboxes.MBOX3.MSGCTRL.bit.RTR=Remote;

	ECanaMboxes.MBOX3.MSGID.bit.AAM=Auto_Ans; 
	ECanaMboxes.MBOX3.MSGID.bit.IDE=0;
	ECanaMboxes.MBOX3.MSGID.bit.AME=0;
	ECanaMboxes.MBOX3.MSGID.bit.STDMSGID=ID;
	}break;
	case 4:
	{
	ECanaShadow.CANMD.all = ECanaRegs.CANMD.all; // Lecture-�criture uniquement en 32bit
	ECanaShadow.CANMD.bit.MD4 = Dir;
	ECanaRegs.CANMD.all = ECanaShadow.CANMD.all; // Lecture-�criture uniquement en 32bit

	ECanaMboxes.MBOX4.MSGCTRL.bit.DLC = Data_lenght;
	ECanaMboxes.MBOX4.MSGCTRL.bit.RTR=Remote;

	ECanaMboxes.MBOX4.MSGID.bit.AAM=Auto_Ans; 
	ECanaMboxes.MBOX4.MSGID.bit.IDE=0;
	ECanaMboxes.MBOX4.MSGID.bit.AME=0;
	ECanaMboxes.MBOX4.MSGID.bit.STDMSGID=ID;
	}break;
	case 5:
	{
	ECanaShadow.CANMD.all = ECanaRegs.CANMD.all; // Lecture-�criture uniquement en 32bit
	ECanaShadow.CANMD.bit.MD5 = Dir;
	ECanaRegs.CANMD.all = ECanaShadow.CANMD.all; // Lecture-�criture uniquement en 32bit

	ECanaMboxes.MBOX5.MSGCTRL.bit.DLC = Data_lenght;
	ECanaMboxes.MBOX5.MSGCTRL.bit.RTR=Remote;

	ECanaMboxes.MBOX5.MSGID.bit.AAM=Auto_Ans; 
	ECanaMboxes.MBOX5.MSGID.bit.IDE=0;
	ECanaMboxes.MBOX5.MSGID.bit.AME=0;
	ECanaMboxes.MBOX5.MSGID.bit.STDMSGID=ID;
	}break;
	case 6:
	{
	ECanaShadow.CANMD.all = ECanaRegs.CANMD.all; // Lecture-�criture uniquement en 32bit
	ECanaShadow.CANMD.bit.MD6 = Dir;
	ECanaRegs.CANMD.all = ECanaShadow.CANMD.all; // Lecture-�criture uniquement en 32bit

	ECanaMboxes.MBOX6.MSGCTRL.bit.DLC = Data_lenght;
	ECanaMboxes.MBOX6.MSGCTRL.bit.RTR=Remote;

	ECanaMboxes.MBOX6.MSGID.bit.AAM=Auto_Ans; 
	ECanaMboxes.MBOX6.MSGID.bit.IDE=0;
	ECanaMboxes.MBOX6.MSGID.bit.AME=0;
	ECanaMboxes.MBOX6.MSGID.bit.STDMSGID=ID;
	}break;
	case 7:
	{
	ECanaShadow.CANMD.all = ECanaRegs.CANMD.all; // Lecture-�criture uniquement en 32bit
	ECanaShadow.CANMD.bit.MD7 = Dir;
	ECanaRegs.CANMD.all = ECanaShadow.CANMD.all; // Lecture-�criture uniquement en 32bit

	ECanaMboxes.MBOX7.MSGCTRL.bit.DLC = Data_lenght;
	ECanaMboxes.MBOX7.MSGCTRL.bit.RTR=Remote;

	ECanaMboxes.MBOX7.MSGID.bit.AAM=Auto_Ans; 
	ECanaMboxes.MBOX7.MSGID.bit.IDE=0;
	ECanaMboxes.MBOX7.MSGID.bit.AME=0;
	ECanaMboxes.MBOX7.MSGID.bit.STDMSGID=ID;
	}break;
	case 8:
	{
	ECanaShadow.CANMD.all = ECanaRegs.CANMD.all; // Lecture-�criture uniquement en 32bit
	ECanaShadow.CANMD.bit.MD8 = Dir;
	ECanaRegs.CANMD.all = ECanaShadow.CANMD.all; // Lecture-�criture uniquement en 32bit

	ECanaMboxes.MBOX8.MSGCTRL.bit.DLC = Data_lenght;
	ECanaMboxes.MBOX8.MSGCTRL.bit.RTR=Remote;

	ECanaMboxes.MBOX8.MSGID.bit.AAM=Auto_Ans; 
	ECanaMboxes.MBOX8.MSGID.bit.IDE=0;
	ECanaMboxes.MBOX8.MSGID.bit.AME=0;
	ECanaMboxes.MBOX8.MSGID.bit.STDMSGID=ID;
	}break;
	case 9:
	{
	ECanaShadow.CANMD.all = ECanaRegs.CANMD.all; // Lecture-�criture uniquement en 32bit
	ECanaShadow.CANMD.bit.MD9 = Dir;
	ECanaRegs.CANMD.all = ECanaShadow.CANMD.all; // Lecture-�criture uniquement en 32bit

	ECanaMboxes.MBOX9.MSGCTRL.bit.DLC = Data_lenght;
	ECanaMboxes.MBOX9.MSGCTRL.bit.RTR=Remote;

	ECanaMboxes.MBOX9.MSGID.bit.AAM=Auto_Ans; 
	ECanaMboxes.MBOX9.MSGID.bit.IDE=0;
	ECanaMboxes.MBOX9.MSGID.bit.AME=0;
	ECanaMboxes.MBOX9.MSGID.bit.STDMSGID=ID;
	}break;
	

 }

}

// fonction pour activer l'un des Mailbox
void Enable_CAN_Mailbox(unsigned char Mbx)
{
 switch(Mbx)
 {
	case 0:
	{
   		ECanaShadow.CANME.all = ECanaRegs.CANME.all;
   		ECanaShadow.CANME.bit.ME0 = 1;
   		ECanaRegs.CANME.all = ECanaShadow.CANME.all;
	}break;

	case 1:
	{
   		ECanaShadow.CANME.all = ECanaRegs.CANME.all;
   		ECanaShadow.CANME.bit.ME1 = 1;
   		ECanaRegs.CANME.all = ECanaShadow.CANME.all;
	}break;

	case 2:
	{
   		ECanaShadow.CANME.all = ECanaRegs.CANME.all;
   		ECanaShadow.CANME.bit.ME2 = 1;
   		ECanaRegs.CANME.all = ECanaShadow.CANME.all;
	}break;

	case 3:
	{
   		ECanaShadow.CANME.all = ECanaRegs.CANME.all;
   		ECanaShadow.CANME.bit.ME3 = 1;
   		ECanaRegs.CANME.all = ECanaShadow.CANME.all;
	}break;

	case 4:
	{
   		ECanaShadow.CANME.all = ECanaRegs.CANME.all;
   		ECanaShadow.CANME.bit.ME4 = 1;
   		ECanaRegs.CANME.all = ECanaShadow.CANME.all;
	}break;

	case 5:
	{
   		ECanaShadow.CANME.all = ECanaRegs.CANME.all;
   		ECanaShadow.CANME.bit.ME5 = 1;
   		ECanaRegs.CANME.all = ECanaShadow.CANME.all;
	}break;

	case 6:
	{
   		ECanaShadow.CANME.all = ECanaRegs.CANME.all;
   		ECanaShadow.CANME.bit.ME6 = 1;
   		ECanaRegs.CANME.all = ECanaShadow.CANME.all;
	}break;

	case 7:
	{
   		ECanaShadow.CANME.all = ECanaRegs.CANME.all;
   		ECanaShadow.CANME.bit.ME7 = 1;
   		ECanaRegs.CANME.all = ECanaShadow.CANME.all;
	}break;

	case 8:
	{
   		ECanaShadow.CANME.all = ECanaRegs.CANME.all;
   		ECanaShadow.CANME.bit.ME8 = 1;
   		ECanaRegs.CANME.all = ECanaShadow.CANME.all;
	}break;

	case 9:
	{
   		ECanaShadow.CANME.all = ECanaRegs.CANME.all;
   		ECanaShadow.CANME.bit.ME9 = 1;
   		ECanaRegs.CANME.all = ECanaShadow.CANME.all;
	}break;

	
 }
}

 
 // fonction pour desactiver l'un des Mailbox
 
 void Disable_CAN_Mailbox(unsigned char Mbx)
{
 switch(Mbx)
 {
	case 0:
	{
   		ECanaShadow.CANME.all = ECanaRegs.CANME.all;
   		ECanaShadow.CANME.bit.ME0 = 0;
   		ECanaRegs.CANME.all = ECanaShadow.CANME.all;
	}break;

	case 1:
	{
   		ECanaShadow.CANME.all = ECanaRegs.CANME.all;
   		ECanaShadow.CANME.bit.ME1 = 0;
   		ECanaRegs.CANME.all = ECanaShadow.CANME.all;
	}break;

	case 2:
	{
   		ECanaShadow.CANME.all = ECanaRegs.CANME.all;
   		ECanaShadow.CANME.bit.ME2 = 0;
   		ECanaRegs.CANME.all = ECanaShadow.CANME.all;
	}break;

	case 3:
	{
   		ECanaShadow.CANME.all = ECanaRegs.CANME.all;
   		ECanaShadow.CANME.bit.ME3 = 0;
   		ECanaRegs.CANME.all = ECanaShadow.CANME.all;
	}break;

	case 4:
	{
   		ECanaShadow.CANME.all = ECanaRegs.CANME.all;
   		ECanaShadow.CANME.bit.ME4 = 0;
   		ECanaRegs.CANME.all = ECanaShadow.CANME.all;
	}break;

	case 5:
	{
   		ECanaShadow.CANME.all = ECanaRegs.CANME.all;
   		ECanaShadow.CANME.bit.ME5 = 0;
   		ECanaRegs.CANME.all = ECanaShadow.CANME.all;
	}break;

	case 6:
	{
   		ECanaShadow.CANME.all = ECanaRegs.CANME.all;
   		ECanaShadow.CANME.bit.ME6 = 0;
   		ECanaRegs.CANME.all = ECanaShadow.CANME.all;
	}break;

	case 7:
	{
   		ECanaShadow.CANME.all = ECanaRegs.CANME.all;
   		ECanaShadow.CANME.bit.ME7 = 0;
   		ECanaRegs.CANME.all = ECanaShadow.CANME.all;
	}break;

	case 8:
	{
   		ECanaShadow.CANME.all = ECanaRegs.CANME.all;
   		ECanaShadow.CANME.bit.ME8 = 0;
   		ECanaRegs.CANME.all = ECanaShadow.CANME.all;
	}break;

	case 9:
	{
   		ECanaShadow.CANME.all = ECanaRegs.CANME.all;
   		ECanaShadow.CANME.bit.ME9 = 0;
   		ECanaRegs.CANME.all = ECanaShadow.CANME.all;
	}break;

 }
}

 
void Send_Mailbox(unsigned char Mbx)
{

 switch(Mbx)
 {
	case 0:
	{
      
   	   ECanaShadow.CANTRS.all = 0;
       ECanaShadow.CANTRS.bit.TRS0 = 1;             // Set TRS for mailbox under test
       ECanaRegs.CANTRS.all = ECanaShadow.CANTRS.all;
       
  /*     
       for( i=0; i<TXCOUNT; i++)
   {
       ECanaShadow.CANTRS.all = 0;
       ECanaShadow.CANTRS.bit.TRS0 = 1;             // Set TRS for mailbox under test
       ECanaRegs.CANTRS.all = ECanaShadow.CANTRS.all;

       do
    	{
      	ECanaShadow.CANTA.all = ECanaRegs.CANTA.all;
    	} while(ECanaShadow.CANTA.bit.TA0 == 0 );   // Wait for TA5 bit to be set..


       ECanaShadow.CANTA.all = 0;
       ECanaShadow.CANTA.bit.TA0 = 1;     	         // Clear TA5
       ECanaRegs.CANTA.all = ECanaShadow.CANTA.all;

       loopcount ++;
    }
     asm(" ESTOP0");  // Stop here
*/
	}break;

	case 1:
	{
   	   ECanaShadow.CANTRS.all = 0;
       ECanaShadow.CANTRS.bit.TRS1 = 1;             // Set TRS for mailbox under test
       ECanaRegs.CANTRS.all = ECanaShadow.CANTRS.all;

	}break;

	case 2:
	{
   	   ECanaShadow.CANTRS.all = 0;
       ECanaShadow.CANTRS.bit.TRS2 = 1;             // Set TRS for mailbox under test
       ECanaRegs.CANTRS.all = ECanaShadow.CANTRS.all;

	}break;

	case 3:
	{
   	   ECanaShadow.CANTRS.all = 0;
       ECanaShadow.CANTRS.bit.TRS3 = 1;             // Set TRS for mailbox under test
       ECanaRegs.CANTRS.all = ECanaShadow.CANTRS.all;

	}break;

	case 4:
	{
   	   ECanaShadow.CANTRS.all = 0;
       ECanaShadow.CANTRS.bit.TRS4 = 1;             // Set TRS for mailbox under test
       ECanaRegs.CANTRS.all = ECanaShadow.CANTRS.all;

	}break;

	case 5:
	{
   	   ECanaShadow.CANTRS.all = 0;
       ECanaShadow.CANTRS.bit.TRS5 = 1;             // Set TRS for mailbox under test
       ECanaRegs.CANTRS.all = ECanaShadow.CANTRS.all;

	}break;

	case 6:
	{
   	   ECanaShadow.CANTRS.all = 0;
       ECanaShadow.CANTRS.bit.TRS6 = 1;             // Set TRS for mailbox under test
       ECanaRegs.CANTRS.all = ECanaShadow.CANTRS.all;

	}break;

	case 7:
	{
   	   ECanaShadow.CANTRS.all = 0;
       ECanaShadow.CANTRS.bit.TRS7 = 1;             // Set TRS for mailbox under test
       ECanaRegs.CANTRS.all = ECanaShadow.CANTRS.all;

	}break;

	case 8:
	{
   	   ECanaShadow.CANTRS.all = 0;
       ECanaShadow.CANTRS.bit.TRS8 = 1;             // Set TRS for mailbox under test
       ECanaRegs.CANTRS.all = ECanaShadow.CANTRS.all;

	}break;

	case 9:
	{
   	   ECanaShadow.CANTRS.all = 0;
       ECanaShadow.CANTRS.bit.TRS9 = 1;             // Set TRS for mailbox under test
       ECanaRegs.CANTRS.all = ECanaShadow.CANTRS.all;

	}break;

	

 }
}
// transmit acknowledge must be cleared for the next transmission


// fonction pour voir si un nouveau message est arrive 

int Check_Receive_Mailbox(unsigned char Mbx)
{
 int Mailbox_Receive_Flag=0;
 ECanaShadow.CANRMP.all= ECanaRegs.CANRMP.all;
 

 switch(Mbx)
 {
	case 0:
	{
		if(ECanaShadow.CANRMP.bit.RMP0==1)
		{
		ECanaShadow.CANRMP.bit.RMP0=1;
		ECanaRegs.CANRMP.all=ECanaShadow.CANRMP.all;
		Mailbox_Receive_Flag=1;
		}

	}break;

	case 1:
	{
		if(ECanaShadow.CANRMP.bit.RMP1==1)
		{
		ECanaShadow.CANRMP.bit.RMP1=1;
		ECanaRegs.CANRMP.all=ECanaShadow.CANRMP.all;
        Mailbox_Receive_Flag=1;
		}
		
	}break;

	case 2:
	{
		if(ECanaShadow.CANRMP.bit.RMP2==1)
		{
		ECanaShadow.CANRMP.bit.RMP2=1;
		ECanaRegs.CANRMP.all=ECanaShadow.CANRMP.all;
        Mailbox_Receive_Flag=1;
		}
		
	}break;

	case 3:
	{
		if(ECanaShadow.CANRMP.bit.RMP3==1)
		{
		ECanaShadow.CANRMP.bit.RMP3=1;
		ECanaRegs.CANRMP.all=ECanaShadow.CANRMP.all;
        Mailbox_Receive_Flag=1;
		}

	}break;

	case 4:
	{
		if(ECanaShadow.CANRMP.bit.RMP4==1)
		{
		ECanaShadow.CANRMP.bit.RMP4=1;
		ECanaRegs.CANRMP.all=ECanaShadow.CANRMP.all;
        Mailbox_Receive_Flag=1;
        D_DEFAUT ();
		}

	}break;

	case 5:
	{
		if(ECanaShadow.CANRMP.bit.RMP5==1)
		{
		ECanaShadow.CANRMP.bit.RMP5=1;
		ECanaRegs.CANRMP.all=ECanaShadow.CANRMP.all;
        Mailbox_Receive_Flag=1;
		}

	}break;

	case 6:
	{
		if(ECanaShadow.CANRMP.bit.RMP6==1)
		{
		ECanaShadow.CANRMP.bit.RMP6=1;
		ECanaRegs.CANRMP.all=ECanaShadow.CANRMP.all;
        Mailbox_Receive_Flag=1;
		}

	}break;

	case 7:
	{
		if(ECanaShadow.CANRMP.bit.RMP7==1)
		{
		ECanaShadow.CANRMP.bit.RMP7=1;
		ECanaRegs.CANRMP.all=ECanaShadow.CANRMP.all;
        Mailbox_Receive_Flag=1;
		}

	}break;

	case 8:
	{
		if(ECanaShadow.CANRMP.bit.RMP8==1)
		{
		ECanaShadow.CANRMP.bit.RMP8=1;
		ECanaRegs.CANRMP.all=ECanaShadow.CANRMP.all;
        Mailbox_Receive_Flag=1;
		}

	}break;

	case 9:
	{
		if(ECanaShadow.CANRMP.bit.RMP9==1)
		{
		ECanaShadow.CANRMP.bit.RMP9=1;
		ECanaRegs.CANRMP.all=ECanaShadow.CANRMP.all;
        Mailbox_Receive_Flag=1;
		}

	}break;

	
	default :
        Mailbox_Receive_Flag=0;
 }

  return Mailbox_Receive_Flag;
}



// fonction permettant de d�finir les donn�es contenu dans une mailbox

void Set_Data_Mailbox(unsigned char Mbx, char Byte0, char Byte1, char Byte2, char Byte3, char Byte4, char Byte5, char Byte6, char Byte7)
{

 switch(Mbx)
 {
	case 0:
	{
		/*
	ECanaMboxes.MBOX0.MDL.all = 0x55555555;
	ECanaMboxes.MBOX0.MDH.all = 0x55555555;
	*/
	    ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
  		ECanaShadow.CANMC.bit.CDR=1;
   		ECanaShadow.CANMC.bit.MBNR=0;
   		ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;


		ECanaMboxes.MBOX0.MDL.byte.BYTE0=Byte3;
		ECanaMboxes.MBOX0.MDL.byte.BYTE1=Byte2;
		ECanaMboxes.MBOX0.MDL.byte.BYTE2=Byte1;
		ECanaMboxes.MBOX0.MDL.byte.BYTE3=Byte0;
		ECanaMboxes.MBOX0.MDH.byte.BYTE4=Byte7;
		ECanaMboxes.MBOX0.MDH.byte.BYTE5=Byte6;
		ECanaMboxes.MBOX0.MDH.byte.BYTE6=Byte5;
		ECanaMboxes.MBOX0.MDH.byte.BYTE7=Byte4;

		ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
   		ECanaShadow.CANMC.bit.CDR=0;
   		ECanaShadow.CANMC.bit.MBNR=0;
   		ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;

	}break;

	case 1:
	{
	    ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
  		ECanaShadow.CANMC.bit.CDR=1;
   		ECanaShadow.CANMC.bit.MBNR=1;
   		ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;


		ECanaMboxes.MBOX1.MDL.byte.BYTE0=Byte3;
		ECanaMboxes.MBOX1.MDL.byte.BYTE1=Byte2;
		ECanaMboxes.MBOX1.MDL.byte.BYTE2=Byte1;
		ECanaMboxes.MBOX1.MDL.byte.BYTE3=Byte0;
		ECanaMboxes.MBOX1.MDH.byte.BYTE4=Byte7;
		ECanaMboxes.MBOX1.MDH.byte.BYTE5=Byte6;
		ECanaMboxes.MBOX1.MDH.byte.BYTE6=Byte5;
		ECanaMboxes.MBOX1.MDH.byte.BYTE7=Byte4;

		ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
   		ECanaShadow.CANMC.bit.CDR=0;
   		ECanaShadow.CANMC.bit.MBNR=1;
   		ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
		
	}break;

	case 2:
	{
	    ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
  		ECanaShadow.CANMC.bit.CDR=1;
   		ECanaShadow.CANMC.bit.MBNR=2;
   		ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;


		ECanaMboxes.MBOX2.MDL.byte.BYTE0=Byte3;
		ECanaMboxes.MBOX2.MDL.byte.BYTE1=Byte2;
		ECanaMboxes.MBOX2.MDL.byte.BYTE2=Byte1;
		ECanaMboxes.MBOX2.MDL.byte.BYTE3=Byte0;
		ECanaMboxes.MBOX2.MDH.byte.BYTE4=Byte7;
		ECanaMboxes.MBOX2.MDH.byte.BYTE5=Byte6;
		ECanaMboxes.MBOX2.MDH.byte.BYTE6=Byte5;
		ECanaMboxes.MBOX2.MDH.byte.BYTE7=Byte4;

		ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
   		ECanaShadow.CANMC.bit.CDR=0;
   		ECanaShadow.CANMC.bit.MBNR=2;
   		ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
		
	}break;

	case 3:
	{
	    ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
  		ECanaShadow.CANMC.bit.CDR=1;
   		ECanaShadow.CANMC.bit.MBNR=3;
   		ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;


		ECanaMboxes.MBOX3.MDL.byte.BYTE0=Byte3;
		ECanaMboxes.MBOX3.MDL.byte.BYTE1=Byte2;
		ECanaMboxes.MBOX3.MDL.byte.BYTE2=Byte1;
		ECanaMboxes.MBOX3.MDL.byte.BYTE3=Byte0;
		ECanaMboxes.MBOX3.MDH.byte.BYTE4=Byte7;
		ECanaMboxes.MBOX3.MDH.byte.BYTE5=Byte6;
		ECanaMboxes.MBOX3.MDH.byte.BYTE6=Byte5;
		ECanaMboxes.MBOX3.MDH.byte.BYTE7=Byte4;

		ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
   		ECanaShadow.CANMC.bit.CDR=0;
   		ECanaShadow.CANMC.bit.MBNR=3;
   		ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;

	}break;

	case 4:
	{
	    ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
	    ECanaShadow.CANTRR.bit.TRR4=0; 
  		ECanaShadow.CANMC.bit.CDR=1;
   		ECanaShadow.CANMC.bit.MBNR=4;
   		ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;


		ECanaMboxes.MBOX4.MDL.byte.BYTE0=Byte3;
		ECanaMboxes.MBOX4.MDL.byte.BYTE1=Byte2;
		ECanaMboxes.MBOX4.MDL.byte.BYTE2=Byte1;
		ECanaMboxes.MBOX4.MDL.byte.BYTE3=Byte0;
		ECanaMboxes.MBOX4.MDH.byte.BYTE4=Byte7;
		ECanaMboxes.MBOX4.MDH.byte.BYTE5=Byte6;
		ECanaMboxes.MBOX4.MDH.byte.BYTE6=Byte5;
		ECanaMboxes.MBOX4.MDH.byte.BYTE7=Byte4;

		ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
   		ECanaShadow.CANMC.bit.CDR=0;
   		ECanaShadow.CANMC.bit.MBNR=4;
   		ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;

	}break;

	case 5:
	{
	    ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
  		ECanaShadow.CANMC.bit.CDR=1;
   		ECanaShadow.CANMC.bit.MBNR=5;
   		ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;


		ECanaMboxes.MBOX5.MDL.byte.BYTE0=Byte3;
		ECanaMboxes.MBOX5.MDL.byte.BYTE1=Byte2;
		ECanaMboxes.MBOX5.MDL.byte.BYTE2=Byte1;
		ECanaMboxes.MBOX5.MDL.byte.BYTE3=Byte0;
		ECanaMboxes.MBOX5.MDH.byte.BYTE4=Byte7;
		ECanaMboxes.MBOX5.MDH.byte.BYTE5=Byte6;
		ECanaMboxes.MBOX5.MDH.byte.BYTE6=Byte5;
		ECanaMboxes.MBOX5.MDH.byte.BYTE7=Byte4;

		ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
   		ECanaShadow.CANMC.bit.CDR=0;
   		ECanaShadow.CANMC.bit.MBNR=5;
   		ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;

	}break;

	case 6:
	{
	    ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
  		ECanaShadow.CANMC.bit.CDR=1;
   		ECanaShadow.CANMC.bit.MBNR=6;
   		ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;


		ECanaMboxes.MBOX6.MDL.byte.BYTE0=Byte3;
		ECanaMboxes.MBOX6.MDL.byte.BYTE1=Byte2;
		ECanaMboxes.MBOX6.MDL.byte.BYTE2=Byte1;
		ECanaMboxes.MBOX6.MDL.byte.BYTE3=Byte0;
		ECanaMboxes.MBOX6.MDH.byte.BYTE4=Byte7;
		ECanaMboxes.MBOX6.MDH.byte.BYTE5=Byte6;
		ECanaMboxes.MBOX6.MDH.byte.BYTE6=Byte5;
		ECanaMboxes.MBOX6.MDH.byte.BYTE7=Byte4;

		ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
   		ECanaShadow.CANMC.bit.CDR=0;
   		ECanaShadow.CANMC.bit.MBNR=6;
   		ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;

	}break;

	case 7:
	{
	    ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
  		ECanaShadow.CANMC.bit.CDR=1;
   		ECanaShadow.CANMC.bit.MBNR=7;
   		ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;


		ECanaMboxes.MBOX7.MDL.byte.BYTE0=Byte3;
		ECanaMboxes.MBOX7.MDL.byte.BYTE1=Byte2;
		ECanaMboxes.MBOX7.MDL.byte.BYTE2=Byte1;
		ECanaMboxes.MBOX7.MDL.byte.BYTE3=Byte0;
		ECanaMboxes.MBOX7.MDH.byte.BYTE4=Byte7;
		ECanaMboxes.MBOX7.MDH.byte.BYTE5=Byte6;
		ECanaMboxes.MBOX7.MDH.byte.BYTE6=Byte5;
		ECanaMboxes.MBOX7.MDH.byte.BYTE7=Byte4;

		ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
   		ECanaShadow.CANMC.bit.CDR=0;
   		ECanaShadow.CANMC.bit.MBNR=7;
   		ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;

	}break;

	case 8:
	{
	    ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
  		ECanaShadow.CANMC.bit.CDR=1;
   		ECanaShadow.CANMC.bit.MBNR=8;
   		ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;


		ECanaMboxes.MBOX8.MDL.byte.BYTE0=Byte3;
		ECanaMboxes.MBOX8.MDL.byte.BYTE1=Byte2;
		ECanaMboxes.MBOX8.MDL.byte.BYTE2=Byte1;
		ECanaMboxes.MBOX8.MDL.byte.BYTE3=Byte0;
		ECanaMboxes.MBOX8.MDH.byte.BYTE4=Byte7;
		ECanaMboxes.MBOX8.MDH.byte.BYTE5=Byte6;
		ECanaMboxes.MBOX8.MDH.byte.BYTE6=Byte5;
		ECanaMboxes.MBOX8.MDH.byte.BYTE7=Byte4;

		ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
   		ECanaShadow.CANMC.bit.CDR=0;
   		ECanaShadow.CANMC.bit.MBNR=8;
   		ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;

	}break;

	case 9:
	{
	    ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
  		ECanaShadow.CANMC.bit.CDR=1;
   		ECanaShadow.CANMC.bit.MBNR=9;
   		ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;


		ECanaMboxes.MBOX9.MDL.byte.BYTE0=Byte3;
		ECanaMboxes.MBOX9.MDL.byte.BYTE1=Byte2;
		ECanaMboxes.MBOX9.MDL.byte.BYTE2=Byte1;
		ECanaMboxes.MBOX9.MDL.byte.BYTE3=Byte0;
		ECanaMboxes.MBOX9.MDH.byte.BYTE4=Byte7;
		ECanaMboxes.MBOX9.MDH.byte.BYTE5=Byte6;
		ECanaMboxes.MBOX9.MDH.byte.BYTE6=Byte5;
		ECanaMboxes.MBOX9.MDH.byte.BYTE7=Byte4;

		ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
   		ECanaShadow.CANMC.bit.CDR=0;
   		ECanaShadow.CANMC.bit.MBNR=9;
   		ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;

	}break;

	
	
	default :
	break;
        
 }
}
 void TRS_zero(unsigned char Mbx)
{

 switch(Mbx)
 {
	case 1:
	{
   	   ECanaShadow.CANTRS.all = 0;
       ECanaShadow.CANTRS.bit.TRS0 = 0;         
       ECanaRegs.CANTRS.all = ECanaShadow.CANTRS.all;

	}break;
	
	default:
	break;
	
 }
}

void Transmit_init(unsigned char Mbx)
{

 switch(Mbx)
 {
	case 0:
	{
   	   ECanaShadow.CANTRR.all = ECanaRegs.CANTRR.all;
       ECanaShadow.CANTRR.bit.TRR0 = 1;         
       ECanaRegs.CANTRR.all = ECanaShadow.CANTRR.all;
      
      do
    	{
      	ECanaShadow.CANTRS.all = ECanaRegs.CANTRS.all;
    	} while(ECanaShadow.CANTRS.bit.TRS0 != 0);  
    		
	}break;
	
	case 1:
	{
   	   ECanaShadow.CANTRR.all = ECanaRegs.CANTRR.all;
       ECanaShadow.CANTRR.bit.TRR1 = 1;         
       ECanaRegs.CANTRR.all = ECanaShadow.CANTRR.all;
      
      do
    	{
      	ECanaShadow.CANTRS.all = ECanaRegs.CANTRS.all;
    	} while(ECanaShadow.CANTRS.bit.TRS1 != 0);  
    		
	}break;
	
	case 2:
	{
   	   ECanaShadow.CANTRR.all = ECanaRegs.CANTRR.all;
       ECanaShadow.CANTRR.bit.TRR2 = 1;         
       ECanaRegs.CANTRR.all = ECanaShadow.CANTRR.all;
      
      do
    	{
      	ECanaShadow.CANTRS.all = ECanaRegs.CANTRS.all;
    	} while(ECanaShadow.CANTRS.bit.TRS2 != 0);  
    		
	}break;
	
	case 3:
	{
   	   ECanaShadow.CANTRR.all = ECanaRegs.CANTRR.all;
       ECanaShadow.CANTRR.bit.TRR3 = 1;         
       ECanaRegs.CANTRR.all = ECanaShadow.CANTRR.all;
      
      do
    	{
      	ECanaShadow.CANTRS.all = ECanaRegs.CANTRS.all;
    	} while(ECanaShadow.CANTRS.bit.TRS3 != 0);  
    		
	}break;
	
	case 4:
	{
   	   ECanaShadow.CANTRR.all = ECanaRegs.CANTRR.all;
       ECanaShadow.CANTRR.bit.TRR4 = 1;         
       ECanaRegs.CANTRR.all = ECanaShadow.CANTRR.all;
      
      do
    	{
      	ECanaShadow.CANTRS.all = ECanaRegs.CANTRS.all;
    	} while(ECanaShadow.CANTRS.bit.TRS4 != 0);  
    		
	}break;
	
	case 5:
	{
   	   ECanaShadow.CANTRR.all = ECanaRegs.CANTRR.all;
       ECanaShadow.CANTRR.bit.TRR5 = 1;         
       ECanaRegs.CANTRR.all = ECanaShadow.CANTRR.all;
      
      do
    	{
      	ECanaShadow.CANTRS.all = ECanaRegs.CANTRS.all;
    	} while(ECanaShadow.CANTRS.bit.TRS5 != 0);  
    		
	}break;
	
	case 6:
	{
   	   ECanaShadow.CANTRR.all = ECanaRegs.CANTRR.all;
       ECanaShadow.CANTRR.bit.TRR6 = 1;         
       ECanaRegs.CANTRR.all = ECanaShadow.CANTRR.all;
      
      do
    	{
      	ECanaShadow.CANTRS.all = ECanaRegs.CANTRS.all;
    	} while(ECanaShadow.CANTRS.bit.TRS6 != 0);  
    		
	}break;
	
	case 7:
	{
   	   ECanaShadow.CANTRR.all = ECanaRegs.CANTRR.all;
       ECanaShadow.CANTRR.bit.TRR7= 1;         
       ECanaRegs.CANTRR.all = ECanaShadow.CANTRR.all;
      
      do
    	{
      	ECanaShadow.CANTRS.all = ECanaRegs.CANTRS.all;
    	} while(ECanaShadow.CANTRS.bit.TRS7!= 0);  
    		
	}break;
	
	case 8:
	{
   	   ECanaShadow.CANTRR.all = ECanaRegs.CANTRR.all;
       ECanaShadow.CANTRR.bit.TRR8 = 1;         
       ECanaRegs.CANTRR.all = ECanaShadow.CANTRR.all;
      
      do
    	{
      	ECanaShadow.CANTRS.all = ECanaRegs.CANTRS.all;
    	} while(ECanaShadow.CANTRS.bit.TRS8 != 0);  
    		
	}break;
	
	case 9:
	{
   	   ECanaShadow.CANTRR.all = ECanaRegs.CANTRR.all;
       ECanaShadow.CANTRR.bit.TRR9 = 1;         
       ECanaRegs.CANTRR.all = ECanaShadow.CANTRR.all;
      
      do
    	{
      	ECanaShadow.CANTRS.all = ECanaRegs.CANTRS.all;
    	} while(ECanaShadow.CANTRS.bit.TRS9 != 0);  
    		
	}break;
	
	default:
	break;

 }
}

//Fonction permettant d'attendre l'accus�e de r�ception certifiant que le message de la mailbox Mbx a �t� envoy� correctement

void Wait_Send_Ack(unsigned char Mbx)
{
 switch(Mbx)
 {
	case 0:
	{
       do
    	{
      		ECanaShadow.CANTA.all = ECanaRegs.CANTA.all;
    	} while(ECanaShadow.CANTA.bit.TA0 == 0);   // Wait for TA bit to be set..

       ECanaShadow.CANTA.all = 0;
       ECanaShadow.CANTA.bit.TA0 = 1;     	         // Clear TA bit
       ECanaRegs.CANTA.all = ECanaShadow.CANTA.all;
	}break;

	case 1:
	{
       do
    	{
      	ECanaShadow.CANTA.all = ECanaRegs.CANTA.all;
    	} while(ECanaShadow.CANTA.bit.TA1 == 0);   // Wait for TA bit to be set..

       ECanaShadow.CANTA.all = 0;
       ECanaShadow.CANTA.bit.TA1 = 1;     	         // Clear TA bit
       ECanaRegs.CANTA.all = ECanaShadow.CANTA.all;
	}break;

	case 2:
	{
       do
    	{
      	ECanaShadow.CANTA.all = ECanaRegs.CANTA.all;
    	} while(ECanaShadow.CANTA.bit.TA2 == 0);   // Wait for TA bit to be set..

       ECanaShadow.CANTA.all = 0;
       ECanaShadow.CANTA.bit.TA2 = 1;     	         // Clear TA bit
       ECanaRegs.CANTA.all = ECanaShadow.CANTA.all;
	}break;

	case 3:
	{
       do
    	{
      	ECanaShadow.CANTA.all = ECanaRegs.CANTA.all;
    	} while(ECanaShadow.CANTA.bit.TA3 == 0);   // Wait for TA bit to be set..

       ECanaShadow.CANTA.all = 0;
       ECanaShadow.CANTA.bit.TA3 = 1;     	         // Clear TA bit
       ECanaRegs.CANTA.all = ECanaShadow.CANTA.all;
       test++;
	}break;

	case 4:
	{
       do
    	{
      	ECanaShadow.CANTA.all = ECanaRegs.CANTA.all;
    	} while(ECanaShadow.CANTA.bit.TA4 == 0);   // Wait for TA bit to be set..

       ECanaShadow.CANTA.all = 0;
       ECanaShadow.CANTA.bit.TA4 = 1;     	         // Clear TA bit
       ECanaRegs.CANTA.all = ECanaShadow.CANTA.all;
	}break;

	case 5:
	{
       do
    	{
      	ECanaShadow.CANTA.all = ECanaRegs.CANTA.all;
    	} while(ECanaShadow.CANTA.bit.TA5 == 0);   // Wait for TA bit to be set..

       ECanaShadow.CANTA.all = 0;
       ECanaShadow.CANTA.bit.TA5 = 1;     	         // Clear TA bit
       ECanaRegs.CANTA.all = ECanaShadow.CANTA.all;
	}break;

	case 6:
	{
       do
    	{
      	ECanaShadow.CANTA.all = ECanaRegs.CANTA.all;
    	} while(ECanaShadow.CANTA.bit.TA6 == 0);   // Wait for TA bit to be set..

       ECanaShadow.CANTA.all = 0;
       ECanaShadow.CANTA.bit.TA6 = 1;     	         // Clear TA bit
       ECanaRegs.CANTA.all = ECanaShadow.CANTA.all;
	}break;

	case 7:
	{
       do
    	{
      	ECanaShadow.CANTA.all = ECanaRegs.CANTA.all;
    	} while(ECanaShadow.CANTA.bit.TA7 == 0);   // Wait for TA bit to be set..

       ECanaShadow.CANTA.all = 0;
       ECanaShadow.CANTA.bit.TA7 = 1;     	         // Clear TA bit
       ECanaRegs.CANTA.all = ECanaShadow.CANTA.all;
	}break;

	case 8:
	{
       do
    	{
      	ECanaShadow.CANTA.all = ECanaRegs.CANTA.all;
    	} while(ECanaShadow.CANTA.bit.TA8 == 0);   // Wait for TA bit to be set..

       ECanaShadow.CANTA.all = 0;
       ECanaShadow.CANTA.bit.TA8 = 1;     	         // Clear TA bit
       ECanaRegs.CANTA.all = ECanaShadow.CANTA.all;
	}break;

	case 9:
	{
       do
    	{
      	ECanaShadow.CANTA.all = ECanaRegs.CANTA.all;
    	} while(ECanaShadow.CANTA.bit.TA9 == 0);   // Wait for TA bit to be set..

       ECanaShadow.CANTA.all = 0;
       ECanaShadow.CANTA.bit.TA9 = 1;     	         // Clear TA bit
       ECanaRegs.CANTA.all = ECanaShadow.CANTA.all;
	}break;

	
	default :
	break;
 }


}

void Wait_Abort_Ack(void)
{
 //switch(Mbx)
 //{
	//case 1:
	//{
       do
    	{
      	ECanaShadow.CANAA.all = ECanaRegs.CANAA.all;
    	} while(ECanaShadow.CANAA.bit.AA0 == 0);
    	
   		ECanaShadow.CANTRS.all = 0;
       ECanaShadow.CANTRS.bit.TRS0 = 0;         
       ECanaRegs.CANTRS.all = ECanaShadow.CANTRS.all;
} 

// Fonction permettant de lire les donn�e contenu dans une mailbox
long Read_Mailbox(unsigned char Mbx, unsigned char ByteX)
{
 long Data;

 switch(Mbx)
 {

	case 0:
	{
		switch (ByteX)
		{
			case 0:
			{
				Data=ECanaMboxes.MBOX0.MDL.byte.BYTE3;
            }break;
			case 1:
            {
				Data=ECanaMboxes.MBOX0.MDL.byte.BYTE2;
            }break;
			case 2:
            {
				Data=ECanaMboxes.MBOX0.MDL.byte.BYTE1;
            }break;
			case 3:
            {
				Data=ECanaMboxes.MBOX0.MDL.byte.BYTE0;
            }break;
			case 4:
            {
				Data=ECanaMboxes.MBOX0.MDH.byte.BYTE7;
            }break;
			case 5:
            {
				Data=ECanaMboxes.MBOX0.MDH.byte.BYTE6;
            }break;
			case 6:
            {
				Data=ECanaMboxes.MBOX0.MDH.byte.BYTE5;
            }break;
			case 7:
			{
				Data=ECanaMboxes.MBOX0.MDH.byte.BYTE4;
            }break;

			default: 
			break;
		}

	}break;
	

 }
 return Data;	
}


void Erase_Data_Mailbox(unsigned char Mbx)
{

 switch(Mbx)
 {
	case 1:
	{
	    ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
  		ECanaShadow.CANMC.bit.CDR=1;
   		ECanaShadow.CANMC.bit.MBNR=0;
   		ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;


		ECanaMboxes.MBOX0.MDL.byte.BYTE0=0;
		ECanaMboxes.MBOX0.MDL.byte.BYTE1=0;
		ECanaMboxes.MBOX0.MDL.byte.BYTE2=0;
		ECanaMboxes.MBOX0.MDL.byte.BYTE3=0;
		ECanaMboxes.MBOX0.MDH.byte.BYTE4=0;
		ECanaMboxes.MBOX0.MDH.byte.BYTE5=0;
		ECanaMboxes.MBOX0.MDH.byte.BYTE6=0;
		ECanaMboxes.MBOX0.MDH.byte.BYTE7=0;

		ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
   		ECanaShadow.CANMC.bit.CDR=0;
   		ECanaShadow.CANMC.bit.MBNR=0;
   		ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;

	}break;
	
	default:
	break;
 }
}

 

in the user.c : for the transmitter:

InitEcan();

Transmit_init(4):

Disable_CAN_Mailbox(4);

config_CAN_Mailbox(4,0x600,1,8,0,0);

Enable_CAN_Mailbox((4);

Set_Data_Mailbox(4,255,0,255,0,255,0,255,0);

Send_Mailbox(4);

Wait_Send_Ack(4);

as for the receiver:

InitEcan();

Transmit_init(4):

Disable_CAN_Mailbox(4);

config_CAN_Mailbox(4,0x600,1,8,0,0);

Enable_CAN_Mailbox((4);

Check_Receive_Mailbox(4);

can you help me please  find the problem and better understand the frame structure ??

thank you

regards,

Josephina

  • Hello Josephina

     

    I tried sending just zeroes and i m supposing i must visualize a long zero line but i didnt... it s always ups and downs.

    You can not get a long zero line because of the bit stuffing. Whenever a transmitter detects five consecutive bits of identical value in the bit stream to be transmitted it automatically inserts a complementary bit in the actual transmitted bit stream. This rule works for almost all CAN message fields except some ERROR and OVERLOAD frames. Read "bit stream coding" section in the CAN specification. 

    For this reason it is difficult to decode the CAN message with your LeCroy. :)

    As for the ACK slot may be there is only one transmitter in your system and no receivers so nobody to set ACK bit. I'm not sure.

    Roman

  • hello Roman,

    Thank you for your reply,

    for the Ack , yes i configured one card as receiver and the other as a transmitter ( just like in the code i wrote in my first poste) and i can even see the frame arriving to the receiver microchip on the RX pin and on the CANMDH and CANMDL.

    Thank you

    Josephina