接口/总线/驱动
使用AT32F437板上只预留了一个USB口,只有D+ D-两根数据线,需要根据要求,切换主机或从机功能。
由于没有找到现成的方案,自己摸索了下,已经实现,记录如下:
变量USB_HostDevice_Flag 为主从机标志,0主机 1从机
首先修改中断函数
void OTGFS1_IRQHandler(void)
{
/* enter interrupt /
rt_interrupt_enter();
if (USB_HostDevice_Flag)
{
USBD_IRQ();//usbd_irq_handler(p_usbfs_instance->p_otg_core);
}
else
{
USBH_IRQ();//usbh_irq_handler(p_usbfs_instance->p_otg_core);
}
/ leave interrupt */
rt_interrupt_leave();
}
然后程序中只需要根据要求,在切换主从机模式时,使用at32_dcd_init()或at32_hcd_init()即可。
if ("需要进入从机模式")
{
if (!USB_HostDevice_Flag)
{
LOG_D("USB_Device_Flag");
at32_dcd_init();
USB_HostDevice_Flag = TRUE;
}
}
else"需要进入主机模式"
{
if (USB_HostDevice_Flag)
{
LOG_D("USB_Host_Flag");
at32_hcd_init();
USB_HostDevice_Flag = FALSE;
}
}
备注下:device模式下,拔出usb线,不会调用usbd_disconnectCallback函数,需要将函数usbd_irq_handler修改下,在usb suspend interrupt 时 增加调用usbd_disconnectCallback(udev);
/* usb suspend interrupt */
if(intsts & USB_OTG_USBSUSP_FLAG)
{
usbd_suspend_handler(udev);
usbd_disconnectCallback(udev);
usb_global_clear_interrupt(usbx, USB_OTG_USBSUSP_FLAG);
}
全部0条评论
快来发表一下你的评论吧 !