bool can_interface_read_message(uint32_t *id, uint8_t *message, uint8_t *length, uint32_t retries) { uint32_t fid; uint8_t len; bool ext, rtr; while(retries-- != 0 && (CAN_RF0R(CAN1) & CAN_RF0R_FMP0_MASK) == 0); if ((CAN_RF0R(CAN1) & CAN_RF0R_FMP0_MASK) == 0) { return false; } can_receive( CAN1, // canport 0, // fifo true, // release id, // can id &ext, // extended id &rtr, // transmission request &fid, // filter id &len, // length message ); *length = len; return true; }
int aseba_can_receive(uint16_t *msg) { if (CAN_RF0R(CAN1) & CAN_RF0R_FMP0_MASK) { uint32_t id, fmi; bool ext, rtr; uint8_t length; uint8_t data[8]; can_receive(CAN1, 0, true, &id, &ext, &rtr, &fmi, &length, data); // uart_puts("can message received\n"); if (length % 2 != 0) { return -1; } // if ((id & 0x300) != ASEBA_TYPE_SMALL_PACKET) { // return -1; // } int aseba_length = length / 2; int i; for (i = 0; i < aseba_length; i++) { msg[i] = data[i*2] + (data[i*2 + 1]<<8); // aseba data is little endian } return aseba_length; } else { return -1; } }