Ese es uno de mis problemas:
Si no te importa mirar esto:
Esta es mi inicializacion del can:
CAN1SetOperationMode(CAN_IDLE_CON & CAN_MASTERCLOCK_1 & CAN_REQ_OPERMODE_CONFIG & CAN_CAPTURE_DIS);
// Baud preescale con Fcy 6,144 sin PLL -> baud rate = 5,144
// Baud preescale con Fcy 6,144 con PLLx4 -> baud rate = 23.576
CAN1Initialize(CAN_SYNC_JUMP_WIDTH2 & CAN_BAUD_PRE_SCALE(23), CAN_WAKEUP_BY_FILTER_DIS & CAN_PROPAGATIONTIME_SEG_TQ(4) & CAN_PHASE_SEG1_TQ(4) & CAN_PHASE_SEG2_TQ(5) & CAN_SEG2_FREE_PROG & CAN_SAMPLE1TIME);
// Cargamos el filtro de aceptación de registro.
CAN1SetFilter(0, CAN_FILTER_SID(0) & CAN_RX_EID_EN, CAN_FILTER_EID(0));
// Cargamos la mascara del filtro del registro.
CAN1SetMask(0, CAN_MASK_SID(0) & CAN_MATCH_FILTER_TYPE, CAN_MASK_EID(0));
// Configuramos los modos de transmisión y recepción
CAN1SetTXMode(0, CAN_TX_STOP_REQ & CAN_TX_PRIORITY_HIGH );
CAN1SetRXMode(0, CAN_RXFUL_CLEAR & CAN_BUF0_DBLBUFFER_EN);
CAN1SetOperationMode(CAN_IDLE_CON & CAN_MASTERCLOCK_1 & CAN_REQ_OPERMODE_NOR & CAN_CAPTURE_DIS );
ConfigIntCAN1(0x3F, CAN_INT_PRI_5 & CAN_INT_ENABLE);
Recibo en este vector de interrupción:
oid _ISR _C1Interrupt(void){
C1EC = 0; // Ponemos a cero los contadores de error
C1INTF = 0; // Deshabilito las interrupciones
IFS1bits.C1IF = 0; // Borro el flag de la interrupción
if((C1INTFbits.TXEP)||(C1INTFbits.RXEP)){
//C1CTRLbits.ABAT = 1;
C1CTRL |= 0x400;
while((C1CTRL & 0x80) == 0);
C1CTRL &= 0xF800;
}
if(!C1TX0CONbits.TXREQ){
// Buffer 0 está vacio y preparado para la siguiente transmisión.
}
if (C1RX0CONbits.RXFUL){
// Mensaje completo en el buffer 0, listo para ser procesado.
C1RX0CONbits.RXFUL = 0; // Vaciamos el buffer 0.
}
}
Y envio así (es una prueba)
void SendBUSCAN(void){
char * data;
data = "Microchip";
CAN1SendMessage((CAN_TX_SID(0)) & CAN_TX_EID_EN & CAN_SUB_NOR_TX_REQ, (CAN_TX_EID(0)) & CAN_NOR_TX_REQ, data, 8, 0);
while(CAN1IsTXReady(0) == 0){ // Mientras aun no este preparado para la transmisión....
asm("clrwdt");
}
}
De momento pongo filtro y mascara a 0, las dudas que tengo son:
1 Para que sirve CAN_CAPTURE
2 Que es CAN_SYNC_JUMP_WIDTHN
3 Que es CAN_PROPAGATIONTIME_SEG_TQ(N)
4 Que es CAN_PHASE_SEG1_TQ(N)
5 Que es CAN_PHASE_SEG2_TQ(N)
6 Que es CAN_SEG2_FREE_PROG
7 Que es CAN_SAMPLE1TIME
(De la inicializacion no me entero de el significado de casi ningún campo ni mirandolo en el datasheet)
Y por ultimo como se el identificador de un dispositivo o como lo asigno y como envio a un dispositivo en concreto ?