void USB_DeviceInit(void) { IE_USB = 0; // 禁止USB总中断 USB_CTRL = 0; /*USBD0控制器配置,缓冲区为固定地址(无需配置)*/ D0_EP0RES = UEP_R_RES_ACK | UEP_T_RES_NAK; D0_EP1RES = bUEP_X_AUTO_TOG | UEP_X_RES_ACK; D0_EP2RES = bUEP_X_AUTO_TOG | UEP_X_RES_NAK; D0_EP3RES = bUEP_X_AUTO_TOG | UEP_X_RES_NAK; D0_EP_MOD = bUX_DEV_EN | bUX_EP1O_EN; // 启用USBD0子设备,设置端点1为OUT,设置端点2-3为IN,禁用端点4-6 D0_ADDR = 0x00; // 复位USBD0设备地址 /*USBD1控制器配置,缓冲区为固定地址(无需配置)*/ D1_EP0RES = UEP_R_RES_ACK | UEP_T_RES_NAK; D1_EP1RES = bUEP_X_AUTO_TOG | UEP_X_RES_NAK; D1_EP2RES = bUEP_X_AUTO_TOG | UEP_X_RES_NAK; D1_EP3RES = bUEP_X_AUTO_TOG | UEP_X_RES_NAK; D1_EP_MOD = bUX_DEV_EN; // 启用USBD1子设备,设置端点1-3为IN,禁用端点4-6 D1_ADDR = 0x00; // 复位USBD1设备地址 HB_ADDR = 0x7F; // 将收到的数据直接转发到D0 USB_IF = 0xFF; // 清空USB中断标志寄存器 USB_IE = bUX_IE_SUSPEND | bUX_IE_TRANSFER | bUX_IE_BUS_RST; // 使能<总线挂起&唤醒&复位,数据传输完成>中断 USB_CTRL = bUX_DP_PU_EN; // 使能USB复合设备,启用DP内部上拉1.5K电阻 IE_USB = 1; // 使能USB总中断 }
问题一:
代码段中,单独注释掉USBD0或者USBD1,另一个USB子设备都能正常枚举成功。如果两个都保留,则只有USBD1子设备枚举成功,USBD0没有参与通信过程,照理来说应该两个子设备都能枚举才对。
问题二:
HB_ADDR=0x7F; 这句代码是从官方提供的实例代码照抄的,它的作用是什么? USBHUB的地址不需要上位机分配吗?