关于USB的总结

来源:互联网 发布:北京淘宝的地方在哪里 编辑:程序博客网 时间:2024/05/14 14:54

现在应用到的USB主要有3种:

1、interrupt模式下上位机下发给嵌入式设备命令:

嵌入式软件处理数据的相关代码如下:

 

USBD_CUSTOM_HID_ItfTypeDef USBD_CustomHID_fops_FS =
{
  CUSTOM_HID_ReportDesc_FS,
  CUSTOM_HID_Init_FS,
  CUSTOM_HID_DeInit_FS,
  CUSTOM_HID_OutEvent_FS,
};

 

static int8_t CUSTOM_HID_OutEvent_FS (uint8_t* event_idx);

解决数据来源的问题,库里的代码只能取到两个字节的命令,可以通过修改代码取多个字节,修改如下:

 

USBD_ClassTypeDef  USBD_CUSTOM_HID =
{
  USBD_CUSTOM_HID_Init,
  USBD_CUSTOM_HID_DeInit,
  USBD_CUSTOM_HID_Setup,
  NULL, /*EP0_TxSent*/ 
  USBD_CUSTOM_HID_EP0_RxReady, /*EP0_RxReady*/ /* STATUS STAGE IN */
  USBD_CUSTOM_HID_DataIn, /*DataIn*/
  USBD_CUSTOM_HID_DataOut,
  NULL, /*SOF */
  NULL,
  NULL,     
  USBD_CUSTOM_HID_GetCfgDesc,
  USBD_CUSTOM_HID_GetCfgDesc,
  USBD_CUSTOM_HID_GetCfgDesc,
  USBD_CUSTOM_HID_GetDeviceQualifierDesc,
};

 

标红的部分为接受USB数据的函数

static uint8_t  USBD_CUSTOM_HID_DataOut (USBD_HandleTypeDef *pdev,
                              uint8_t epnum)
{
 
  USBD_CUSTOM_HID_HandleTypeDef     *hhid = (USBD_CUSTOM_HID_HandleTypeDef*)pdev->pClassData; 
 
//  ((USBD_CUSTOM_HID_ItfTypeDef *)pdev->pUserData)->OutEvent(hhid->Report_buf[0],
//                                                            hhid->Report_buf[1]);
    ((USBD_CUSTOM_HID_ItfTypeDef *)pdev->pUserData)->OutEvent(hhid->Report_buf);
   
  USBD_LL_PrepareReceive(pdev, CUSTOM_HID_EPOUT_ADDR , hhid->Report_buf,
                         USBD_CUSTOMHID_OUTREPORT_BUF_SIZE);

  return USBD_OK;
}

 

对应的上位机源码处理函数如下:

UCHAR Out_Data[5]={0x02,0x00};
 int ret;
 Out_Data[1] = 0x06;//Red on
 Out_Data[2] = 0x01;
 Out_Data[3] = 0x01;
 ret = usb_interrupt_write(g_udev[0],0x01,(char *)Out_Data,5,500);

调用红色字体的函数来发送这个类型的命令。

 

2、往上位机上加载读取的数据

static uint8_t  USBD_CUSTOM_HID_Setup (USBD_HandleTypeDef *pdev,
                                USBD_SetupReqTypedef *req)

这个函数下的下面就是读取的值

 case CUSTOM_HID_REQ_GET_REPORT: //Virgo
        ProcessReqFromPC(hhid->Send2PCReport_buf,(uint8_t)(req->wValue)&0x00FF);
        USBD_CtlSendData(pdev,hhid->Send2PCReport_buf,(uint8_t)(req->wLength));
         break;

#define CUSTOM_HID_REQ_GET_REPORT            0x01

 

上位机代码

int ret;
 char In_Data[64] = {0x00};
 ret = usb_control_msg(g_udev[0],0xA1,0x01,0x0301,0x0000,In_Data,64,1000);

0x01,对应的是CUSTOM_HID_REQ_GET_REPORT           

0x0301 为命令

 

 

3、在上位机上写入嵌入式中数据

 

USBD_ClassTypeDef  USBD_CUSTOM_HID =
{
  USBD_CUSTOM_HID_Init,
  USBD_CUSTOM_HID_DeInit,
  USBD_CUSTOM_HID_Setup,
  NULL, /*EP0_TxSent*/ 
  USBD_CUSTOM_HID_EP0_RxReady, /*EP0_RxReady*/ /* STATUS STAGE IN */
  USBD_CUSTOM_HID_DataIn, /*DataIn*/
  USBD_CUSTOM_HID_DataOut,
  NULL, /*SOF */
  NULL,
  NULL,     
  USBD_CUSTOM_HID_GetCfgDesc,
  USBD_CUSTOM_HID_GetCfgDesc,
  USBD_CUSTOM_HID_GetCfgDesc,
  USBD_CUSTOM_HID_GetDeviceQualifierDesc,
};

 

 case CUSTOM_HID_REQ_SET_REPORT:
      g_req = req;
      hhid->IsReportAvailable = 1;
      USBD_CtlPrepareRx (pdev, hhid->Report_buf, (uint8_t)(req->wLength));

 

#define CUSTOM_HID_REQ_SET_REPORT            0x09

 

对应的上位机

 ret = usb_control_msg(g_udev[0],0x21,0x09,0x0302,0x0000,Out_Data,20,1000);

数据USBcontrol类型

 

 

 

 

 

0 0
原创粉丝点击