亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? stm32f_usb.c

?? STM32F RFID通訊源代碼(支持雙向發送接收)
?? C
?? 第 1 頁 / 共 5 頁
字號:
    }
    else if(EpState.STATTX == EP_VALID)
    {
      // Data sending in progress
      return(USB_OK);
    }
    // Get is smaller of user buffer and received data.
    SizeHold = MIN(EpInfo[EndPoint].MaxSize,ActSize);
    WriteEpDTB_CountTx(EpInfo[EndPoint].EpSlot,SizeHold);
    pDst = (pInt32U)__Offset2Addr_PackMem(ReadEpDTB_AddrTx(EpInfo[EndPoint].EpSlot));
    for (Count = 0; Count < SizeHold; ++Count)
    {
      Temp  = *pData++;
      if (++Count < SizeHold)
      {
        Temp |= (*pData++) << 8;
      }
      *pDst++ = Temp;
    }
    // Validate buffer
    EpCtrlSet_STAT_TX(EpInfo[EndPoint].pEpCtrl,EP_VALID);
    break;
  case EP_CTRL:
    if(EpState.STATTX == EP_VALID)
    {
      // Data sending in progress
      return(USB_OK);
    }
    // Get smaller of the user buffer and the received data.
    SizeHold = MIN(EpInfo[EndPoint].MaxSize,ActSize);
    WriteEpDTB_CountTx(EpInfo[EndPoint].EpSlot,SizeHold);
    pDst = (pInt32U)__Offset2Addr_PackMem(ReadEpDTB_AddrTx(EpInfo[EndPoint].EpSlot));
    for (Count = 0; Count < SizeHold; ++Count)
    {
      Temp  = *pData++;
      if (++Count < SizeHold)
      {
        Temp |= (*pData++) << 8;
      }
      *pDst++ = Temp;
    }
    // Validate buffer
    EpCtrlSet_STAT_TX(EpInfo[EndPoint].pEpCtrl,EP_VALID);
    break;
  case EP_ISO:
    if(EpState.DTOGTX)
    {
      // Tx Buffer
      pDst = (pInt32U)__Offset2Addr_PackMem(ReadEpDTB_AddrTx(EpInfo[EndPoint].EpSlot));
      // Get smaller of the user buffer and the received data.
      SizeHold = MIN(EpInfo[EndPoint].MaxSize,SizeHold);
      for (Count = 0; Count < SizeHold; ++Count)
      {
        Temp  = *pData++;
        if (++Count < SizeHold)
        {
          Temp |= (*pData++) << 8;
        }
        *pDst++ = Temp;
      }
      WriteEpDTB_CountTx(EpInfo[EndPoint].EpSlot,SizeHold);
    }
    else
    {
      // Rx Buffer
      pDst = (pInt32U)__Offset2Addr_PackMem(ReadEpDTB_AddrRx(EpInfo[EndPoint].EpSlot));
      // Get smaller of the user buffer and the received data.
      SizeHold = MIN(EpInfo[EndPoint].MaxSize,SizeHold);
      for (Count = 0; Count < SizeHold; ++Count)
      {
        Temp  = *pData++;
        if (++Count < SizeHold)
        {
          Temp |= (*pData++) << 8;
        }
        *pDst++ = Temp;
      }
      WriteEpDTB_CountRx(EpInfo[EndPoint].EpSlot,SizeHold);
    }
    break;
  case EP_BULK_SING_BUFF:
    if (EpState.STATTX == EP_STALL)
    {
      // EP stalled
      return(USB_EP_STALLED);
    }
    else if(EpState.STATTX == EP_VALID)
    {
      // Data sending in progress
      return(USB_OK);
    }
    /// Get smaller of the user buffer and the received data.
    SizeHold = MIN(EpInfo[EndPoint].MaxSize,ActSize);
    WriteEpDTB_CountTx(EpInfo[EndPoint].EpSlot,SizeHold);

    pDst = (pInt32U)__Offset2Addr_PackMem(ReadEpDTB_AddrTx(EpInfo[EndPoint].EpSlot));
    for (Count = 0; Count < SizeHold; ++Count)
    {
      Temp  = *pData++;
      if (++Count < SizeHold)
      {
        Temp |= (*pData++) << 8;
      }
      *pDst++ = Temp;
    }
    // Validate buffer
    EpCtrlSet_STAT_TX(EpInfo[EndPoint].pEpCtrl,EP_VALID);
    break;
  case EP_BULK_DOUB_BUF:
    // Double buffered
    if (EpState.STATTX == EP_STALL)
    {
      // EP stalled
      return(USB_EP_STALLED);
    }

    SizeHold = 0;
    do
    {
      // Check for a pending TX interrupt
      if(!EpCtrlGet_CTR_TX(EpInfo[EndPoint].pEpCtrl) &&
         !EpInfo[EndPoint].EpIntrFl &&
         (EpState.DTOGRX == EpCtrlGet_DTOG_TX(EpInfo[EndPoint].pEpCtrl)))
      {
        // All buffers are filled
        break;
      }

      // Get smaller of the rest of the user buffer and the received data.
      CurrSize = MIN(EpInfo[EndPoint].MaxSize,(ActSize-SizeHold));

      if(!EpState.DTOGRX)
      {
        // Tx Buffer
        pDst = (pInt32U)__Offset2Addr_PackMem(ReadEpDTB_AddrTx(EpInfo[EndPoint].EpSlot));
        WriteEpDTB_CountTx(EpInfo[EndPoint].EpSlot,CurrSize);
      }
      else
      {
        // Rx Buffer
        pDst = (pInt32U)__Offset2Addr_PackMem(ReadEpDTB_AddrRx(EpInfo[EndPoint].EpSlot));
        WriteEpDTB_CountRx(EpInfo[EndPoint].EpSlot,CurrSize);
      }

      for (Count = 0; Count < CurrSize; ++Count)
      {
        Temp  = *pData++;
        if (++Count < CurrSize)
        {
          Temp |= (*pData++) << 8;
        }
        *pDst++ = Temp;
      }

      EpInfo[EndPoint].EpIntrFl = 0;
      // Clear for pending TX interrupt
      EpCtrlClr_CTR_TX(EpInfo[EndPoint].pEpCtrl);
      EpCtrlToggle_DTOG_RX(EpInfo[EndPoint].pEpCtrl);
      // Update RX toggle status
      EpState.DTOGRX ^= 1;
      EpCtrlSet_STAT_TX(EpInfo[EndPoint].pEpCtrl,EP_VALID);
      SizeHold += CurrSize;
    } while(SizeHold < ActSize);
    break;
  default:
    // Fatal error (require restart of the USB)
    return(USB_EP_FATAL_ERROR);
  }

  *pCount = SizeHold;
  return(USB_OK);
}

