牛卧堂MCU技术交流

标题: nuc126 usb 不断电重新初始化usb [打印本页]

作者: 匿名    时间: 2024-5-21 10:21
标题: nuc126 usb 不断电重新初始化usb
usb初始化以后,通过usb和主机通讯,拿到设定的屏幕尺寸,然后需要重写 PHYSICAL_MAXIMUM和LOGICAL_MAXIMUM两个数据的值,怎么在不断电重启的情况下,重新初始化usb?
我尝试过直接改值(已经去掉const),然后执行下列函数,但是在主机的设备管理器中会出现设备错误
        SYS_UnlockReg();
        USBD_Open(&gsInfo, HID_ClassRequest, NULL);
        /* Endpoint configuration */
        HID_Init();
        USBD_Start();
        
        /* Enable USB device interrupt */
        NVIC_EnableIRQ(USBD_IRQn);

        /* Clear SOF */
        USBD->INTSTS = USBD_INTSTS_SOFIF_Msk;
        
        /* Lock protected registers */
        SYS_LockReg();
作者: chrishu    时间: 2024-5-21 16:02
可以设置 SE0,再调用 USB_Start重新启动(清除 SE0、使能 PHY和 usb控制器)试试。
设置 SE0=0,再使能 SE0=1 ,让总线强制拉低,再将 D+通过内部上拉电阻拉高。主机检测到这个状态变化后重新枚举。
作者: 匿名    时间: 2024-5-21 17:03
chrishu 发表于 2024-5-21 16:02
可以设置 SE0,再调用 USB_Start重新启动(清除 SE0、使能 PHY和 usb控制器)试试。
设置 SE0=0,再使能  ...

我尝试了如下的函数组合,但是执行完后设备管理器中报错:该设备无法启动。 (代码 10),在报告描述符中找到未知项目。

USBD_CLR_SE0();
USBD_Open()//This function will enable USB controller, USB PHY transceiver and pull-up resistor of USB_D+ pin. USB PHY will drive SE0 to bus.

USBD_Start();




另外:我尝试在usb第一次初始化的时候(mian 函数中),就修改报告描述符的数组(全局变量),也会导致usb设备报:该设备无法启动。 (代码 10),在报告描述符中找到未知项目。
是否usb的报告描述符无法动态二次修改?
extern uint8_t HID_DigitizerReportDescriptor[];
main()
{
    HID_DigitizerReportDescriptor[58] = HID_DigitizerReportDescriptor[61] = 0x34;
    HID_DigitizerReportDescriptor[59] = HID_DigitizerReportDescriptor[62] = 0x03;
   
    HID_DigitizerReportDescriptor[68] = HID_DigitizerReportDescriptor[71] = 0x64;
    HID_DigitizerReportDescriptor[69] = HID_DigitizerReportDescriptor[72] = 0x05;

    USBD_Open(&gsInfo, HID_ClassRequest, NULL);

    /* Endpoint configuration */
    HID_Init();
    USBD_Start();

    /* Enable USB device interrupt */
    NVIC_EnableIRQ(USBD_IRQn);


  while()
}
作者: Angus    时间: 2024-5-21 17:34
先  USBD_SET_SE0(); 延时10ms,再 USBD_CLEAR_SE0();  不必做其它事情 HOST 就会对 DEVICE 重新枚举。
作者: 匿名    时间: 2024-5-21 17:47
Angus 发表于 2024-5-21 17:34
先  USBD_SET_SE0(); 延时10ms,再 USBD_CLEAR_SE0();  不必做其它事情 HOST 就会对 DEVICE 重新枚举。 ...

尝试了如下操作:

        HID_DigitizerReportDescriptor[58] = HID_DigitizerReportDescriptor[61] = 0x34;
        HID_DigitizerReportDescriptor[59] = HID_DigitizerReportDescriptor[62] = 0x03;
        
        HID_DigitizerReportDescriptor[68] = HID_DigitizerReportDescriptor[71] = 0x64;
        HID_DigitizerReportDescriptor[69] = HID_DigitizerReportDescriptor[72] = 0x05;

        
        USBD_SET_SE0();
        CLK_SysTickDelay(1000);
        CLK_SysTickDelay(1000);
        CLK_SysTickDelay(1000);
        CLK_SysTickDelay(1000);
        CLK_SysTickDelay(1000);
        CLK_SysTickDelay(1000);
        CLK_SysTickDelay(1000);
        CLK_SysTickDelay(1000);
        CLK_SysTickDelay(1000);
        CLK_SysTickDelay(1000);
        USBD_CLR_SE0();
执行完后设备管理器中报错:该设备无法启动。 (代码 10),在报告描述符中找到未知项目。
目前来看,报告描述符的全局数组,一旦在函数中进行改写就会导致设备出错,也不知道为什么

作者: 匿名    时间: 2024-5-21 18:34
Angus 发表于 2024-5-21 17:34
先  USBD_SET_SE0(); 延时10ms,再 USBD_CLEAR_SE0();  不必做其它事情 HOST 就会对 DEVICE 重新枚举。 ...

多谢,已经解决了。是数组下标搞错,导致数组写错位了,导致报错,修正下标以后,方法是有效的




欢迎光临 牛卧堂MCU技术交流 (http://nuvoton-mcu.com/) Powered by Discuz! X3.2