AT32F437板单一USB口主从机切换方案

接口/总线/驱动

1120人已加入

描述

使用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);
}
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分