void CAN1Init(void)
{
CAN_BIT_CONFIG canBitConfig;
UINT baudPrescalar;
/*Ponemos el módulo CAN en modo configuración*/
CANEnableModule(CAN1,TRUE);
CANSetOperatingMode(CAN1, CAN_CONFIGURATION);
/*Esperamos hasta que entre en modo configuración*/
while(CANGetOperatingMode(CAN1) != CAN_CONFIGURATION);
/*Configuramos el reloj del módulo CAN*/
canBitConfig.phaseSeg2Tq = CAN_BIT_3TQ;
canBitConfig.phaseSeg1Tq = CAN_BIT_3TQ;
canBitConfig.propagationSegTq = CAN_BIT_3TQ;
canBitConfig.phaseSeg2TimeSelect = TRUE;
canBitConfig.sample3Time = FALSE;
canBitConfig.syncJumpWidth = CAN_BIT_1TQ;
CANSetSpeed(CAN1,&canBitConfig,SYSTEM_FREQ,CAN_BUS_SPEED);
/*Asignamos el tamaño del Búfer*/
CANAssignMemoryBuffer(CAN1,CAN1MessageFifoArea,(2 * 8 * 16));
/*Seleccionamos las FIFOS */
/*FIFO0 para Tx */
/*FIFO1 para Rx */
/*FIFO0 con RTR deshabilitado y prioridad baja*/
/*FIFO1 recepción del mensaje completo*/
CANConfigureChannelForTx(CAN1, CAN_CHANNEL0, 8, CAN_TX_RTR_DISABLED, CAN_LOW_MEDIUM_PRIORITY);
CANConfigureChannelForRx(CAN1, CAN_CHANNEL1, 8, CAN_RX_FULL_RECEIVE);
/*Configuramos Filtros y máscaras */
/*Filtro0 para aceptar SID 0x201 */
/*Máscara0 para comparar todos los ID */
/*El mensaje debe ser almacenado en FIFO1 */
CANConfigureFilter (CAN1, CAN_FILTER0, 0x001, CAN_SID);
CANConfigureFilterMask (CAN1, CAN_FILTER_MASK0, 0x7FC, CAN_SID, CAN_FILTER_MASK_IDE_TYPE);
CANLinkFilterToChannel (CAN1, CAN_FILTER0, CAN_FILTER_MASK0, CAN_CHANNEL1);
CANEnableFilter (CAN1, CAN_FILTER0, TRUE);
/*Habilitamos interrupciones y eventos */
/*Habilitamos la recepción si hay un evento */
/*Habilitamos la interrupción */
CANEnableChannelEvent(CAN1, CAN_CHANNEL1, CAN_RX_CHANNEL_NOT_EMPTY, TRUE);
CANEnableModuleEvent (CAN1, CAN_RX_EVENT, TRUE);
INTSetVectorPriority(INT_CAN_1_VECTOR, INT_PRIORITY_LEVEL_4);
INTSetVectorSubPriority(INT_CAN_1_VECTOR, INT_SUB_PRIORITY_LEVEL_0);
//INTEnable(INT_CAN1, INT_ENABLED);
IEC1SET = 0x04000000;
/*Ponemos el módulo CAN en modo normal */
CANSetOperatingMode(CAN1, CAN_NORMAL_OPERATION);
while(CANGetOperatingMode(CAN1) != CAN_NORMAL_OPERATION);
CANClearModuleEvent(CAN1, CAN_OPERATION_MODE_CHANGE_EVENT);
}
void __ISR (_CAN_1_VECTOR, ipl4) CAN1Interrupt(void)
{
/*Verifica si hay un evento en la recepción*/
if((CANGetModuleEvent(CAN1) & CAN_RX_EVENT) != 0)
{
/*Se podría verificar que causó el evento mediante*/
/*CANGetModuleEvent(), que devuelve el código */
/*que representa la prioridad más alta del evento */
/*pendiente */
if(CANGetPendingEventCode(CAN1) == CAN_CHANNEL1_EVENT)
{
/*Verificamos si se ha producido un evento en la FIFO1 */
/*El evento CAN_RX_CHANNEL_NOT_EMPTY es persistente */
/*Se puede leer la FIFO por la interrupción para borrar */
/*la condición de evento o deshabilitar el origen de */
/*de los eventos y hacerlo mediante una función como aquí */
CANEnableChannelEvent(CAN1, CAN_CHANNEL1, CAN_RX_CHANNEL_NOT_EMPTY, FALSE);
messageRx = (CANRxMessageBuffer *)CANGetRxMessage(CAN1,CAN_CHANNEL1);
CANUpdateChannel(CAN1, CAN_CHANNEL1);
CANClearModuleEvent (CAN1, CAN_RX_EVENT);
}
}
/*Se borra la bandera de la interrupción */
INTClearFlag(INT_CAN1);
}