diff --git a/FlexCAN.cpp b/FlexCAN.cpp index 7ad1312..885c6d0 100644 --- a/FlexCAN.cpp +++ b/FlexCAN.cpp @@ -142,6 +142,7 @@ int FlexCAN::read(CAN_message_t &msg) // get identifier and dlc msg.len = FLEXCAN_get_length(FLEXCAN0_MBn_CS(rxb)); msg.ext = (FLEXCAN0_MBn_CS(rxb) & FLEXCAN_MB_CS_IDE)? 1:0; + msg.rtr = (FLEXCAN0_MBn_CS(rxb) & FLEXCAN_MB_CS_RTR)? 1:0; msg.id = (FLEXCAN0_MBn_ID(rxb) & FLEXCAN_MB_ID_EXT_MASK); if(!msg.ext) { msg.id >>= FLEXCAN_MB_ID_STD_BIT_NO; @@ -213,12 +214,23 @@ int FlexCAN::write(const CAN_message_t &msg) } FLEXCAN0_MBn_WORD0(buffer) = (msg.buf[0]<<24)|(msg.buf[1]<<16)|(msg.buf[2]<<8)|msg.buf[3]; FLEXCAN0_MBn_WORD1(buffer) = (msg.buf[4]<<24)|(msg.buf[5]<<16)|(msg.buf[6]<<8)|msg.buf[7]; + if(msg.ext) { - FLEXCAN0_MBn_CS(buffer) = FLEXCAN_MB_CS_CODE(FLEXCAN_MB_CODE_TX_ONCE) - | FLEXCAN_MB_CS_LENGTH(msg.len) | FLEXCAN_MB_CS_SRR | FLEXCAN_MB_CS_IDE; + if(msg.rtr) { + FLEXCAN0_MBn_CS(buffer) = FLEXCAN_MB_CS_CODE(FLEXCAN_MB_CODE_TX_ONCE) + | FLEXCAN_MB_CS_LENGTH(msg.len) | FLEXCAN_MB_CS_SRR | FLEXCAN_MB_CS_IDE | FLEXCAN_MB_CS_RTR; + } else { + FLEXCAN0_MBn_CS(buffer) = FLEXCAN_MB_CS_CODE(FLEXCAN_MB_CODE_TX_ONCE) + | FLEXCAN_MB_CS_LENGTH(msg.len) | FLEXCAN_MB_CS_SRR | FLEXCAN_MB_CS_IDE; + } } else { - FLEXCAN0_MBn_CS(buffer) = FLEXCAN_MB_CS_CODE(FLEXCAN_MB_CODE_TX_ONCE) + if(msg.rtr){ + FLEXCAN0_MBn_CS(buffer) = FLEXCAN_MB_CS_CODE(FLEXCAN_MB_CODE_TX_ONCE) + | FLEXCAN_MB_CS_LENGTH(msg.len)| FLEXCAN_MB_CS_RTR; + } else { + FLEXCAN0_MBn_CS(buffer) = FLEXCAN_MB_CS_CODE(FLEXCAN_MB_CODE_TX_ONCE) | FLEXCAN_MB_CS_LENGTH(msg.len); + } } return 1; diff --git a/FlexCAN.h b/FlexCAN.h index 19e92e8..7c1c0dd 100644 --- a/FlexCAN.h +++ b/FlexCAN.h @@ -10,6 +10,7 @@ typedef struct CAN_message_t { uint32_t id; // can identifier uint8_t ext; // identifier is extended + uint8_t rtr; // remote transmission request packet type uint8_t len; // length of data uint16_t timeout; // milliseconds, zero will disable waiting uint8_t buf[8];