struct CAN_MSG { uint32_t id; uint8_t eff; // 1 für EFF message uint8_t rtr; // 1 für remote transmission request uint8_t length; uint8_t data [8]; }; struct CAN_MSG sja1000_read_msg(void) { uint8_t start_address = 16; uint8_t buffer; struct CAN_MSG msg; buffer = sja1000_low_level_read(start_address++); if (buffer & (1<<7)) msg.eff = 1; else msg.eff = 0; if (buffer & (1<<6)) msg.rtr = 1; else msg.rtr = 0; msg.length = buffer & 0x0F; if (msg.eff) { msg.id = ((uint32_t)(sja1000_low_level_read(start_address++)))<<24; msg.id |= ((uint32_t)(sja1000_low_level_read(start_address++)))<<16; msg.id |= ((uint32_t)(sja1000_low_level_read(start_address++)))<<8; msg.id |= ((uint32_t)(sja1000_low_level_read(start_address++))); msg.id = msg.id>>3; } else { msg.id = ((uint32_t)(sja1000_low_level_read(start_address++)))<<8; msg.id |= ((uint32_t)(sja1000_low_level_read(start_address++))); msg.id = msg.id>>5; } for (uint8_t i=0; ieff<<7) | (msg->rtr<<6) | (msg->length)); if (msg->eff) { // Ist es ne EFF Message? sja1000_low_level_write(start_address++, (uint8_t)((msg->id<<3)>>24)); sja1000_low_level_write(start_address++, (uint8_t)((msg->id<<3)>>16)); sja1000_low_level_write(start_address++, (uint8_t)((msg->id<<3)>>8)); sja1000_low_level_write(start_address++, (uint8_t)((msg->id<<3)|(msg->rtr<<2))); } else { sja1000_low_level_write(start_address++, (uint8_t)((msg->id<<5)>>8)); sja1000_low_level_write(start_address++, ((uint8_t)(msg->id<<5))|(msg->rtr<<4)); } for (uint8_t i=0; ilength; i++) sja1000_low_level_write(start_address++, msg->data[i]); sja1000_low_level_write(1, 1<<0); // sende die Nachricht auf den Bus; <<4 für self reception request }