你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【MCU实战经验】+stm32f407之usbhost自定义类开发  

[复制链接]
鼻儿眼睛花 发布时间:2014-4-1 12:30
在很多stm32的单片机中,集成了usbhost功能,而且st官方还提供了非常易用的usb库,库里面还有好几个例子,如HID,MSC,DualCore。分别实现了鼠标键盘的读取,U盘的读取,高速和全速同时工作的例程。可是,朋友们如果想自己读取自己的USB设备该怎么办呢?下面我来给大家细细讲解。
st官方的usb采用的是分层的思想最底层是usb的驱动,然后是usb消息响应的核心库,上层是usb类库和用户消息处理回调函数。
对于usb设备的读取来说,当设备插入host接口的时候,枚举过程就已经由usb库自动完成了,接下来我们主要是编写usb自定义类来实现和设备进行通信。
在st官方usb库中,usb类是这样定义的:

typedef struct _USBH_Class_cb
{
  USBH_Status  (*Init)\
    (USB_OTG_CORE_HANDLE *pdev , void *phost);//usb类初始化,包括判断设备是否支持,打开响应的通信管线
  void         (*DeInit)\
    (USB_OTG_CORE_HANDLE *pdev , void *phost);//释放usb资源
  USBH_Status  (*Requests)\
    (USB_OTG_CORE_HANDLE *pdev , void *phost);  //usb类请求
  USBH_Status  (*Machine)\
    (USB_OTG_CORE_HANDLE *pdev , void *phost); //usb数据处理线程   
  
} USBH_Class_cb_TypeDef;
那么,我们如果要实现一个USB类,就需要编写以上四个函数。
下面就是我自己写的一个自定义类:

typedef struct
{
  uint8_t              hc_num_in;
  uint8_t              hc_num_out;
  uint8_t              MSBulkOutEp;
  uint8_t              MSBulkInEp;
  uint16_t             MSBulkInEpSize;
  uint16_t             MSBulkOutEpSize;
}myClassTypedef;
myClassTypedef myClass;

USBH_Status Init(USB_OTG_CORE_HANDLE *pdev , void *phost)
{
        USBH_HOST *pphost = phost;
        short myi;
        char Buffer[50]={0};
        
        unsigned char status;
        
        sprintf(Buffer,"接口数目为:%d",pphost->device_prop.Cfg_Desc.bNumInterfaces);
        LHLFont_DebugString(Buffer);
        
        for(myi=1; myidevice_prop.Cfg_Desc.bNumInterfaces+1; myi++)
        {
                if(pphost->device_prop.Ep_Desc[myi-1][0].bEndpointAddress & 0x80)
                {
                        sprintf(Buffer,"接口%d的端点0为输入",myi);
                }
                else
                {
                        sprintf(Buffer,"接口%d的端点0为输出",myi);
                }
                LHLFont_DebugString(Buffer);
               
                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][0].wMaxPacketSize,
                pphost->device_prop.Ep_Desc[myi-1][0].bmAttributes);
                LHLFont_DebugString(Buffer);
               
               
                if(pphost->device_prop.Ep_Desc[myi-1][1].bEndpointAddress & 0x80)
                {
                        sprintf(Buffer,"接口%d的端点1为输入",myi);
                }
                else
                {
                        sprintf(Buffer,"接口%d的端点1为输出",myi);
                }
                LHLFont_DebugString(Buffer);

                sprintf(Buffer,"接口%d Size:%d,Type:%d",myi,pphost->device_prop.Ep_Desc[myi-1][1].wMaxPacketSize,
                pphost->device_prop.Ep_Desc[myi-1][1].bmAttributes);
                LHLFont_DebugString(Buffer);        
  }
         
        myClass.MSBulkOutEp =  pphost->device_prop.Ep_Desc[0][1].bEndpointAddress;
        myClass.MSBulkInEp =  pphost->device_prop.Ep_Desc[0][0].bEndpointAddress;
        myClass.MSBulkOutEpSize =  pphost->device_prop.Ep_Desc[0][1].wMaxPacketSize;
        myClass.MSBulkInEpSize = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize;
        
  myClass.hc_num_out = USBH_Alloc_Channel(pdev, myClass.MSBulkOutEp);
  myClass.hc_num_in = USBH_Alloc_Channel(pdev, myClass.MSBulkInEp);  
  
        status = USBH_Open_Channel  (pdev,
                                                                                        myClass.hc_num_out,
                                                                                        pphost->device_prop.address,
                                                                                        pphost->device_prop.speed,
                                                                                        EP_TYPE_BULK,
                                                                                        myClass.MSBulkOutEpSize);  
        if(status == HC_OK)
        status = USBH_Open_Channel  (pdev,
                                                                                        myClass.hc_num_in,
                                                                                        pphost->device_prop.address,
                                                                                        pphost->device_prop.speed,
                                                                                        EP_TYPE_BULK,
                                                                                        myClass.MSBulkInEpSize);
        if(status == HC_OK)
        LHLFont_DebugString("USBH Open Channel Ok");
        
        Receive_Retry = 2;
        
        return USBH_OK;                                 
}
            
