⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jtransp.c

📁 在Freescale16位单片机MC9s12dp256上移植了J1939源码和操作系统(ucOSII)。
💻 C
📖 第 1 页 / 共 2 页
字号:
*/
void HandleRxTransportDataPG(void)
{
  unsigned char i, j;
  unsigned char rem;

  /* Search open channel */
  for (i=0; i<NR_OF_TP_CH; i++)
  {
    /* Broadcast announce message */
    if ((gTPRxCnxn[i].mState==BAM_RX_STATE_DATA) &&  /* is channel open BAM */
        (gTPRxCnxn[i].mSource==gRxPGTable[RX_PGN_TPDT].mSource) && /* check source address */
        ((gRxPGTable[RX_PGN_TPDT].mPDUS==gDeviceAddress) || /* check dest. address = my addr or */  
         (gRxPGTable[RX_PGN_TPDT].mPDUS==J1939GLOBALADDRESS))) /* global addr. */   
    {
      /* Received sequence */
      if ((gTPRxCnxn[i].mSequence) == ((struct VJ1939PGN_DATA_EB00*)gRxPGTable[RX_PGN_TPDT].mData)->mSequence)
      {
        /* now copy data */
        if (gTPRxCnxn[i].mSequence==gTPRxCnxn[i].mPackets) /* last packet */
        {
          /* get the reminder to set the last bytes of the secuence */
          rem = (gTPRxCnxn[i].mBytes % 7)?(gTPRxCnxn[i].mBytes % 7):7;

          for (j=0; j<rem ;j++)
          {
            *((unsigned char*)gRxPGTable[gTPRxCnxn[i].mRxPGTable].mData + ((gTPRxCnxn[i].mSequence-1)*7+j)) = ((struct VJ1939PGN_DATA_EB00*)gRxPGTable[RX_PGN_TPDT].mData)->mData[j];
          }
          gRxPGTable[gTPRxCnxn[i].mRxPGTable].mPGState = PG_RX_FULL;  /* PG alread received */
          gTPRxCnxn[i].mState = BAM_STATE_CLOSE; /* release channel */
          break;
        }
        else /* next packet */
        {
          /* o.k. copy data */
          for (j=0; j<7; j++)
          {
            *((unsigned char*)gRxPGTable[gTPRxCnxn[i].mRxPGTable].mData + ((gTPRxCnxn[i].mSequence-1)*7+j)) = ((struct VJ1939PGN_DATA_EB00*)gRxPGTable[RX_PGN_TPDT].mData)->mData[j];
          }
          gTPRxCnxn[i].mSequence++; /* next packet received */
          gTPRxCnxn[i].mTimer = Tim_GetCurrentTime(); /* set timer to 250ms timeout */
          break;
        }        
      }
      else if ((gTPRxCnxn[i].mSequence+1) != ((struct VJ1939PGN_DATA_EB00*)gRxPGTable[RX_PGN_TPDT].mData)->mSequence)
      {
        gTPRxCnxn[i].mState = BAM_STATE_CLOSE; /* release channel */
        break;
      }
      break;
    }
    /* Connection mode data transfer */
    else if ((gTPRxCnxn[i].mState==CMDT_RX_STATE_DATA) && /* is channel open in connection mode data transfer */
             (gTPRxCnxn[i].mSource==gRxPGTable[RX_PGN_TPDT].mSource) && /* check source address */
             (gRxPGTable[RX_PGN_TPDT].mPDUS==gDeviceAddress)) /* check dest. address = my addr */    
    {
      /* Received sequence */
      if ((gTPRxCnxn[i].mSequence) == ((struct VJ1939PGN_DATA_EB00*)gRxPGTable[RX_PGN_TPDT].mData)->mSequence)
      {
        if (gTPRxCnxn[i].mSequence==gTPRxCnxn[i].mPackets) /* last packet(fragment) */
        {
          rem = (gTPRxCnxn[i].mBytes % 7)?(gTPRxCnxn[i].mBytes % 7):7;

          /* now copy received data not neccesarily 7 bytes*/
          for (j=0; j<rem;j++)
          {
            *((unsigned char*)gRxPGTable[gTPRxCnxn[i].mRxPGTable].mData + ((gTPRxCnxn[i].mSequence-1)*7+j)) = ((struct VJ1939PGN_DATA_EB00*)gRxPGTable[RX_PGN_TPDT].mData)->mData[j];
          }

          /* Send End of message acknowledge */
          ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mControl = TPCM_EndOfMsgAck;
          ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mBytesLsb = (gTPRxCnxn[i].mBytes & 0xFF); 
          ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mBytesMsb = (gTPRxCnxn[i].mBytes >> 8);
          ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPackets = gTPRxCnxn[i].mSequence;
          ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mReserved = 0xFF;
          if(gRxPGTable[gTPRxCnxn[i].mRxPGTable].mPDUF > 239)
          ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGNlsb = gRxPGTable[gTPRxCnxn[i].mRxPGTable].mPDUS;
          else
          ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGNlsb = 0;
          ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGN = gRxPGTable[gTPRxCnxn[i].mRxPGTable].mPDUF;
          ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGNmsb = 0;
          gTxPGTable[TX_PGN_TPCM].mSource = gDeviceAddress; /* source addr. */
          gTxPGTable[TX_PGN_TPCM].mPDUS = gTPRxCnxn[i].mSource; /* dest. addr. */
          gTxPGTable[TX_PGN_TPCM].mPGState = PG_TX_REQ; /* ready to transmit */
          gRxPGTable[gTPRxCnxn[i].mRxPGTable].mPGState = PG_RX_FULL;  /* PG alread received */
          gTPRxCnxn[i].mState = CMDT_STATE_CLOSE; /* release channel */
          break;
        }
        else /* middle or first packet */
        {
          /* o.k. copy 7 databytes */
          for (j=0; j<7; j++)
          {
            *((unsigned char*)gRxPGTable[gTPRxCnxn[i].mRxPGTable].mData + ((gTPRxCnxn[i].mSequence-1)*7+j)) = ((struct VJ1939PGN_DATA_EB00*)gRxPGTable[RX_PGN_TPDT].mData)->mData[j];
          }
          gTPRxCnxn[i].mSequence++; /* next packet received */
          /*gTPRxCnxn[i].mState = CMDT_RX_STATE_OPEN;*/
          gTPRxCnxn[i].mTimer = Tim_GetCurrentTime(); /* set timer to 1250ms timeout */
            
          if ((gTxPGTable[TX_PGN_TPCM].mPGState == PG_TX_FREE) || (gTxPGTable[TX_PGN_TPCM].mPGState == PG_TX_TX))
          {
            ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mControl = TPCM_CTS;
            ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mBytesMsb = gTPRxCnxn[i].mSequence; /* start with first packet */
            ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mBytesLsb = 1; /* send next packet */
            ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPackets = 0xFF;
            ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mReserved = 0xFF;
            if(gRxPGTable[gTPRxCnxn[i].mRxPGTable].mPDUF > 239)
              ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGNlsb = gRxPGTable[gTPRxCnxn[i].mRxPGTable].mPDUS;
            else
              ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGNlsb = 0;
            ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGN = gRxPGTable[gTPRxCnxn[i].mRxPGTable].mPDUF;
            ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGNmsb = 0;
            gTxPGTable[TX_PGN_TPCM].mSource = gDeviceAddress; /* source addr. */
            gTxPGTable[TX_PGN_TPCM].mPDUS = gTPRxCnxn[i].mSource; /* dest. addr. */
            gTPRxCnxn[i].mState = CMDT_RX_STATE_DATA;
            gTxPGTable[TX_PGN_TPCM].mPGState = PG_TX_REQ; /* ready to transmit */
          }
          else 
          {
            /* should not happend, not implemented */
          }            
          break;
        }        
      }
      else if ((gTPRxCnxn[i].mSequence+1) != ((struct VJ1939PGN_DATA_EB00*)gRxPGTable[RX_PGN_TPDT].mData)->mSequence)
      {
        /* Send Abort */
        ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mControl = TPCM_ABORT; /*TPCM_EndOfMsgAck*/
        ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mBytesLsb = 0xFF; /* reserved */
        ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mBytesMsb = 0xFF; /* reserved */
        ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPackets = 0xFF; /* reserved */
        ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mReserved = 0xFF;
        ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGNlsb = gRxPGTable[gTPRxCnxn[i].mRxPGTable].mPDUS;
        ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGN = gRxPGTable[gTPRxCnxn[i].mRxPGTable].mPDUF;
        ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGNmsb = 0;
        gTxPGTable[TX_PGN_TPCM].mSource = gDeviceAddress; /* source addr. */
        gTxPGTable[TX_PGN_TPCM].mPDUS = gTPRxCnxn[i].mSource; /* dest. addr. */
        gTxPGTable[TX_PGN_TPCM].mPGState = PG_TX_REQ; /* ready to transmit */

        gTPRxCnxn[i].mState = CMDT_STATE_CLOSE; /* release channel */
        break;
      }
    }
  }
}

