uint8_t sja1000_get_message(can_t *msg) { uint8_t frame_info; uint8_t address; // check if there is actually a message in the buffers if (!sja1000_check_message()) return FALSE; frame_info = sja1000_read(16); msg->length = frame_info & 0x0f; if (frame_info & (1<<FF)) { // read extended identifier msg->flags.extended = 1; uint32_t tmp; uint8_t *ptr = (uint8_t *) &tmp; *ptr = sja1000_read(20); *(ptr + 1) = sja1000_read(19); *(ptr + 2) = sja1000_read(18); *(ptr + 3) = sja1000_read(17); msg->id = tmp >> 3; /* equivalent to: msg->id = sja1000_read(20) >> 3; msg->id |= (uint16_t) sja1000_read(19) << 5; msg->id |= (uint32_t) sja1000_read(18) << 13; msg->id |= (uint32_t) sja1000_read(17) << 21;*/ address = 21; }
can_error_register_t sja1000_read_error_register(void) { can_error_register_t error; error.tx = sja1000_read(TXERR); error.rx = sja1000_read(RXERR); return error; }
// ---------------------------------------------------------------------------- void sja1000_reset_bus_off(void) { uint8_t status = sja1000_read(SR) & (1<<BS); sja1000_write(SR, status & ~(1<<BS)); }
bool sja1000_check_bus_off(void) { return (sja1000_read(SR) & (1<<BS)); }