What is the problem? It seems that TX part works fine but in RX arrives data but not good-data.void Can0Init (void)
{
CAN0CTL0_INITRQ = 0x01; // Modo inicializacion
while(!(CAN0CTL1_INITAK))
{
SCI1_OutChar('I');
SCI1_OutChar(CR);
}
CAN0BTR0=0xC1; // 4Tq de Sync Jump Width.
// Prescaler 2...125Kbps(4Mhz)
CAN0BTR1=0x3A; // One sample per bit
// Time Segment 1 = 11 Tq
// Time Segment 2 = 4 Tq
CAN0CTL1=0xA0; // MSCAN enable + LoopBack
/*
7 CANE 1
6 CLKSRC 0
5 LOOPB 1
4 LISTEN 0
3 BORM 0
2 WUPM 0
1 SLPAK 0
0 INITAK 0
*/
/* Configuracion de los filtros de aceptacion de mensajes*/
CAN0IDMR0=0xFF;
CAN0IDMR1=0xFF;
CAN0IDMR2=0xFF;
CAN0IDMR3=0xFF;
CAN0IDMR4=0xFF;
CAN0IDMR5=0xFF;
CAN0IDMR6=0xFF;
CAN0IDMR7=0xFF;
CAN0CTL0=0x00; // Salir modo inicializacion
while(CAN0CTL1_INITAK)
{
};
CAN0RIER=0x01; // ON Rx Interrupts
INT_CFADDR= INTVECT_CAN0RX & 0xF0;
INT_CFDATA_ARR[(INTVECT_CAN0RX & 0x0F) >> 1]= 0x04;
INT_CFADDR= INTVECT_CAN0TX & 0xF0;
INT_CFDATA_ARR[(INTVECT_CAN0TX & 0x0F) >> 1]= 0x04;
}
void CAN0_InBuffer(void)
{
unsigned char i;
while((CAN0RFLG & CAN0RFLG_RXF_MASK)== 0){};
CanRx_Store.DLR = CAN0RXDLR & 0x0F;
for(i=0;i<CanRx_Store.DLR;i++)
{
CanRx_Store.Data[i]=*(&CAN0RXDSR0+i);
}
CAN0RFLG=0x01;
}
void CAN0_OutBuffer(struct Can_struct Tx_struct)
{
unsigned char i, txbuffer;
//Libre Buffer0?
if(CAN0TFLG_TXE0==1)
{
// Buffer0 libre
Stop_CAN0_Tx(0); // Deshabilita las interrupciones por el Buffer0
CAN0TBSEL=CAN0TFLG;
txbuffer=CAN0TBSEL;
CAN0TXIDR0 = Tx_struct.ID;
CAN0TXDLR = Tx_struct.DLR;
CAN0TXTBPR = Tx_struct.Priority;
for(i=0;i<Tx_struct.DLR;i++)
{
// Relleno el buffer de salida
*(&CAN0TXDSR0+i)=Tx_struct.Data[i];
}
CAN0TFLG=txbuffer; // Clear TXE flag
Start_CAN0_Tx(0); // Habilita las interrupciones en el Buffer0
}
//Libre Buffer1?
else if(CAN0TFLG_TXE1==1)
{
// Buffer1 libre
Stop_CAN0_Tx(1); // Deshabilita las interrupciones por el Buffer0
CAN0TBSEL=CAN0TFLG;
txbuffer=CAN0TBSEL;
CAN0TXIDR0 = Tx_struct.ID;
CAN0TXDLR = Tx_struct.DLR;
CAN0TXTBPR = Tx_struct.Priority;
for(i=0;i<Tx_struct.DLR;i++)
{
// Relleno el buffer de salida
*(&CAN0TXDSR0+i)=Tx_struct.Data[i];
}
CAN0TFLG=txbuffer; // Clear TXE flag
Start_CAN0_Tx(1); // Habilita las interrupciones en el Buffer1
}
//Libre Buffer2?
else if(CAN0TFLG_TXE2==1)
{
// Buffer2 libre
Stop_CAN0_Tx(2); // Deshabilita las interrupciones por el Buffer0
CAN0TBSEL=CAN0TFLG;
txbuffer=CAN0TBSEL;
CAN0TXIDR0 = Tx_struct.ID;
CAN0TXDLR = Tx_struct.DLR;
CAN0TXTBPR = Tx_struct.Priority;
for(i=0;i<Tx_struct.DLR;i++)
{
// Relleno el buffer de salida
*(&CAN0TXDSR0+i)=Tx_struct.Data[i];
}
CAN0TFLG=txbuffer; // Clear TXE flag
Start_CAN0_Tx(2); // Habilita las interrupciones en el Buffer02
}
}
void Start_CAN0_Tx(unsigned char buffer)
{
// On Tx interrupts en CAN0
switch(buffer)
{
case 0x00:
CAN0TIER_TXEIE0=0x01; // ON Buffer 0
break;
case 0x01:
CAN0TIER_TXEIE1=0x01; // ON Buffer 1
break;
case 0x02:
CAN0TIER_TXEIE2=0x01; // ON Buffer 2
break;
case 0x03:
CAN0TIER_TXEIE0=0x01; // ON Buffer 0
CAN0TIER_TXEIE1=0x01; // ON Buffer 1
CAN0TIER_TXEIE2=0x01; // ON Buffer 2
break;
default:
break;
}
}
void Stop_CAN0_Tx(unsigned char buffer)
{
// OFF Tx Interrupts
switch(buffer)
{
case 0:
CAN0TIER_TXEIE0=0x00; // OFF Buffer 0
break;
case 1:
CAN0TIER_TXEIE1=0x00; // OFF Buffer 1
break;
case 2:
CAN0TIER_TXEIE2=0x00; // OFF Buffer 2
break;
case 3:
CAN0TIER_TXEIE0=0x00; // OFF Buffer 0
CAN0TIER_TXEIE1=0x00; // OFF Buffer 1
CAN0TIER_TXEIE2=0x00; // OFF Buffer 2
break;
default:
break;
}
}
Can anyone help me? I know these forums is the unique place in the world where I can find my solution... at least my last problems have been solved!