This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
在有些情况下、 通过 USBGPCS 进行的外部未配置模拟 VBUS、ID 引脚寄存器控制 可能会随机地在 USBLIB 控制中恢复到 POR 状态。
Tivaware USB 库是否随机检查 USBGPCS 0x41C 的状态以确定主机连接的端点是否仍然连接?
VBUS 似乎 未配置、ID 引脚通过 USBGPCS 强制为高电平、 如果在 某个一致 的时间范围内不刷新、则可能会任意地吊销引脚启用状态。 同样、启用 GPIO 的模拟 VBUS、ID 引脚断开客户端端点连接的频率似乎较低、但也会随机发生。 相对于 同时占用 AHB 总线的其他外设、USB0时钟控制和寄存器读取似乎并不没有缺陷。
点是 USB0的 AHB 时序、寄存器对 USBGPCS 的读取 随机显示了当 多个其他 NVIC 中断源(持续)占用 AHB 时跳过 CPU 节拍的证据(勘误表)。 这是在 USB0端点的不稳定行为中可以得出的最合乎逻辑的扣减、因为没有 充分理由随机断开连接。 我们碰巧将高 PWM 外设连接到活动 状态、而 NVIC 和应用程序执行(CPU) 在 AHB 时序问题中极有可能出现 与 USB 库调用相关的问题、从 USBGPCS 寄存器中设置的位刷新状态。
您好、Charles、
由于 在 客户端 发布异常后进入 PC (CDC)的目标接口链路保持连接、因此 USBGPCS 似乎没有变化。 批量设备客户端异常报告 在断开端点后 RX 管道中发生错误?
USB 节拍定时器调用7个已建立的端点 、在错过的节拍周期内似乎无法扫描 USBGPCS 寄存器。 因此、计时器会认为客户端在不启动端点断开时启动了端点断开连接。 通常、如果从目标或主机上拔下 USB 电缆、则会发生远程管道的 USB 端点拆卸。 除非我们从端口上物理移除 USB 电缆、否则调试观察 USB0连接状态(UARRTprintf ())绝不会报告断开连接/连接。 当 禁用模拟 GIPO PB1、PB2时、可切换 VBUS/ID 引脚极性或通过 USBGPCS 寄存器强制拉高。 因此、在更新或配置 USBGPCS 的方式中、也会发生相同的端点异常故障。
奇怪 的是、只有6个节拍处理器配置用于7个批量端点、在 AHB 流量较重的情况下、端点管道数据的 UDMA 传输可能无法足够快地清空环形缓冲区。 有时 、Windows 批量客户端上的管道异常会立即发生。 在 AHB 流量较重的其他情况下、多个 IOT 可变打印状态的批量数据传输 会持续几 个报告周期、然后崩溃。 修复目标 批量器件端点的唯一方法 是 重新插入 USB 电缆并 重新启动 器件客户端。 目标应自动重建 断开的管道、因为 USBGPCS 从未指示 USB 电缆已从目标上拔下。 似乎链接到 CDC 低级驱动程序 的7个端点应始终通过 tick 处理程序和循环 USB 库调用作为目标端点管道链接的一部分进行刷新。 这甚至可能是要指责的批量设备 Windows 客户端、但 管道断开似乎是从目标发起的。
bool USBDeviceConfig (tDCDInstance * psDevInst、const tConfigHeader * psConfig) { uint32_t ui32Loop、ui32Count、ui32NumInterfaces、ui32EpIndex、ui32EpType、 ui32MaxPkt、ui32NumEndpoints、ui32Flags、ui32BytesUsed、 ui32段; tInterfaceDescriptor *psInterface; tEndpointDescriptor *psEndpoint; tUSBEndpointInfo psEPInfo[NUM_USB_EP - 1];//NUM_USB_EP = 8 // //此配置描述的端点总数是多少? // ui32NumEndpoints = USBDCDConfigDescGetNum (psConfig、 USB_DTYPE_终结 点); }
// // //此内部函数初始化处理计时器 //节拍中使用的变量。 // //此函数只能从 USB 库中调用。 它设置 //以确保在必要时可以多次调用,而不 擦除//之前的配置(以适应 OTG 模式切换)。 // //\返回无。 //// ***************** void InternalUSBTickInit (void) { uint32_t ui32Loop; if (!g_bUSBTimerInitialized) { for (ui32Loop = 0;ui32Loop < MAX_USB_TICK _处理程序;ui32Loop ++) { G_pfnTickHandlers[ui32Loop ]=(tUSBTickHandler) 0; G_pvTickInstance[ui32Loop ]= 0; } G_bUSBTimerInitialized = true; } }
另一个与 USB 机罩下的模块时序相关的发现可能与 CPU 未分频注意的高优先级外设(PWM、ADC0)中断的保养间隔相关。
// // // usblibpriv.h -用于共享内部变量和 //的私有头文件 不同模块之间的函数原型 // 库。 应用程序代码不得使用此标头。
// // //在器件和 //主机模式中从主向量调用的内部中断处理程序。 //// ***************** extern void USBDeviceIntHandlerInternal (uint32_t ui32Index、 uint32_t ui32Status); extern void USBHostIntHandlerInternal (uint32_t ui32Index、uint32_t ui32Status);
// // //系统中可以注册的最大节拍处理程序数。 //// ***************** #define MAX_USB_TICK 处理程序 6 //************* // //此值定义在对 InternalUSBStartOfFrameTick 进行调用之前必须通过的 SOF 节拍数//。 值5确保 每5毫秒调用一次//函数、前提是启用了 SOF 中断 并且存在 SOF。 //// ***************** #define USB_SOF_TICK 除法5
您好、Ralph、
我认为 数据表并不是专门针对 典型的 USB 单点连接、而是给出了一个总括声明、要求在外部 PHY (集线器)要求60MHz 时钟速率的情况下实现480Mbps 的传输速度。 无法实现到 端点的480Mbps 数据包传输、因此 我需要了解外部 PHY 总线速度 是文本所指的内容。 希望 NDA USB PDF 对此要求有更好的了解。
至少在16MHz USB 时钟和25MHz MOSC 下、目标方不会随机地对主机器件的末端管道进行散列。 在 缓冲器完全状态处理的 USB 库管理中、似乎并不完全正确、因为 即使 在16MHz 下、它也会通过高速数据传输来使终端管道迅速崩溃。 下面 是数据包传输 完成 后的阈值测试、检查环形缓冲区空间是否 小于128字节。 禁用缓冲区检查 会导致通过 非中断 的数据包 传输快速对终端管道客户端进行散列。 通常 、应用 会以 1秒的间隔处理64字节数据包传输到批量器件。 因此 、这不像向 批量设备客户端传输非中断的数据包那样易失。 即使是1秒的间隔 、当 AHB 在高优先级 NVIC INT 挂起时变得真正繁忙时、似乎也会从阻止的 USB 状态更新中快速填充缓冲区。
// uint32_t TxHandler (void *pvCBData、uint32_t ui32Event、uint32_t ui32MsgValue、 void *pvMsgData) { uint32_t ui32space; // //我们不需要对任何发送事件进行任何响应 //。 我们所做的就是更新传输计数器。 // if (ui32Event == USB_EVENT_TX_COMPLETE) { // //传输缓冲区中有多少空间? // ui32Space = USBBufferSpaceAvailable (&g_sTxBuffer); if (ui32Space < 128) { /*刷新任何溢出数据的 TX 缓冲区*/ USBBufferFlush (&g_sTxBuffer); } G_ui32TxCount += ui32MsgValue; } 返回(0); }
您好 BP101、
[引用 user="BP101"]在 缓冲区完整状态处理的 USB 库管理中,似乎有些事情并不完全正确,因为 即使 在16MHz 下,它也会通过高速数据传输来使终端管道迅速崩溃。
您是真正使用高速模式还是仅使用全速模式? 没有多少人使用高速模式。 如果您使用的是高速、请检查应用以下错误修复是否有帮助: e2e.ti.com/.../2518648
[引用 USER="BP101]< 数据包传输 完成 后的阈值测试,检查环形缓冲区空间是否 小于128字节。 禁用缓冲区检查 会导致通过 非中断 的数据包 传输快速对终端管道客户端进行 trashing。
我不确定您在这里要证明的是什么、当然、禁用缓冲区检查会使情况变得混乱。 如果不需要它、那么它就不会出现在第一个位置。
您好、Ralph、
根据我的理解、USB0初始化期间正在设置 Bulk 器件驱动程序处于高速模式。
缓冲区状态是由我添加的、USB 库应该处理缓冲区空间状态回调、但当通过(USB_bulk_structs.c) typedef 结构体定义的缓冲区大小直接调用 USBBufferWrite()时、它不是一个很好的操作。
您好、Ralph、
[引用用户="Ralph Jacobi">USB 高速并不是那么简单... 您需要一个外部高速 USB PHY 来将高速与器件一起使用、然后必须打开正在使用高速的软件。 [/报价]
由于 ULPI 功能从未设置 (USB_dev_bulk.c) 调用 USBBulkInit()调用 USBDCDInit(),因此设备模式默认为 fs。 在下面、 如果从未配置 ULPI 功能模式、速度看起来实际上默认为 FS?
usbdenum.c -> USBDCDInit()
// //配置 ULPI 支持。 // if (g_ui32ULPISupport!= USBLIB_FEATE_ULPI_NONE)//none=0x0000.0000 { USBULPIEnable (USB0_BASE); if (g_ui32ULPISupport 和 USBLIB_FEATE_ULPI_HS) { ULPIConfigSet (USB0_BASE、ULPI_CFG_HS); } 其他 { ULPIConfigSet (USB0_BASE、ULPI_CFG_FS); } } 其他 { USBULPIDisable (USB0_BASE); }