void DeInit(USB_OTG_CORE_HANDLE *pdev , void *phost)
{
  if ( MSC_Machine.hc_num_out)
  {
    USB_OTG_HC_Halt(pdev, myClass.hc_num_out);
    USBH_Free_Channel  (pdev, myClass.hc_num_out);
    myClass.hc_num_out = 0;     /* Reset the Channel as Free */
  }
   
  if ( MSC_Machine.hc_num_in)
  {
    USB_OTG_HC_Halt(pdev, myClass.hc_num_in);
    USBH_Free_Channel  (pdev, myClass.hc_num_in);
    myClass.hc_num_in = 0;     /* Reset the Channel as Free */
  }
}
USBH_Status Requests(USB_OTG_CORE_HANDLE *pdev , void *phost)
{
        return USBH_OK;
}
unsigned char usbbuffer[70];
unsigned short usbbufferlen=0;

unsigned char SendMechine = 2;
int SendCount = 0;

unsigned char ReceiveMechine = 0;
int ReceiveCount = 0;
unsigned dataReceived = 0;

void usb_CopyDataToBuffer(unsigned char *pbuffer,unsigned short len)
{
        unsigned char *ptmp=usbbuffer;
        
        usbbufferlen = len;
        
        while(len--)
        {
                *ptmp++ = *pbuffer++;
        }
}
USBH_Status Machine(USB_OTG_CORE_HANDLE *pdev , void *phost)
{
        if(SendMechine==1)
        {
                SendMechine=0;
                USBH_BulkSendData (pdev,
                                                                                                 (unsigned char *)usbbuffer,
                                                                                                 usbbufferlen ,
                                                                                                 myClass.hc_num_out);
                SendCount=0;
                while(HCD_GetURB_State(pdev, myClass.hc_num_out) != URB_DONE && SendCount0)
        {
                Receive_Retry--;
                ReceiveCount=0;
                USBH_BulkReceiveData (pdev,
                                                                 (unsigned char *)usbbuffer+3,
                                                                 64,
                                                                 myClass.hc_num_in);

                while(HCD_GetURB_State(pdev, myClass.hc_num_in) != URB_DONE &&ReceiveCount

自定义usb类.zip

下载

2.03 KB, 下载次数: 1169

1 收藏 10 评论51 发布时间:2014-4-1 12:30

举报

51个回答
鼻儿眼睛花 回答时间:2014-4-1 12:53:42

RE:【MCU实战经验】+stm32f407之usbhost自定义类开发

这个坛子火热程度不够啊,精华帖子太少了。加油吧,大家把这个坛子做的更有活力。
STM32F103-34799 回答时间:2014-4-1 14:38:13

RE:【MCU实战经验】+stm32f407之usbhost自定义类开发

不错,帖子很有条理,有借鉴意义
froxy-349483 回答时间:2014-4-5 23:17:36

回复:【MCU实战经验】+stm32f407之usbhost自定义类开发

楼主很厉害啊,
benten22 回答时间:2014-4-6 00:22:24

RE:【MCU实战经验】+stm32f407之usbhost自定义类开发

好想搞USb就是还不会
isi408 回答时间:2014-4-15 10:51:55

RE:【MCU实战经验】+stm32f407之usbhost自定义类开发

期待中,正在开发这个,呵呵谢谢楼主的无私奉献!!!
pengchanghong 回答时间:2014-4-25 15:54:26

RE:【MCU实战经验】+stm32f407之usbhost自定义类开发

谢谢分享,辛苦了!
kinetis-425530 回答时间:2014-5-6 17:44:25

回复:【MCU实战经验】+stm32f407之usbhost自定义类开发

支持,顶顶 
zxm_auto 回答时间:2014-5-27 14:49:46

RE:【MCU实战经验】+stm32f407之usbhost自定义类开发

支持,顶顶支持,顶顶
yaoohui 回答时间:2014-6-7 15:42:16

RE:【MCU实战经验】+stm32f407之usbhost自定义类开发

简单明了,支持!!!

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版