概述
现在应用到的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类型
最后
以上就是奋斗小松鼠为你收集整理的关于USB的总结的全部内容,希望文章能够帮你解决关于USB的总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复