/*!
  \brief Initializer for TX CMDT Protocol

  \param i - Table index of the TX PG table
*/
void OpenTxCMDTTransport(unsigned char i)
{
 if ((gTPTxCnxn.mState == CMDT_STATE_CLOSE) && ((gTxPGTable[TX_PGN_TPCM].mPGState == PG_TX_FREE)||(gTxPGTable[TX_PGN_TPCM].mPGState == PG_TX_TX))
     && (gTxPGTable[i].mDataLength <= MAX_TP_DATA_LENGTH))
 {
   /* Initialize transport struct */
   gTPTxCnxn.mState = CMDT_TX_STATE_OPEN; /* release channel */
   gTPTxCnxn.mSource = gTxPGTable[i].mPDUS; /*!!changed!! [i].mPriority; *//* dest. address */
   gTPTxCnxn.mBytes =  gTxPGTable[i].mDataLength; /* total number of bytes */
   gTPTxCnxn.mSequence = 1; /* actual sequence number */
   gTPTxCnxn.mPackets = (gTPTxCnxn.mBytes / 7) + ((gTPTxCnxn.mBytes % 7)?1:0); /* total number of packets */
   gTPTxCnxn.mPToSend = 0; /* packets to send/receive between CTS */
   gTPTxCnxn.mRxPGTable = i;  /* PG receive table */

   /* Send RTS */
   ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mControl = TPCM_RTS;
   ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mBytesLsb = (unsigned char)(gTPTxCnxn.mBytes & 0xFF); 
   ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mBytesMsb = (unsigned char)(gTPTxCnxn.mBytes >> 8);
   ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPackets = gTPTxCnxn.mPackets;
   ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mReserved = 0xFF;
   ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGNlsb = 0; /* !!changed!!*//*gTxPGTable[gTPTxCnxn.mRxPGTable].mPDUS;*/
   ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGN = gTxPGTable[gTPTxCnxn.mRxPGTable].mPDUF;
   ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGNmsb = 0;
   gTxPGTable[TX_PGN_TPCM].mSource = gDeviceAddress; /* source addr. */
   gTxPGTable[TX_PGN_TPCM].mPDUS = gTPTxCnxn.mSource; /* dest. addr. */
   gTxPGTable[TX_PGN_TPCM].mPGState = PG_TX_REQ; /* ready to transmit */

   gTPTxCnxn.mState = CMDT_TX_STATE_OPEN; /* release channel */
   gTPTxCnxn.mTimer = Tim_GetCurrentTime();     /* timer for timeout = 1250ms*/
 }
}

