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