FAQ0094 AT32 USB 不断开连接, USB 设备重新枚举操作
作者:互联网
适用型号: AT32F403, AT32F413, AT32F403A, AT32F415
Questions:USB 不断开连接, USB 设备重新枚举操作
Answer:
AT32F403 和 AT32F413, AT32F403A, AT32F415 USB 设备重新枚举控制是不一样的, 以下分别进行介绍
1. AT32F403 和 AT32F413 控制方式
直接在USB 初始化后 while ( 1 )中调用, 在电脑上可以看到 USB 会有不断枚举过程
Power_Off ();
Delay_ms(3000);
Power_On ();
Delay_ms(3000);
RESULT Power_On(void)
{
u16 wRegVal;
pInformation->Current_Configuration = 0;
/*** CNTR_PWDN = 0 ***/
wRegVal = CTRL_FRST;
_SetCTRL(wRegVal);
/* USB interrupts initialization */
/* clear pending interrupts */
_SetINTSTS(0);
wInterrupt_Mask = IMR_MSK;
/* set interrupts mask */
_SetCTRL(wInterrupt_Mask);
bDeviceState = UNCONNECTED;
}
RESULT Power_Off ()
{
_SetCTRL(CTRL_FRST);
/* clear interrupt status register */
_SetINTSTS(0);
/* Disable the Pull-Up*/
//USB_Cable_Config(DISABLE);//
/* switch-off device */
_SetCTRL(CTRL_FRST + CTRL_PDWN);
}
2. AT32F403A 控制方式
USB SOF控制寄存器( USB_SOFEN) 地址偏移: 0x60
直接在USB 初始化后 while ( 1 )调用, 在电脑上可以看到 USB 会有不断枚举过程
Power_Off ();
Delay_ms(3000);
Power_On ();
Delay_ms(3000);
#define SOFEN ((__IO unsigned *)(RegBase + 0x60))
#define _SetSOFEN(wRegValue) (*SOFEN = (uint16_t)wRegValue)
void Power_On(void)
{
u16 wRegVal;
wRegVal = 0x0000;
_SetSOFEN(wRegVal);
}
void Power_Off(void)
{
u16 wRegVal;
wRegVal = 0x0002;
_SetSOFEN(wRegVal);
}
3. AT32F415 控制方式
OTG_FS设备控制寄存器(OTG_FS_DCTL) 地址偏移: 0x804
直接在USB 初始化后 while ( 1 )调用, 在电脑上可以看到 USB 会有不断枚举过程
Power_Off (&USB_OTG_dev);
Delay_ms(3000);
Power_On (&USB_OTG_dev);
Delay_ms(3000);
void Power_On(USB_OTG_CORE_HANDLE *pusbdev)
{
USB_OTG_DCTL_Type dctl_cfg;
dctl_cfg.u32val = 0;
dctl_cfg.b.sftdis = 0;
USB_OTG_WRITE_R32 (&pusbdev->regs.DREGS->DCTRL, dctl_cfg.u32val);
}
void Power_Off(USB_OTG_CORE_HANDLE *pusbdev)
{
USB_OTG_DCTL_Type dctl_cfg;
dctl_cfg.u32val = 0;
dctl_cfg.b.sftdis = 1;
USB_OTG_WRITE_R32 (&pusbdev->regs.DREGS->DCTRL, dctl_cfg.u32val);
}
标签:断开连接,dctl,USB,Power,cfg,OTG,FAQ0094,wRegVal 来源: https://blog.csdn.net/qq_19947653/article/details/113746890