Example #1
0
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);
		}
	}
}
Example #2
0
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;
}