本帖最后由 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中有体现:
可见,USB_OTG_HS和USB_OTG_FS都有PHY.
并且,USB_OTG_HS还带有DMA,可提高性能,在datasheet中有说明:
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]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>