使用STM32F4同时挂载两个U盘

2019-07-20 13:39发布

本帖最后由 zmingwang 于 2016-7-28 18:23 编辑

STM32F4带有两个USB OTG接口,一个只支持全速,另外一个支持高速,但是高速需要外接高速PHY.
两个USB接口都自带全速PHY,所以如果不需要用到高速的话,可以直接使用两个USB全速通道.
STM32的例程主要都是在全速USB接口上写的,就是USB_OTG_FS,所以给我一个错觉,认为STM432只带有一个全速PHY,要么FS用,要么HS用.
其实USB_OTG_HS也带有全速PHY,在STM32F40x block diagram中有体现:

QQ截图20160728182052.png

可见,USB_OTG_HS和USB_OTG_FS都有PHY.
并且,USB_OTG_HS还带有DMA,可提高性能,在datasheet中有说明:

clipboard2.png

USB_OTG_HS的配置和USB_OTG_FS基本是一样的,官方库中,STM32Cube_FW_F4_V1.12.0ProjectsSTM324xG_EVALApplicationsUSB_HostDualCore_Standalone 就是一个同时使用两路USB的例程,此例程的USB_OTG_HS使用的外部PHY,只需要修改usbh_conf.c中的
    hhcd_HS.Init.phy_itface = HCD_PHY_ULPI;
    hhcd_HS.Init.Sof_enable = 0;
    hhcd_HS.Init.speed = HCD_SPEED_HIGH;

    hhcd_HS.Init.phy_itface = HCD_PHY_EMBEDDED;
    hhcd_HS.Init.Sof_enable = 0;
    hhcd_HS.Init.speed = HCD_SPEED_FULL;

参考例程,我将两路USB都用于挂载U盘:
void USB_Init(void)
{
        /* Init Host Library */
        USBH_Init(&hUSBHost, USBH_UserProcess, 0);
        USBH_Init(&hUSB_HS_Host, USBH_HS_UserProcess, 1);

        /* Add Supported Class */
        USBH_RegisterClass(&hUSBHost, USBH_MSC_CLASS1);
        USBH_RegisterClass(&hUSB_HS_Host, USBH_MSC_CLASS2);

        /* Start Host Process */
        USBH_Start(&hUSBHost);
        USBH_Start(&hUSB_HS_Host);
}

void USBSrvTask(void)
{
        USB_Init();

        while(1)
        {
                USBH_Process(&hUSBHost);
                USBH_Process(&hUSB_HS_Host);
                osDelay(10);
        }
}
STM32的官方MSC库设计上是只支持挂载一个U盘的,要挂两个U盘,就要简单修改下库的代码:
修改usbh_msc.c中的USBH_msc定义,改为定义两元素的数组
USBH_ClassTypeDef  USBH_msc[2] =
{
        {
          "MSC",
          USB_MSC_CLASS,
          USBH_MSC_InterfaceInit,
          USBH_MSC_InterfaceDeInit,
          USBH_MSC_ClassRequest,
          USBH_MSC_Process,
          USBH_MSC_SOFProcess,
          NULL,
        },
        {
          "MSC",
          USB_MSC_CLASS,
          USBH_MSC_InterfaceInit,
          USBH_MSC_InterfaceDeInit,
          USBH_MSC_ClassRequest,
          USBH_MSC_Process,
          USBH_MSC_SOFProcess,
          NULL,
        }
};
修改usbh_msc.h中的USBH_msc相关代码为:
extern USBH_ClassTypeDef  USBH_msc[2];
#define USBH_MSC_CLASS1    &USBH_msc[0]
#define USBH_MSC_CLASS2    &USBH_msc[1]





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
Tmss2
1楼-- · 2019-07-20 15:23
能做到这两个U盘的数据的交互吗?
zmingwang
2楼-- · 2019-07-20 17:40
 精彩回答 2  元偷偷看……
Tmss2
3楼-- · 2019-07-20 19:24
zmingwang 发表于 2016-8-28 22:09
要两个U盘数据交互,当然没问题,就是要做一些文件系统的配置,因为FatFs默认只挂一个盘.

最近一直在搞这个。
这样子挂载两个U盘,那两个都是全速,传输速率有点低啊。即便是HS外接PHY,数据交互也会受到FS的上限限制,有什么好的建议么?
zmingwang
4楼-- · 2019-07-20 23:24
Tmss2 发表于 2016-8-29 10:37
最近一直在搞这个。
这样子挂载两个U盘,那两个都是全速,传输速率有点低啊。即便是HS外接PHY,数据交互 ...

方法一,STM32的HS通过高速PHY连接一个HUB,U盘挂在HUB上.
方法二,用两个STM32,HS通过高速PHY分别连接一个U盘,两个MCU通过SPI通信
Tmss2
5楼-- · 2019-07-21 00:50
 精彩回答 2  元偷偷看……
迪拜大呲花
6楼-- · 2019-07-21 06:32
你好,你说的官方库同时使用两路USB的例程在哪儿能找到,我没找到~

一周热门 更多>