/*!
  \brief Initializer for TX BAM Protocol
  \param   i - Table index of the TX PG table
*/
void OpenTxBAMTransport(unsigned char i)
{
 if ((gTPTxCnxn.mState == BAM_STATE_CLOSE) && ((gTxPGTable[TX_PGN_TPCM].mPGState == PG_TX_FREE) || ((gTxPGTable[TX_PGN_TPCM].mPGState == PG_TX_TX)))
     && (gTxPGTable[i].mDataLength <= MAX_TP_DATA_LENGTH))
 {
   /* Initialize transport struct */
   gTPTxCnxn.mSource = J1939GLOBALADDRESS; /*!!changed!! gTxPGTable[i].mPriority;*/ /* dest. address */
   gTPTxCnxn.mBytes = gTxPGTable[i].mDataLength; /* total number of bytes */
   gTPTxCnxn.mSequence = 1; /* actual sequence number */
   gTPTxCnxn.mPackets = (gTPTxCnxn.mBytes / 7) + ((gTPTxCnxn.mBytes % 7)?1:0); /* total number of packets */
   gTPTxCnxn.mPToSend = 0; /* packets to send/receive between CTS */
   gTPTxCnxn.mRxPGTable = i;  /* PG receive table */

   /* Send BAM */
   ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mControl = TPCM_BAM;
   ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mBytesLsb = (unsigned char)(gTPTxCnxn.mBytes & 0xFF); 
   ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mBytesMsb = (unsigned char)(gTPTxCnxn.mBytes >> 8);
   ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPackets = gTPTxCnxn.mPackets;
   ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mReserved = 0xFF;
   ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGNlsb = gTxPGTable[gTPTxCnxn.mRxPGTable].mPDUS;
   ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGN = gTxPGTable[gTPTxCnxn.mRxPGTable].mPDUF;
   ((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGNmsb = 0;
   gTxPGTable[TX_PGN_TPCM].mSource = gDeviceAddress; /* source addr. */
   gTxPGTable[TX_PGN_TPCM].mPDUS = gTPTxCnxn.mSource; /* dest. addr. */
   gTxPGTable[TX_PGN_TPCM].mPGState = PG_TX_REQ; /* ready to transmit */
   
   gTPTxCnxn.mState = BAM_TX_STATE_WAIT; /* release channel */
   gTPTxCnxn.mTimer = Tim_GetCurrentTime();    /* timer for timeout = 50ms*/
 }
}

/*!
  \file
  \brief Basic routines for the J1939 transport protocols BAM (Broadcast Announce Message)
         and CMDT (Connection Mode Data Transfer).
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -