找回密码
 立即注册

QQ登录

只需一步,快速开始

打印 上一主题 下一主题
开启左侧

[NUC] nuc126 usb 不断电重新初始化usb

[复制链接]
跳转到指定楼层
楼主
匿名  发表于 2024-5-21 10:21:53 回帖奖励 |倒序浏览 |阅读模式
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();
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 顶 踩
回复

使用道具

沙发
chrishu 发表于 2024-5-21 16:02:30 | 只看该作者
可以设置 SE0,再调用 USB_Start重新启动(清除 SE0、使能 PHY和 usb控制器)试试。
设置 SE0=0,再使能 SE0=1 ,让总线强制拉低,再将 D+通过内部上拉电阻拉高。主机检测到这个状态变化后重新枚举。
回复 支持 反对

使用道具 举报

板凳
匿名  发表于 2024-5-21 17:03:24
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:43 | 只看该作者
先  USBD_SET_SE0(); 延时10ms,再 USBD_CLEAR_SE0();  不必做其它事情 HOST 就会对 DEVICE 重新枚举。
回复 支持 反对

使用道具 举报

5#
匿名  发表于 2024-5-21 17:47:36
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),在报告描述符中找到未知项目。
目前来看,报告描述符的全局数组,一旦在函数中进行改写就会导致设备出错,也不知道为什么
回复 支持 反对

使用道具

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

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

使用道具

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

新唐MCU