// ------------------------------------------------------------- CAN_Frame CAN_K2X::read() { unsigned long int startMillis; CAN_Frame msg; msg.timeout = CAN_TIMEOUT_T3; startMillis = msg.timeout ? millis() : 0; while ( !available() ) { if ( !msg.timeout || (msg.timeout <= (millis() - startMillis)) ) { // early EXIT nothing here msg.valid = false; return msg; } yield(); } // get identifier and dlc msg.length = FLEXCAN_get_length(FLEXCAN0_MBn_CS(rxb)); msg.extended = (FLEXCAN0_MBn_CS(rxb) & FLEXCAN_MB_CS_IDE) ? 1 : 0; msg.id = (FLEXCAN0_MBn_ID(rxb) & FLEXCAN_MB_ID_EXT_MASK); if (!msg.extended) { msg.id >>= FLEXCAN_MB_ID_STD_BIT_NO; }
void FlexCAN::readRxRegisters (CAN_message_t& msg, uint8_t buffer) { uint32_t mb_CS = FLEXCANb_MBn_CS(flexcanBase, buffer); // get identifier and dlc msg.len = FLEXCAN_get_length (mb_CS); msg.flags.extended = (mb_CS & FLEXCAN_MB_CS_IDE) ? 1:0; msg.flags.remote = (mb_CS & FLEXCAN_MB_CS_RTR) ? 1:0; msg.timestamp = FLEXCAN_get_timestamp (mb_CS); msg.flags.overrun = 0; msg.flags.reserved = 0; msg.id = (FLEXCANb_MBn_ID(flexcanBase, buffer) & FLEXCAN_MB_ID_EXT_MASK); if (!msg.flags.extended) { msg.id >>= FLEXCAN_MB_ID_STD_BIT_NO; }
// ------------------------------------------------------------- int FlexCAN::read(CAN_message_t &msg) { unsigned long int startMillis; startMillis = msg.timeout? millis() : 0; while( !available() ) { if ( !msg.timeout || (msg.timeout<=(millis()-startMillis)) ) { // early EXIT nothing here return 0; } yield(); } // 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.id = (FLEXCAN0_MBn_ID(rxb) & FLEXCAN_MB_ID_EXT_MASK); if(!msg.ext) { msg.id >>= FLEXCAN_MB_ID_STD_BIT_NO; }
//============================================================================ //函数名称:CANRecData //函数返回:0:成功,1:失败 //参数说明:CANChannel:CAN模块号 // iMB:缓冲区号 // id: ID号 // lenght:数据长度 // Data[8]: 和接收数据缓冲区 //功能概要:接收数据 //============================================================================ uint8 CANRecData(uint8 CANChannel,uint16 iMB, uint32 *id,uint8 *Datalenght,uint8 Data[]) { int8 i,wno,bno; uint16 code; uint8 *pMBData; int16 length; int8 format; uint8 *pBytes = Data; CAN_MemMapPtr CANBaseAdd; if(CANChannel == 0) CANBaseAdd = CAN0_BASE_PTR; else if(CANChannel == 1) CANBaseAdd = CAN1_BASE_PTR; // 锁定MB code = FLEXCAN_get_code(CANBaseAdd->MB[iMB].CS); if(code != 0x02)//缓冲区没有接收到数据,返回错误 { *Datalenght = 0; return 1; } length = FLEXCAN_get_length(CANBaseAdd->MB[iMB].CS); if(length <1)//接收到的数据长度小于1,返回错误 { *Datalenght = 0; return 1; } //判断是标准帧还是扩展帧 format = (CANBaseAdd->MB[iMB].CS & FLEXCAN_MB_CS_IDE)? 1:0; *id = (CANBaseAdd->MB[iMB].ID & FLEXCAN_MB_ID_EXT_MASK); if(!format) { *id >>= FLEXCAN_MB_ID_STD_BIT_NO; // 获得标准帧号 }