Esempio n. 1
0
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;
    }
}