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

📄 usbci.lst

📁 周立功的LPC214x固件程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
  218          
  219          
  220          /********************************************************************************************************
             -*******
  221          ** 函数名称 : USB_SelectEndpoint()                      Name     : USB_SelectEndpoint()
  222          ** 功能描述 : 选择端点,并获取端点信息                   Function : select the endpoint, and get the endpoint infor
             -mation
  223          ** 输    入 : INT8U endp: 物理端点号                    Input    : INT8U endp: the physical endpoint number
  224          ** 输    出 : 对应端点的信息                            Output   : the endpoint information
  225          *********************************************************************************************************
             -*******/
  226          INT8U USB_SelectEndpoint(INT8U endp)
  227          {
  228   1          INT32U tmp = (INT32U)(endp << 16);
  229   1      
  230   1          USB_SendCmd(tmp | USBCMD_SEL_ENDP, 0);
  231   1      
  232   1          return USB_GetData(tmp | USBDAT_SEL_ENDP);
  233   1      }
  234          
ARM COMPILER V2.53,  USBCI                                                                 28/06/07  09:54:12  PAGE 5   

  235          
  236          /********************************************************************************************************
             -*******
  237          ** 函数名称 : USB_SelectClrIntEndpoint()                Name     : USB_SelectClrIntEndpoint()
  238          ** 功能描述 : 选择端点,并获取端点信息和清除对应端点的   Function : select the endpoint, and get the endpoin
             -t information 
  239                        中断                                                 and clear the interrupt of the correspond endpoint
  240          ** 输    入 : INT8U endp: 物理端点号                    Input    : INT8U endp: the physical endpoint number
  241          ** 输    出 : 对应端点的信息                            Output   : the endpoint information
  242          *********************************************************************************************************
             -*******/
  243          INT8U USB_SelectClrIntEndpoint(INT8U endp)
  244          {
  245   1          INT8U i;
  246   1          INT32U tmp = (INT32U)((endp + 0x40) << 16);
  247   1      
  248   1          USB_SendCmd(tmp | USBCMD_SEL_CLRINT_ENDP, 0);
  249   1          i = USB_GetData(tmp | USBDAT_SEL_CLRINT_ENDP);
  250   1          
  251   1          USBEpIntClr = (0x01 << endp);
  252   1          
  253   1          return i;
  254   1      }
  255          
  256          /********************************************************************************************************
             -*******
  257          ** 函数名称 : USB_SetEndpointStatus()                   Name     : USB_SetEndpointStatus()
  258          ** 功能描述 : 设置端点状态                              Function : set endpoint status 
  259          ** 输    入 : INT8U endp    : 物理端点号                Input    : INT8U endp    : the physical endpoint number
  260                        INT8U bStalled: 1 - stall 端点                       INT8U bStalled: 1 - stall endpoint
  261                                        0 - unstall 端点                                     0 - unstall endpoint
  262          ** 输    出 : 无                                        Output   : NULL
  263          *********************************************************************************************************
             -*******/
  264          void USB_SetEndpointStatus(INT8U endp, INT8U bStalled)
  265          {
  266   1          INT32U tmp1 = (INT32U)((endp + 0x40) << 16);
  267   1          INT32U tmp2 = (INT32U)(bStalled << 16); 
  268   1      
  269   1          USB_SendCmd(tmp1 | USBCMD_SET_ENDP_STATUS, tmp2 | USBDAT_SET_ENDP_STATUS);
  270   1      }
  271          
  272          
  273          /********************************************************************************************************
             -*******
  274          ** 函数名称 : USB_ClearBuffer()                         Name     : USB_ClearBuffer()
  275          ** 功能描述 : 清除OUT端点缓冲区                         Function : clear the OUT endpoint buffer
  276          ** 输    入 : 无                                        Input    : NULL
  277          ** 输    出 : 一个字节                                  Output   : read a byte
  278          *********************************************************************************************************
             -*******/
  279          INT8U USB_ClearBuffer(void)
  280          {
  281   1          /* no data phase */
  282   1          USB_SendCmd(USBCMD_CLEAR_BUFFER, 0);                /* 该命令没有数据阶段 */                
  283   1          
  284   1          return USB_GetData(USBDAT_CLEAR_BUFFER);
  285   1      }
  286          
  287          
  288          /********************************************************************************************************
             -*******
  289          ** 函数名称 : USB_ValidBuffer()                         Name     : USB_ClearBuffer()
  290          ** 功能描述 : 使能 IN 端点缓冲区                        Function : validate the IN endpoint buffer
  291          ** 输    入 : 无                                        Input    : NULL
  292          ** 输    出 : 无                                        Output   : NULL
ARM COMPILER V2.53,  USBCI                                                                 28/06/07  09:54:12  PAGE 6   

  293          *********************************************************************************************************
             -*******/
  294          void USB_ValidBuffer(void)
  295          {
  296   1          USB_SendCmd(USBCMD_VALID_BUFFER, 0);
  297   1      }
  298          
  299          
  300                  /***********************************************************
  301                      
  302                      端点数据传输     Endpoint Data Transfer
  303                  
  304                  ***********************************************************/
  305          
  306          /********************************************************************************************************
             -*******
  307          ** 函数名称 : USB_ReadEndpoint()                        Name     : USB_ReadEndpoint()
  308          ** 功能描述 : 读物理端点                                Function : Read data from USB endpoint
  309          ** 入口参数 : INT8U endp: 物理端点号                    Input    : INT8U endp:  the physical endpoint number
  310                        INT8U len : 要读的字节长度                           INT8U len :  the length that will be read
  311                        INT8U *buf: 接收缓冲区                               INT8U *buf:  receiving buffer 
  312          ** 输    出 : 实际读到的字节数                          Output   : the actual length that be read 
  313          *********************************************************************************************************
             -*******/
  314          INT8U USB_ReadEndpoint(INT8U endp, INT8U len, INT8U *buf)
  315          {
  316   1          INT32U tmp;
  317   1          INT32U i,j;
  318   1          INT32U reclen;
  319   1      
  320   1          /* select logical endpoint and enable read operate */
  321   1          USBCtrl = (INT32U)((endp >> 1) << 2) | 0x01;         /* 选择逻辑端点并使能读操作 */
  322   1       
  323   1          /* wait for the data ready */
  324   1          if((endp % 2 == 0))                                 //判断被读取的物理端点号是否为偶数(偶数继续)
  325   1              while((USBRxPLen & 0x00000C00) ==0);             /* 等待数据就绪 */
  326   1          
  327   1          /* get the receive length */
  328   1          reclen = USBRxPLen & 0x1FF;                          /* 获取收到的数据的字节长度 */             
  329   1          if (reclen > len)
  330   1              reclen = len; 
  331   1          
  332   1          /* read data from ep ram */                          /* 从 EP RAM 中读取数据 */
  333   1          for (i = 0; i < (reclen / 4); i++)                  
  334   1          {   
  335   2              tmp = USBRxData;        
  336   2              *buf++ = (INT8U)tmp; 
  337   2              *buf++ = (INT8U)(tmp >> 8);
  338   2              *buf++ = (INT8U)(tmp >> 16);
  339   2              *buf++ = (INT8U)(tmp >> 24);
  340   2          }   
  341   1              
  342   1          j = reclen % 4;                                     //读取不足4bytes的数据
  343   1          if (j != 0)
  344   1          { 
  345   2              tmp = USBRxData;    
  346   2      
  347   2              for(i = 0; i < j; i++)
  348   2                 *buf++ = (INT8U)(tmp >> (i << 3));
  349   2          }
  350   1          
  351   1          /* clear the RxENDPKT bit in USBDevIntClr register */
  352   1          USBDevIntClr = RxENDPKT;                             /* 清除 RxENDPKT 位 */  
  353   1           
  354   1          /* clear the OUT buffer */
  355   1          USB_SelectEndpoint(endp);                             
ARM COMPILER V2.53,  USBCI                                                                 28/06/07  09:54:12  PAGE 7   

  356   1          USB_ClearBuffer();                                   /* 清除OUT缓冲区 */ 
  357   1          
  358   1          return reclen;                                       /* 返回实际收到的字节数 */
  359   1      }
  360          
  361          
  362          /********************************************************************************************************
             -*******
  363          ** 函数名称 : USB_WriteEndpoint()                       Name     : USB_WriteEndpoint()
  364          ** 功能描述 : 向物理端点写入数据                        Function : Write data to USB endpoint
  365          ** 入口参数 : INT8U endp: 物理端点号                    Input    : INT8U endp:  the physical endpoint number
  366                        INT8U len : 要写的字节长度                           INT8U len :  the length that will be written
  367                        INT8U *buf: 发送缓冲区                               INT8U *buf:  sending buffer
  368          ** 输    出 : 实际写入的字节数                          Output   : the actual length that have being written
  369          *********************************************************************************************************
             -*******/
  370          INT8U USB_WriteEndpoint(INT8U endp, INT8U len, INT8U *buf)
  371          {
  372   1          INT32U tmp;
  373   1          INT32U i,j;
  374   1      
  375   1          /* select logical endpoint and enable writing operation */
  376   1          tmp = ((endp >> 1) << 2) | 0x02;                      /* 选择逻辑端点并使能写操作 */
  377   1          USBCtrl = (INT32U)tmp;
  378   1          
  379   1          /* write the length that will be written into endpoint */
  380   1          USBTxPLen = (INT32U)len;                              /* 写入要发送的数据的字节长度 */
  381   1          
  382   1          /* write Data into Transmit Data Register */          /* 写入要发送的数据到发送数据寄存器 */
  383   1          j = len >> 2;
  384   1          for(i = 1; i <= j; i++)
  385   1          {
  386   2              tmp =  (INT32U)*buf++;
  387   2              tmp += (INT32U)(*buf++ << 8);
  388   2              tmp += (INT32U)(*buf++ << 16);
  389   2              tmp += (INT32U)(*buf++ << 24);
  390   2              USBTxData = tmp;
  391   2              
  392   2              while((USBTxPLen & 0x3FF) != len - (i << 2)); 
  393   2          }
  394   1          
  395   1          j = len % 4;
  396   1          if (j != 0)
  397   1          {
  398   2              tmp = 0;    
  399   2              for(i = 0; i < j; i++)
  400   2              {
  401   3                 tmp |= ((INT32U)*buf) << (i << 3);
  402   3                 buf++;
  403   3              }
  404   2              USBTxData = tmp;
  405   2              
  406   2              while((USBTxPLen & 0x3FF) != 0);                    /* 等待 USBTxPLen 为 0 */
  407   2              
  408   2          }
  409   1          
  410   1          if (len != 0)
  411   1          {
  412   2              while((USBDevIntSt & TxENDPKT) ==0);                /* 等待写入完成 */
  413   2              USBDevIntClr = TxENDPKT;
  414   2          }
  415   1              
  416   1          /* Validate buffer */
  417   1          USB_SelectEndpoint(endp);                               /* 使能发送缓冲区 */
  418   1          USB_ValidBuffer();      
  419   1          
ARM COMPILER V2.53,  USBCI                                                                 28/06/07  09:54:12  PAGE 8   

  420   1          return len;                                             /* 返回实际写入长度 */
  421   1      }
  422          
  423          
  424          /************************************************************
  425          ** Name    : disconnect_USB 
  426          ** Function: disconnect USB bus
  427          ************************************************************/
  428          void disconnect_USB(void)
  429          {
  430   1          USB_SetDevStatus(0x00);
  431   1      }
  432          
  433          /************************************************************
  434          ** Name    : connect_USB
  435          ** Function: connect USB bus
  436          ************************************************************/
  437          void connect_USB(void)
  438          {
  439   1          USB_SetDevStatus(0x01);
  440   1      }
  441          
  442          /************************************************************
  443          ** Name    : reconnect_USB
  444          ** Function: reconnect USB bus
  445          ************************************************************/

⌨️ 快捷键说明

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