/*************************************************************************
 * Function Name: USB_EpRead
 * Parameters: USB_Endpoint_t EndPoint, pInt8U pData, pInt32U pCount
 *
 * Return: USB_ErrorCodes_t
 *
 * Description: Endpoint Read (OUT)
 *
 *************************************************************************/
USB_ErrorCodes_t USB_EpRead (USB_Endpoint_t EndPoint, pInt8U pData,
                             pInt32U pCount)
{
volatile pInt32U pSrc;
Int32U ActSize = *pCount, EpCount;
__usb_epr_bits EpState;
Int32U Temp;
Int32U CurrSize,SizeHold;
Int32U Count;

  *pCount = 0;

  if(EpInfo[EndPoint].pEpCtrl == NULL)
  {
    return(USB_EP_NOT_VALID);
  }

  EpState = *(__usb_epr_bits *)EpInfo[EndPoint].pEpCtrl;
  if(EpState.STATRX == EP_DISABLED)
  {
    return(USB_EP_FATAL_ERROR);
  }

  switch (EpInfo[EndPoint].EpType)
  {
  case EP_CTRL:
    if(EpState.STATRX == EP_VALID)
    {
      // Data is not received yet.
      return(UB_EP_SETUP_UNDERRUN);
    }
    // Get received bytes number
    EpCount = ReadEpDTB_CountRx(EpInfo[EndPoint].EpSlot) & 0x3FF;
    // Get address of the USB packet buffer for corresponding EP
    pSrc = (pInt32U)__Offset2Addr_PackMem(ReadEpDTB_AddrRx(EpInfo[EndPoint].EpSlot));
    // Get smaller of the user buffer and the received data.
    SizeHold = MIN(EpCount,ActSize);

    for(Count = 0; Count < SizeHold; ++Count)
    {
      Temp = *pSrc++;
      *pData++ = Temp;
      if(++Count <= SizeHold) // fix overwrite problem with odd number of bytes
      {
        *pData++ = Temp>>8;
      }
    }
    *pCount = SizeHold;
    if(EpCtrlGet_SETUP(EpInfo[EndPoint].pEpCtrl))
    {
      return(UB_EP_SETUP_OVERWRITE);
    }

    break;
  case EP_ISO:
    if(EpState.DTOGRX)
    {
      EpCount = ReadEpDTB_CountTx(EpInfo[EndPoint].EpSlot) & 0x3FF;
      pSrc = (pInt32U)__Offset2Addr_PackMem(ReadEpDTB_AddrTx(EpInfo[EndPoint].EpSlot));
    }
    else
    {
      EpCount = ReadEpDTB_CountRx(EpInfo[EndPoint].EpSlot) & 0x3FF;
      pSrc = (pInt32U)__Offset2Addr_PackMem(ReadEpDTB_AddrRx(EpInfo[EndPoint].EpSlot));
    }
    // Get smaller of the user buffer and the received data.
    SizeHold = MIN(EpCount,ActSize);

    for(Count = 0; Count < SizeHold; ++Count)
    {
      Temp = *pSrc++;
      *pData++ = Temp;
      if(++Count <= SizeHold) // fix overwrite problem with odd number of bytes
      {
        *pData++ = Temp>>8;
      }
    }
    break;
  case EP_INTERRUPT:
    if (EpState.STATRX == EP_STALL)
    {
      return(USB_EP_STALLED);
    }
    else if (EpState.STATRX == EP_VALID)
    {
      return(UB_EP_SETUP_UNDERRUN);
    }
    EpCount = ReadEpDTB_CountRx(EpInfo[EndPoint].EpSlot) & 0x3FF;
    pSrc = (pInt32U)__Offset2Addr_PackMem(ReadEpDTB_AddrRx(EpInfo[EndPoint].EpSlot));
    // Get smaller of the user buffer and the received data.
    SizeHold = MIN(EpCount,ActSize);

    for(Count = 0; Count < SizeHold; ++Count)
    {
      Temp = *pSrc++;
      *pData++ = Temp;
      if(++Count <= SizeHold) // fix overwrite problem with odd number of bytes
      {
        *pData++ = Temp>>8;
      }
    }
    break;
  case EP_BULK_SING_BUFF:
    // Single buffer
    if (EpState.STATRX == EP_STALL)
    {
      return(USB_EP_STALLED);
    }
    else if (EpState.STATRX == EP_VALID)
    {
      return(UB_EP_SETUP_UNDERRUN);
    }
    EpCount = ReadEpDTB_CountRx(EpInfo[EndPoint].EpSlot) & 0x3FF;
    pSrc = (pInt32U)__Offset2Addr_PackMem(ReadEpDTB_AddrRx(EpInfo[EndPoint].EpSlot));
    // Get smaller of the user buffer and the received data.
    SizeHold = MIN(EpCount,ActSize);

    for(Count = 0; Count < SizeHold; ++Count)
    {
      Temp = *pSrc++;
      *pData++ = Temp;
      if(++Count <= SizeHold) // fix overwrite problem with odd number of bytes
      {
        *pData++ = Temp>>8;
      }
    }
    break;
  case EP_BULK_DOUB_BUF:
    if (EpState.STATRX == EP_STALL)
    {
      return(USB_EP_STALLED);
    }
    SizeHold = 0;
    do
    {
      if(!EpInfo[EndPoint].EpIntrFl)
      {
        // Buffers are empties
        break;
      }
      if(!EpState.DTOGTX)
      {
        EpCount = ReadEpDTB_CountTx(EpInfo[EndPoint].EpSlot) & 0x3FF;
        pSrc = (pInt32U)__Offset2Addr_PackMem(ReadEpDTB_AddrTx(EpInfo[EndPoint].EpSlot));
      }
      else
      {
        EpCount = ReadEpDTB_CountRx(EpInfo[EndPoint].EpSlot) & 0x3FF;
        pSrc = (pInt32U)__Offset2Addr_PackMem(ReadEpDTB_AddrRx(EpInfo[EndPoint].EpSlot));
      }

      // the buffer size must be enough bigger to get all available data from
      // the EP in other case remaining data will be lost
      if(EpCount > (ActSize-SizeHold))
      {
        *pCount = SizeHold;
        return (USB_BUF_OVERFLOW);
      }
      CurrSize = EpCount;
      for(Count = 0; Count < CurrSize; ++Count)
      {
        Temp = *pSrc++;
        *pData++ = Temp;
        if(++Count <= CurrSize) // fix overwrite problem with odd number of bytes
        {
          *pData++ = Temp>>8;
        }
      }
      EpCtrlToggle_DTOG_TX(EpInfo[EndPoint].pEpCtrl);
      EpState.DTOGTX ^= 1;
      SizeHold += CurrSize;
      --EpInfo[EndPoint].EpIntrFl;
    } while(SizeHold < ActSize);
    break;
  default:
    return(USB_EP_FATAL_ERROR);
  }
  *pCount = SizeHold;
  return (USB_OK);
}

