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;
	}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
// ----------------------------------------------------------------------------
void sja1000_reset_bus_off(void)
{
    uint8_t status = sja1000_read(SR) & (1<<BS);
    sja1000_write(SR, status & ~(1<<BS));
}
Exemplo n.º 4
0
bool sja1000_check_bus_off(void)
{
    return (sja1000_read(SR) & (1<<BS));
}