Hi Folks!. i been working for a while with a JM128 Coldfire V1 microcontroller. this time, i need to talk with a MPPT module that uses CAN to send telemetry information (temperature, current, voltage, etc.). i used as template a CAN library made to HCS08 microcontrollers. if i made polling over nodes ID, i can get the whole think work flawless. but, this MPPT module needs a remote frame request to send its data trought the bus.
how can i get this to work? its just as easy as setting RTR bit to 1?
this is my routine.
CAN initialization routine (using 12Mhz external oscillator, i get 10.66 us bit time or 93.75kbits/s of baudrate.)
void CAN_Init(unsigned char loopback){
CANCTL0 |= CANCTL0_INITRQ_MASK; // Solicitud para entrar en modo Inicialización.
while(!CANCTL1_INITAK); // Espere hasta que entre en modo Inicializacion
if(loopback & 0x01 == 0x01){
CANCTL1 = CANCTL1_CANE_MASK | CANCTL1_LOOPB_MASK; //Si está activado modo LoopBack.
}
else{
CANCTL1 = CANCTL1_CANE_MASK; //Modo normal activado
}
CANBTR0 = 0xC7; // Ajuste el preescaler del modulo.
// One sample per bit, TSEG1 = 10, and TSEG2 = 3.
// CANBTR1 = 0x3A;
CANBTR1_SAMP = 0;
CANBTR1_TSEG_10 = 10;
CANBTR1_TSEG_20 = 3;
CANIDAC = 0x10; // seleccione cuatro filtros de 16 bits.
CANIDAR0 = 0x00; // Borre los registros de filtros.
CANIDAR1 = 0x00;
CANIDAR2 = 0x00;
CANIDAR3 = 0x00;
CANIDAR4 = 0x00;
CANIDAR5 = 0x00;
CANIDAR6 = 0x00;
CANIDAR7 = 0x00;
CANIDMR0 = 0xff; // Acepte todos los mensajes de entrada
CANIDMR1 = 0xff;
CANIDMR2 = 0xff;
CANIDMR3 = 0xff;
CANIDMR4 = 0xff;
CANIDMR5 = 0xff;
CANIDMR6 = 0xff;
CANIDMR7 = 0xff;
CANCTL0 &= ~CANCTL0_INITRQ_MASK; // Solicitar salida del modo de inicializacion.
while(CANCTL1_INITAK); // espere hasta que MSCAN entre en modo normal
while(!CANCTL0_SYNCH); // espere hasta que MSCAN se sincronice con bus.
// Reset the receiver wake-up, CAN status change, overrun,
// and receiver full interrupt flags.
CANRFLG |= CANRFLG_WUPIF_MASK;
CANRFLG |= CANRFLG_CSCIF_MASK;
CANRFLG |= CANRFLG_OVRIF_MASK;
CANRFLG |= CANRFLG_RXF_MASK;
// Enable the receive buffer full interrupt.
CANRIER |= CANRIER_RXFIE_MASK;
}
CAN Send routine:
unsigned char CAN_Send(unsigned long id, unsigned char priority, unsigned char length, unsigned char *txdata) {
unsigned char index;
unsigned char txbuffer = {0};
if(!CANTFLG){ // Están llenos los buses de salida???
return CAN_BUFFER_FULL;
}
CANTBSEL = CANTFLG; // Seleccione el buffer numerado más pequeño
txbuffer = CANTBSEL;
CANTIDR0 = (id >> 3) & 0xff; // Cargue el identificador en los registros IDR.
CANTIDR1 = (id & 0x07) << 5;
/************/
CANTIDR3_RTR=1;
/***********/
for(index = 0; index < length; index++) { //Cargue el dato en el buffer de datos.
*(&CANTDSR0 + index) = txdata[index];
}
CANTDLR = length; //ajuste la longitud del mensaje
CANTTBPR = priority; // ajuste la prioridad del mensaje
CANTFLG = txbuffer; //Baje la bandera de transmision del buffer. 1= baja bandera.
while((CANTFLG & txbuffer) != txbuffer); //espere hasta que se transmita el dato.
return CAN_NO_ERROR; //si el mensaje llegó, avise que no hubo error.
}
any help?
regards;
Mauricio