OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9529|回复: 6

使用STM32F4同时挂载两个U盘

[复制链接]

5

主题

277

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1522
金钱
1522
注册时间
2014-5-16
在线时间
217 小时
发表于 2016-7-28 18:21:46 | 显示全部楼层 |阅读模式
本帖最后由 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.0\Projects\STM324xG_EVAL\Applications\USB_Host\DualCore_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]





正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

0

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2015-9-27
在线时间
10 小时
发表于 2016-8-28 21:24:59 | 显示全部楼层
能做到这两个U盘的数据的交互吗?
回复 支持 反对

使用道具 举报

5

主题

277

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1522
金钱
1522
注册时间
2014-5-16
在线时间
217 小时
 楼主| 发表于 2016-8-28 22:09:36 | 显示全部楼层
Tmss2 发表于 2016-8-28 21:24
能做到这两个U盘的数据的交互吗?

要两个U盘数据交互,当然没问题,就是要做一些文件系统的配置,因为FatFs默认只挂一个盘.
回复 支持 反对

使用道具 举报

0

主题

0

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2015-9-27
在线时间
10 小时
发表于 2016-8-29 10:37:17 | 显示全部楼层
zmingwang 发表于 2016-8-28 22:09
要两个U盘数据交互,当然没问题,就是要做一些文件系统的配置,因为FatFs默认只挂一个盘.

最近一直在搞这个。
这样子挂载两个U盘,那两个都是全速,传输速率有点低啊。即便是HS外接PHY,数据交互也会受到FS的上限限制,有什么好的建议么?
回复 支持 反对

使用道具 举报

5

主题

277

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1522
金钱
1522
注册时间
2014-5-16
在线时间
217 小时
 楼主| 发表于 2016-8-29 10:48:54 | 显示全部楼层
Tmss2 发表于 2016-8-29 10:37
最近一直在搞这个。
这样子挂载两个U盘,那两个都是全速,传输速率有点低啊。即便是HS外接PHY,数据交互 ...

方法一,STM32的HS通过高速PHY连接一个HUB,U盘挂在HUB上.
方法二,用两个STM32,HS通过高速PHY分别连接一个U盘,两个MCU通过SPI通信
回复 支持 反对

使用道具 举报

0

主题

0

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2015-9-27
在线时间
10 小时
发表于 2016-8-29 11:44:58 | 显示全部楼层
zmingwang 发表于 2016-8-29 10:48
方法一,STM32的HS通过高速PHY连接一个HUB,U盘挂在HUB上.
方法二,用两个STM32,HS通过高速PHY分别连接一个 ...

没想过第二种,倒是有考虑第一种方法。
谢谢了,搞出来了就分享出来。
回复 支持 反对

使用道具 举报

6

主题

94

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1581
金钱
1581
注册时间
2016-7-2
在线时间
277 小时
发表于 2017-7-3 16:30:36 | 显示全部楼层
你好,你说的官方库同时使用两路USB的例程在哪儿能找到,我没找到~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-18 22:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表