Description
Source
Call Graph
Start Line: 959
unsigned char CAN_Init(unsigned int baudrate, CanTransfer *canTransferRead, CanTransfer *canTransferWrite)
{
unsigned char ret;
// CAN Transmit Serial Data
#if defined (PINS_CAN_TRANSCEIVER_TXD)
PIO_Configure(pins_can_transceiver_txd, PIO_LISTSIZE(pins_can_transceiver_txd));
#endif
#if defined (PINS_CAN_TRANSCEIVER_RXD)
// CAN Receive Serial Data
PIO_Configure(pins_can_transceiver_rxd, PIO_LISTSIZE(pins_can_transceiver_rxd));
#endif
// CAN RS
PIO_Configure(&pin_can_transceiver_rs, PIO_LISTSIZE(pin_can_transceiver_rs));
#if defined (PIN_CAN_TRANSCEIVER_RXEN)
// CAN RXEN
PIO_Configure(&pin_can_transceiver_rxen, PIO_LISTSIZE(pin_can_transceiver_rxen));
#endif
// Enable clock for CAN PIO
#if defined(AT91C_ID_PIOA)
AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_PIOA);
#elif defined(AT91C_ID_PIOABCD)
AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_PIOABCD);
#elif defined(AT91C_ID_PIOABCDE)
AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_PIOABCDE);
#endif
// Enable the CAN0 controller peripheral clock
AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_CAN0);
// disable all IT
AT91C_BASE_CAN0->CAN_IDR = 0x1FFFFFFF;
// Enable CANs Transceivers
#if defined (PIN_CAN_TRANSCEIVER_RXEN)
// Disable ultra Low Power mode
PIO_Set(&pin_can_transceiver_rxen);
#endif
// Normal Mode (versus Standby mode)
PIO_Clear(&pin_can_transceiver_rs);
// Configure the AIC for CAN interrupts
AIC_ConfigureIT(AT91C_ID_CAN0, AT91C_AIC_PRIOR_HIGHEST, CAN0_Handler);
// Enable the interrupt on the interrupt controller
AIC_EnableIT(AT91C_ID_CAN0);
if( CAN_BaudRateCalculate(AT91C_BASE_CAN0, baudrate) == 0 ) {
// Baudrate problem
TRACE_DEBUG("Baudrate CAN0 problem\n\r");
return 0;
}
pCAN0Transfer = canTransfer0;
#if defined AT91C_BASE_CAN1
if( canTransfer1 != NULL ) {
pCAN1Transfer = canTransfer1;
// Enable CAN1 Clocks
AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_CAN1);
// disable all IT
AT91C_BASE_CAN1->CAN_IDR = 0x1FFFFFFF;
// Configure the AIC for CAN interrupts
AIC_ConfigureIT(AT91C_ID_CAN1, AT91C_AIC_PRIOR_HIGHEST, CAN1_Handler);
// Enable the interrupt on the interrupt controller
AIC_EnableIT(AT91C_ID_CAN1);
if( CAN_BaudRateCalculate(AT91C_BASE_CAN1, baudrate) == 0 ) {
// Baudrate problem
TRACE_DEBUG("Baudrate CAN1 problem\n\r");
return 0;
}
}
#endif
// Reset all mailbox
CAN_ResetAllMailbox();
// Enable the interrupt with all error cases
AT91C_BASE_CAN0->CAN_IER = AT91C_CAN_CERR // (CAN) CRC Error
| AT91C_CAN_SERR // (CAN) Stuffing Error
| AT91C_CAN_BERR // (CAN) Bit Error
| AT91C_CAN_FERR // (CAN) Form Error
| AT91C_CAN_AERR; // (CAN) Acknowledgment Error
#if defined AT91C_BASE_CAN1
if( canTransfer1 != NULL ) {
AT91C_BASE_CAN1->CAN_IER = AT91C_CAN_CERR // (CAN) CRC Error
| AT91C_CAN_SERR // (CAN) Stuffing Error
| AT91C_CAN_BERR // (CAN) Bit Error
| AT91C_CAN_FERR // (CAN) Form Error
| AT91C_CAN_AERR; // (CAN) Acknowledgment Error
}
#endif
// Wait for CAN synchronisation
if( CAN_Synchronisation( ) == 1 ) {
ret = 1;
}
else {
ret = 0;
}
return ret;
}