void CANController::handleInterrupt() { uint32_t cause = MAP_CANIntStatus(_base, CAN_INT_STS_CAUSE); if (cause == CAN_INT_INTID_STATUS) // status interrupt. error occurred? { uint32_t status = getControlRegister(); // also clears the interrupt } else if ( (cause >= 1) && (cause <= 32) ) // mailbox event { //CANIntClear(_base, cause); //_isrToThreadQueue.sendToBackFromISR(cause-1); uint8_t mobId; if (_freeSwMobs.receiveFromISR(&mobId)) { tCANMsgObject *msgobj = &_swmobs[mobId]; MAP_CANMessageGet(_base, cause, msgobj, 1); if (cause < 16+1) { // RX MOB _usedSwMobs.sendToBackFromISR(mobId); } else{ // TX MOB _freeSwMobs.sendToBackFromISR(mobId); } } else { CANIntClear(_base, cause); } } }
int platform_can_recv( unsigned id, u32 *canid, u8 *idtype, u8 *len, u8 *data ) { // wait for a message if( can_rx_flag != 0 ) { can_msg_rx.pucMsgData = data; MAP_CANMessageGet(CAN0_BASE, CAN_MSG_OBJ_RX, &can_msg_rx, 0); can_rx_flag = 0; *canid = ( u32 )can_msg_rx.ulMsgID; *idtype = ( can_msg_rx.ulFlags & MSG_OBJ_EXTENDED_ID )? ELUA_CAN_ID_EXT : ELUA_CAN_ID_STD; *len = can_msg_rx.ulMsgLen; return PLATFORM_OK; } else return PLATFORM_UNDERFLOW; }