+ // RTR frame
+ if(can_read_reg(chip, CAN_RFS_o) & CAN_RFS_RTR)
+ msg->flags |= MSG_RTR;
+ else
+ msg->flags &= ~MSG_RTR;
+
+
+ // read data
+ data = can_read_reg(chip, CAN_RDA_o);
+ for(i=0; i<4; i++)
+ msg->data[i] = (data>>(i*8)) & 0xFF;
+
+ data = can_read_reg(chip, CAN_RDB_o);
+ for(i=4; i<8; i++)
+ msg->data[i] = (data>>((i-4)*8)) & 0xFF;
+
+}
+
+void CAN_send(struct canchip_t *chip, canmsg_t* msg){
+
+ volatile uint32_t data;
+ volatile uint32_t can_tfi1;
+ uint32_t i;
+
+ // check status of TB1
+ while (!(can_read_reg(chip, CAN_SR_o) & CAN_SR_TBS1)){}
+
+ can_tfi1 = can_read_reg(chip, CAN_TFI1_o);
+
+ can_tfi1 &= ~0x000F0000;
+ can_tfi1 |= (msg->length)<<16;