static void can_isr_tx(uint32_t canport) { int mailbox=0; if (CAN_TSR(canport) & CAN_TSR_RQCP0) { mailbox = 0; } else if (CAN_TSR(canport) & CAN_TSR_RQCP1) { mailbox = 1; } else if (CAN_TSR(canport) & CAN_TSR_RQCP2) { mailbox = 2; } else { //LED_TGL(LED3); return; } CAN_TSR(canport) = CAN_TSR_RQCP(mailbox); struct can_message *msg = canmsg_get(); if (msg == NULL) { //LED_TGL(LED4); return; } msg->source = (mailbox << 4) | ((canport == CAN1) ? 1 : 2) | 0x08; msg->mobid = can_mailbox_get_mobid(canport, mailbox); msg->time = can_mailbox_get_timestamp(canport, mailbox); can_mailbox_read_data(canport, mailbox, msg->data, &msg->length); }
static uint32_t find_empty_mailbox(uint32_t can) { if ((CAN_TSR(can) & CAN_TSR_TME0) == CAN_TSR_TME0) { return CAN_MBOX0; } else if ((CAN_TSR(can) & CAN_TSR_TME1) == CAN_TSR_TME1) { return CAN_MBOX1; } else if ((CAN_TSR(can) & CAN_TSR_TME2) == CAN_TSR_TME2) { return CAN_MBOX2; } else { return 0; } }
bool can_interface_send_message(uint32_t id, uint8_t *message, uint8_t length, uint32_t retries) { do { can_transmit( CAN1, // canport id, // can id false, // extended id false, // request transmit length, // data length message // data ); while((CAN_TSR(CAN1) & CAN_TSR_RQCP0) == 0); if ((CAN_TSR(CAN1) & CAN_TSR_TXOK0)) { return true; // can ok } } while (retries-- > 0); return false; }