找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[NUC] 【求助】USB带电状态下枚举后第一次数据上传,PC收不到

[复制链接]
跳转到指定楼层
楼主
匿名  发表于 2018-6-29 15:51:42 回帖奖励 |倒序浏览 |阅读模式

各位大佬好,我在工作使用NUC123这款设备,发现芯片带电情况下进行USB枚举后的第一次的上传数据,
PC有几率收不到,通过Debug发现设备发送了,但是PC就是没收到。
于是在NUC123例程Keyboard的基础上做了小修改,通过短接连接PD2( 64 pin51引脚)和地,每连接一次会上传keyboard的两条数据 00 00 04 00 00 00 00 00 和 00 00 00 00 00 00 00 00从而输出一个字母a,但是发现实际测试中设备带电下插上USB枚举后的第一次操作,同样有几率PC收不到00 00 04 00 00 00 00 00只能收到00 00 00 00 00 00 00 00,请问各位大佬有遇到这种情况吗?
小弟在此附上上述测试代码,希望大佬们赐教。

USBD_HID_Keyboard.zip

15.55 KB, 下载次数: 1266

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 顶 踩
回复

使用道具

沙发
a_ziliu 发表于 2018-7-5 10:46:54 | 只看该作者
第一次应该在main之前放入usb buffer之中,後开usb中断,才会第一次取走00 00 04 00 00 00 00 00的资料。
int32_t main(void)
{
    /* Unlock protected registers */
    SYS_UnlockReg();

    SYS_Init();
    UART0_Init();

    printf("\n");
    printf("+--------------------------------------------------------+\n");
    printf("|          NuMicro USB HID Keyboard Sample Code          |\n");
    printf("+--------------------------------------------------------+\n");
    printf("If PB.15 = 0, just report it is key 'a'.\n");

    USBD_Open(&gsInfo, HID_ClassRequest, NULL);

    /* Endpoint configuration */
    HID_Init();
    USBD_Start();
    buf[2] = 0x04; /* Key A */
    USBD_SET_PAYLOAD_LEN(EP2, 8);
    NVIC_EnableIRQ(USBD_IRQn);


    /* start to IN data */
    g_u8EP2Ready = 1;
   
    GPIO_SetMode(PD, BIT2, GPIO_PMD_INPUT);
    GPIO_EnableInt(PD, 2, GPIO_INT_FALLING);
    NVIC_EnableIRQ(GPCDF_IRQn);
    GPIO_SET_DEBOUNCE_TIME(GPIO_DBCLKSRC_LIRC, GPIO_DBCLKSEL_2);
    GPIO_ENABLE_DEBOUNCE(PD, BIT2);
   
    while(1)
    {
        HID_UpdateKbData();
    }
}
回复 支持 反对

使用道具 举报

板凳
匿名  发表于 2018-7-9 09:52:03
a_ziliu 发表于 2018-7-5 10:46
第一次应该在main之前放入usb buffer之中,後开usb中断,才会第一次取走00 00 04 00 00 00 00 00的资料。
i ...

不行呀,朋友。我这个不是上电一瞬间无法接到,而是只要USB重新枚举后不管等多久都有概率PC接不到第一条数据
回复 支持 反对

使用道具

地板
a_ziliu 发表于 2018-7-9 10:00:59 | 只看该作者
這跟上電無關,usb enum之後,就開始要資料。
先把endpoint 2資料準備好,讓usb取走
回复 支持 反对

使用道具 举报

5#
匿名  发表于 2018-7-9 14:49:11
a_ziliu 发表于 2018-7-9 10:00
這跟上電無關,usb enum之後,就開始要資料。
先把endpoint 2資料準備好,讓usb取走 ...

谢谢回复,那要是实际键盘环境下,枚举后没有键盘按下也要准备endpoint 2的资料(空的无效的数据),然后通过USBD_SET_PAYLOAD_LEN 发上去,您看是这个思路吗?
回复 支持 反对

使用道具

6#
a_ziliu 发表于 2018-7-10 09:12:58 | 只看该作者
是的,基本上USB DEVICES都是准备好资料,让主机端来拿走。
回复 支持 反对

使用道具 举报

7#
匿名  发表于 2018-7-10 10:18:15
a_ziliu 发表于 2018-7-10 09:12
是的,基本上USB DEVICES都是准备好资料,让主机端来拿走。

谢谢大神,我还有几点疑问,
1.如果是需要提前上传,为什么这个现象是有再现率的呢?
2.如果有再现率的话,用户在插上键盘后有概率通过Bus Hound抓包发现第一条无效数据,这个能避免吗?
3.您之前说后开USB中断,如果是自带电池供电的键盘USB中断这块,如何处理好呢(是枚举成功后断开USB中断,然后准备usb buffer资料,在开启USB中断?)
回复 支持 反对

使用道具

8#
匿名  发表于 2018-7-10 10:48:25
a_ziliu 发表于 2018-7-10 09:12
是的,基本上USB DEVICES都是准备好资料,让主机端来拿走。

无效数据可以发0字节码,像这样USBD_SET_PAYLOAD_LEN(EP2, 0);
回复 支持 反对

使用道具

9#
匿名  发表于 2018-7-10 13:57:02
我这边也有同样问题,搬小板凳坐等大神回复
回复 支持 反对

使用道具

10#
a_ziliu 发表于 2018-7-11 10:30:33 | 只看该作者
1.如果是需要提前上传,为什么这个现象是有再现率的呢?
2.如果有再现率的话,用户在插上键盘后有概率通过Bus Hound抓包发现第一条无效数据,这个能避免吗
照我的流程,用catc抓是正常的
代碼跟你的電池供電無關。
基本上,mcu有電就開始跑代碼。
有usb plug event的時侯,就可以先寫資料到usb usb buffer之中。
回复 支持 反对

使用道具 举报

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

本版积分规则

新唐MCU