完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
尝试STM32F103VB上使用tinyusb,完成配置之后开始没有反应。调试后发现
这个上拉电阻的实现需要手动实现控制:
之后调试发现设备还是无法识别: 之后打开TinyUSB的调试日志
之后上电出现调试信息:
从调试信息上看,有获取设备描述符的指令执行
此指令确实是有执行的,于是使用逻辑分析仪抓取USB数据 可以看到获取设备描述符的指令,在附近查找相关指令回复 展开回复: 看到设备也是有回复的 但是这个设备就是无法识别! 后面多抓取一些数据,发现,只是第一次有回应,后面的多次发送都没有回应 好像确实是没有回应PC的获取设备描述符,但是既然能回应一次,为何后面的数据就发送不出来了? 我的配置参数如下:
|
|
相关推荐
1个回答
|
|
|
我们遇到的问题是在STM32F103VB上使用TinyUSB时,设备无法识别,调试信息显示设备描述符请求失败。从日志中我们可以看到,主机发送了获取设备描述符的请求(80 06 00 01 00 00 40 00),并且TinyUSB已经将描述符(18字节)通过端点0发送出去了(Queue EP 80 with 18 bytes ... 然后Xfer Complete)。但是设备仍然无法被识别,可能的原因和解决方案如下: 1. **硬件连接问题**: - 检查USB数据线是否正常,尝试更换数据线。 - 检查USB接口的DP(D+)引脚是否通过一个1.5kΩ的电阻上拉到3.3V(对于全速设备)。在STM32上,通常需要外部上拉电阻。有些STM32芯片内部有可控制的上拉电阻,但STM32F103VB可能没有,或者需要软件控制。 2. **上拉电阻的控制**: - 根据你的描述,你已经手动实现了上拉电阻的控制(`dcd_disconnect`和`dcd_connect`)。在TinyUSB中,通常会在初始化后调用`tud_connect()`来使能上拉电阻(内部或外部)。请确保在初始化后调用了这个函数。 - 如果你使用的是外部上拉电阻,则需要在初始化时将其使能(例如,将GPIO设置为高电平)。如果你使用的是内部上拉,那么需要确保正确配置了USB外设的内部上拉。 3. **USB时钟配置**: - STM32F103的USB外设需要48MHz的时钟。通常,STM32F103使用72MHz的主频,然后通过分频得到48MHz的USB时钟。请检查你的时钟配置,确保USB时钟是48MHz。常见的配置是:PLL倍频到72MHz,然后USB预分频器设置为1.5分频(72/1.5=48MHz)。注意:分频系数必须是1.5,这需要设置RCC_CFGR的USBPRE位。 4. **描述符问题**: - 虽然日志显示发送了18字节的设备描述符,但可能描述符内容有误。检查设备描述符是否符合标准。特别是`bDeviceClass`,`bDeviceSubClass`,`bDeviceProtocol`,以及`idVendor`和`idProduct`等字段。 - 确保设备描述符的第一个字节是0x12(长度),第二个字节是0x01(设备描述符类型)。 5. **端点0的包大小**: - 设备描述符中有一个字段`bMaxPacketSize0`,表示端点0的最大包大小。全速设备通常为64字节。但请注意,在初始获取描述符请求时,主机可能只请求18字节(描述符长度),但设备必须能够处理最大包大小的请求。确保在设备描述符中设置正确的最大包大小(一般为64)。 6. **TinyUSB配置**: - 检查`tusb_config.h`文件中的配置,确保`CFG_TUSB_RHPORT0_MODE`设置为`OPT_MODE_DEVICE`,并且`CFG_TUSB_OS`设置为`OPT_OS_NONE`(如果你没有使用RTOS)或合适的RTOS选项。 - 确保已经实现了所有必要的描述符(设备描述符、配置描述符、字符串描述符等)和回调函数。 7. **电源问题**: - 确保USB端口提供足够的电源。有时USB端口可能会因为过流而关闭,检查电路是否有短路或过流。 8. **调试建议**: - 使用逻辑分析仪或USB协议分析仪捕获USB数据包,可以更直观地看到问题所在。 - 继续使用TinyUSB的调试输出,观察是否有其他错误信息。 根据你提供的日志,设备已经响应了设备描述符请求(发送了18字节),但主机可能没有收到或收到错误的数据,或者后续的请求出现了问题。因此,重点检查描述符内容是否正确,以及端点0的配置。 以下是一个基本的时钟配置示例(针对STM32F103VB): ```c void SystemClock_Config(void) { RCC_DeInit(); RCC_HSEConfig(RCC_HSE_ON); while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); // 8MHz * 9 = 72MHz RCC_PLLCmd(ENABLE); while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); // USB时钟配置:72MHz / 1.5 = 48MHz RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE); // 系统时钟配置为72MHz RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); while (RCC_GetSYSCLKSource() != 0x08); } ``` 另外,确保在初始化USB后调用`tud_connect()`(如果你使用内部上拉): ```c tusb_init(); tud_connect(); // 使能内部上拉电阻(如果支持)或控制外部上拉 ``` 如果芯片没有内部上拉,你需要控制外部上拉电阻的GPIO: ```c // 初始化时断开(保持上拉电阻无效) GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_12; // 假设DP接在PA12 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET); // 在初始化完成后,连接上拉电阻(将PA12置高,通过外部1.5k电阻上拉到3.3V) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET); ``` 请根据你的硬件连接调整GPIO引脚。 最后,检查你的描述符,例如: ```c tusb_desc_device_t const desc_device = { .bLength = sizeof(tusb_desc_device_t), .bDescriptorType = TUSB_DESC_DEVICE, .bcdUSB = 0x0200, // at least USB2.0 .bDeviceClass = 0x00, // 0x00 means each interface specifies its own class .bDeviceSubClass = 0x00, .bDeviceProtocol = 0x00, .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE, // must be 64 for high-speed device, but for full-speed 8,16,32,64 are valid .idVendor = 0xCafe, .idProduct = 0x4001, .bcdDevice = 0x0100, .iManufacturer = 0x01, .iProduct = 0x02, .iSerialNumber = 0x03, .bNumConfigurations = 0x01 }; ``` 希望这些建议能帮助你解决问题。如果问题依旧,请提供更多的调试信息。 根据您提供的调试信息,设备已经响应了设备描述符请求(发送了18字节),但主机仍无法识别设备。以下是系统化的解决方案: 1. 硬件上拉电阻问题(关键步骤)
2. 软件上拉控制(无内部上拉时)如果使用外部电阻,移除软件上拉控制代码( 在 3. 时钟配置检查(重点)STM32F103 USB需要精确的48MHz时钟: 验证方法:检查 4. USB描述符与配置在 设备描述符示例(确保bMaxPacketSize0=64): 5. 电源与信号完整性
6. 调试进阶在 如果主机发送SET_ADDRESS后无响应,检查地址配置是否正确。
通过以上步骤应能解决设备识别问题,重点排查硬件上拉和时钟分频配置。 |
|
|
|
|
只有小组成员才能发言,加入小组>>
184个成员聚集在这个小组
加入小组rtstudio是否可像keil加载ini解决虚拟串口与mcu串口通讯?
1211 浏览 0 评论
【Vision Board创客营连载体验】基于RA8D1-Vision Board的自动路径规划小车
1775 浏览 1 评论
【Vision Board创客营连载体验】基于Vision Board的垃圾分类
2156 浏览 0 评论
【Vision Board创客营连载体验】使用 Vision Board 做一个 UVC Camera
1777 浏览 0 评论
【Vision Board创客营连载体验】TinyMaix进行手写数字识别
2004 浏览 0 评论
1461浏览 5评论
在RT-Thread Studio中新建的stm32f407-atk-explorer工程运行qemu失败,是什么原因引起的?
1764浏览 3评论
为什么rt_device_read()只能读取到两个字节数据?
358浏览 3评论
连得上热点,但是ping baidu.com出现timeout,请问跟什么有关?
418浏览 3评论
412浏览 2评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 10:01 , Processed in 0.680773 second(s), Total 77, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
3692
