现在自己画了一块stm32F4的板子,板子上有USB主机(host)接口、USB从机(device)接口,让stm32F4的USB同时工作在主机模式和从机模式,PA11的OTG_FS_DM接从机usb的D-脚,PA12的OTG_FS_DP接从机usb的D+脚,此USB接口连接到电脑上,让stm32工作在从机模式;PB14的OTG_HS_DM接主机usb的D-脚,PB15的OTG_HS_DP接主机usb的D+脚,此USB接口连接usb hid 设备(如鼠标),让stm32工作在主机模式。现在我的从机模式PA11、PA12工作正常,但是主机模式PB14、PB15不能正常工作,插上鼠标后不能枚举出鼠标。查资料,USB OTG HS在不外接PHY的情况下可以当FS(全速)使用,于是我再定义两个宏,USE_USB_OTG_HS,USE_EMBEDDED_PHY,并且在usbh_conf.h里的#define USBH_MSC_MPS_SIZE 定义成64(HS模式是512,FS模式是64),怎么还是不能识别出鼠标设备,请问哪里的配置不对,或者我的思路不对吗,求USB大神!
相应的配置代码如下:
USBH_Init(&USB_OTG_Core_dev,USB_OTG_HS_CORE_ID,&USB_Host,&HID_cb,&USR_Callbacks);
//USB OTG 底层IO初始化
//pdev:USB OTG内核结构体指针
void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOB时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_OTG_HS, ENABLE);//使能USB OTG时钟 FS改成HS
//GPIOB14,B15设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_15;//PB14、15复用功能输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;//PB13推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出功能
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
USB_HOST_PWRCTRL=1; //开启USB HOST电源供电
GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_OTG_HS_FS);//PB14,AF12(USB) //GPIO_AF_OTG_FS改成GPIO_AF_OTG_HS_FS
GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_OTG_HS_FS);//PB15,AF12(USB) //GPIO_AF_OTG_FS改成GPIO_AF_OTG_HS_FS
}
//USB OTG 中断设置,开启USB FS中断
//pdev:USB OTG内核结构体指针
void USB_OTG_BSP_EnableInterrupt(USB_OTG_CORE_HANDLE *pdev)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = OTG_HS_IRQn; //FS改成HS
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;//抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;//子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能通道
NVIC_Init(&NVIC_InitStructure);//配置
} |