Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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;
	}
}
Ejemplo n.º 3
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;
}