/*************************************************************************
 * Function Name: USB_EpLogToPhysAdd
 * Parameters: Int8U EpLogAdd
 *
 * Return: USB_Endpoint_t
 *
 * Description: Convert the logical to physical address
 *
 *************************************************************************/
USB_Endpoint_t USB_EpLogToPhysAdd (Int8U EpLogAdd)
{
USB_Endpoint_t Address = (USB_Endpoint_t)((EpLogAdd & 0x0F)<<1);
  if(EpLogAdd & 0x80)
  {
    ++Address;
  }
  return(Address);
}

#if USB_SOF_EVENT > 0
/*************************************************************************
 * Function Name: USB_GetFrameNumb
 * Parameters: none
 *
 * Return: Int32U
 *
 * Description: Return current value of SOF number
 *
 *************************************************************************/
Int32U USB_GetFrameNumb (void)
{
  return(USB_FNR_bit.FN);
}
#endif // USB_SOF_EVENT > 0

#if USB_HIGH_PRIORITY_EVENT > 0
/*************************************************************************
 * Function Name: USB_HIGH_ISR
 * Parameters: none
 *
 * Return: none
 *
 * Description: High priority USB interrupt subroutine
 *
 *************************************************************************/
void USB_HIGH_ISR (void)
{
IntrStatus_t IntrStatus;
Int32U EpPhAddr;
Int32U Status;
  IntrStatus.Status  = USB_ISTR;
  IntrStatus.Status &= USB_CNTR | 0x1F;
  // Get masked interrupt flags
  if(IntrStatus.CTR)
  {
    // find corresponding EP
    pInt32U pReg = (pInt32U)&USB_EP0R;
    pReg += IntrStatus.EP_ID;
    EpPhAddr = ((*pReg & 0xF) << 1) + (IntrStatus.DIR?0:1);
    if(EpInfo[EpPhAddr].EpType == EP_BULK_DOUB_BUF)
    {
      EpInfo[EpPhAddr].EpIntrFl = 1;
    }
    if(IntrStatus.DIR == 1)
    {
      // OUT EP
      EpCtrlClr_CTR_RX(EpInfo[EpPhAddr].pEpCtrl);
      Status = EpCtrlGet_DTOG_TX(EpInfo[EpPhAddr].pEpCtrl);
      if(Status == EpCtrlGet_DTOG_RX(EpInfo[EpPhAddr].pEpCtrl))
      {
        // The both buffers are filled
        ++EpInfo[EpPhAddr].EpIntrFl;
      }
      // Some times USB engine receive second packet
      // after resetting of interrupt flag and before testing of
      // toggle bits
      if(EpCtrlGet_CTR_RX(EpInfo[EpPhAddr].pEpCtrl))
      {
        // Now both buffers are filled.
        EpCtrlClr_CTR_RX(EpInfo[EpPhAddr].pEpCtrl);
        EpInfo[EpPhAddr].EpIntrFl = 2;
      }
      if(UsbUserFun[EpPhAddr] != NULL)
      {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品美女久久久久aⅴ| 久久99精品一区二区三区| 日本在线不卡视频一二三区| 国产一区二区视频在线| 91传媒视频在线播放| 精品国产免费视频| 亚洲小少妇裸体bbw| 国产精品资源在线| 欧美乱妇20p| 亚洲日本在线看| 粉嫩蜜臀av国产精品网站| 欧美一级精品大片| 亚洲香蕉伊在人在线观| 国产成人在线色| 精品精品欲导航| 日韩国产精品久久| 欧洲精品一区二区| 亚洲欧美日韩电影| www.欧美日韩| 国产精品乱码人人做人人爱| 另类的小说在线视频另类成人小视频在线| 欧洲一区二区三区免费视频| 国产日本欧美一区二区| 久久国产人妖系列| 欧美一二三四在线| 亚洲香肠在线观看| 欧美午夜精品理论片a级按摩| 亚洲男帅同性gay1069| 99精品欧美一区二区蜜桃免费| 久久久久久电影| 国产精品久久免费看| 免费成人在线影院| 欧美一区二区三区精品| 丝袜脚交一区二区| 日韩丝袜情趣美女图片| 日韩av不卡在线观看| 678五月天丁香亚洲综合网| 婷婷综合五月天| 在线不卡欧美精品一区二区三区| 亚洲自拍偷拍欧美| 欧美色图天堂网| 天天综合天天做天天综合| 777午夜精品视频在线播放| 日韩av一区二区三区四区| 69p69国产精品| 国产主播一区二区三区| 久久精品免费在线观看| 成人免费视频视频在线观看免费| 国产精品久久精品日日| 色成年激情久久综合| 亚洲成精国产精品女| 欧美一激情一区二区三区| 黑人巨大精品欧美黑白配亚洲| 久久精品夜色噜噜亚洲a∨| 粉嫩绯色av一区二区在线观看| 中文字幕亚洲在| 欧美男男青年gay1069videost| 日本91福利区| 国产精品美女久久久久aⅴ| 91免费国产视频网站| 午夜伦理一区二区| 久久久精品综合| 欧美中文字幕不卡| 国产综合久久久久久鬼色| 亚洲日本va午夜在线影院| 在线观看一区二区视频| 极品少妇一区二区| 亚洲精品国产精华液| 日韩午夜激情免费电影| 国产成人精品免费在线| 一区二区在线看| 精品国产一二三区| 欧美无乱码久久久免费午夜一区 | 韩国精品一区二区| 国产精品久久久久精k8| 91精品国产综合久久精品app| 国产成人av电影| 免费在线看一区| 综合av第一页| 2020国产精品久久精品美国| 色老综合老女人久久久| 国产精品一色哟哟哟| 日韩专区一卡二卡| 成人欧美一区二区三区小说| 精品少妇一区二区三区 | 国产精品不卡一区| 欧美电影精品一区二区| 在线观看亚洲一区| 成人午夜在线播放| 久久国产欧美日韩精品| 午夜精品视频一区| 亚洲精品乱码久久久久| 中文字幕精品—区二区四季| 日韩久久久久久| 91麻豆精品国产自产在线| 日本高清成人免费播放| 成人黄色在线视频| 在线观看91视频| 成人国产免费视频| 久草精品在线观看| 九九国产精品视频| 日本不卡不码高清免费观看| 亚洲国产欧美另类丝袜| 一区二区在线观看视频在线观看| 国产精品毛片无遮挡高清| 久久久精品免费观看| 日韩一区二区三区精品视频| 欧美三级资源在线| 在线观看一区日韩| 欧美性大战久久久久久久蜜臀| 99久久久国产精品| 97久久超碰国产精品| 91在线国产福利| 亚洲欧美一区二区三区极速播放| 国产精品久久看| 久久精品欧美日韩| 国产精品久久久久精k8| 国产精品久久久久久久久免费桃花| 久久久久青草大香线综合精品| 久久这里只有精品首页| 久久精品亚洲麻豆av一区二区| 久久精品亚洲精品国产欧美 | 国产日韩精品一区二区三区在线| 精品国产3级a| 久久久久久久久久美女| 欧美激情一区二区| 亚洲色图制服丝袜| 亚洲小说欧美激情另类| 全国精品久久少妇| 韩国欧美国产1区| 欧美白人最猛性xxxxx69交| 日韩一区二区三区免费看| 欧美精品一区二区三区蜜桃| 国产日韩欧美激情| 亚洲人成人一区二区在线观看| 亚洲激情图片一区| 秋霞国产午夜精品免费视频| 美女爽到高潮91| 国产99久久久国产精品潘金 | 日韩一二三区视频| 久久精品这里都是精品| 亚洲日本欧美天堂| 男女性色大片免费观看一区二区 | 中文字幕一区二区三区在线不卡 | 国产在线乱码一区二区三区| 国产福利精品一区二区| 色噜噜狠狠色综合欧洲selulu| 亚洲一区在线观看视频| 亚洲一区二区av在线| 久久激五月天综合精品| 成人动漫一区二区三区| 欧美日韩aaa| 国产精品视频yy9299一区| 亚洲美女淫视频| 理论电影国产精品| 日本韩国欧美三级| 久久免费的精品国产v∧| 一区二区三区免费网站| 国产一区高清在线| 欧美精品亚洲二区| 亚洲欧洲日本在线| 另类的小说在线视频另类成人小视频在线 | 国产精品美女久久久久aⅴ国产馆| 亚洲一二三区视频在线观看| 国产盗摄视频一区二区三区| 欧美性感一区二区三区| 中文字幕乱码日本亚洲一区二区| 午夜精品久久久久久久久久| 不卡的av在线播放| 久久久久久97三级| 日本不卡视频在线| 欧美日韩精品一区二区天天拍小说 | 亚洲国产日韩精品| 99视频有精品| 久久精品无码一区二区三区| 石原莉奈在线亚洲三区| 在线观看欧美日本| 亚洲同性gay激情无套| 国产a级毛片一区| 欧美xxxx在线观看| 日韩成人伦理电影在线观看| 日本久久电影网| 国产精品久久久久久久久久免费看| 欧美a级理论片| 欧美福利一区二区| 亚洲一区二区三区四区在线 | 国产在线精品一区二区不卡了| 4438x亚洲最大成人网| 夜夜嗨av一区二区三区| 色综合天天综合在线视频| 中文在线免费一区三区高中清不卡| 久久9热精品视频| 欧美成人精品3d动漫h| 日日夜夜精品视频免费| 欧美日韩国产美女| 色呦呦网站一区| 1024亚洲合集| 一道本成人在线| 一区二区三区在线不卡| 色哟哟一区二区在线观看|