Exemplo n.º 1
0
// -------------------------------------------------------------
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;
  }
Exemplo n.º 2
0
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;
    }
Exemplo n.º 3
0
// -------------------------------------------------------------
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;
  }
Exemplo n.º 4
0
//============================================================================
//函数名称: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; // 获得标准帧号
    }