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.
您好!
我一直在尝试使用 TM4C1924NCPDT 的一个串行接口和一个批量接口来实现 USB 2.1复合器件。 我尝试搜索源代码、但无法找到使用 Tivaware USBlib 进行此操作的方法。
我缺少什么吗? 有人能给我指出这方面的正确方向吗?
谢谢!
-高拉夫
[引用 user="Gaurav Pandit"]
器件型号:TM4C1294NCPDT
您好!
我一直在尝试使用 TM4C1924NCPDT 的一个串行接口和一个批量接口来实现 USB 2.1复合器件。 我尝试搜索源代码、但无法找到使用 Tivaware USBlib 进行此操作的方法。
我缺少什么吗? 有人能给我指出这方面的正确方向吗?
[/报价]
我对 USB 库的理解是、他们认为"复合"器件实际上是一个具有多个相同器件类实例的器件。 也就是说、考虑一个在两个方向上都有两个串行端口的 CDC 器件。
从 USB 的角度来看、复合器件实际上是具有多个接口的器件。 例如、标准 USB 音频设备实际上是一个复合设备、因为它具有一个音频控制接口和一个或多个音频流接口。 但是、TI USB 库不会将其音频类驱动程序视为"复合"驱动程序。
当您浏览库时、您会看到它试图变得非常聪明。 如果您的器件有两个实例、它将确定要使用的端点并跟踪所有端点。 但这是一个完整的莲花意大利面,而指向结构的重定向和指向结构的指针正在令人抓狂。
这意味着您无法使用 TivaWare 框架轻松地将两个接口固定在一起。
USB 库的文档中有一小部分介绍了如何实现该库不支持的器件类。 从那里开始。 基本上、您应该为复合器件创建描述符、然后使其与 tConfigHeader 和 tConfigSections 类型配合使用。
然后创建 tCustomHandlers 结构的实例。 此结构保存您所有有关 USB 事件的回调。 该库可处理大多数事件(如枚举),但有一些需要处理的事项,主要是端点数据传输。
然后、描述符和处理程序结构被打包成 tDeviceInfo 结构。 然后该结构作为参数在调用 USBDCDInit()时传递。
为了使其全部正常工作、最重要的是描述符正确、以及您处理端点数据。 USB_DEV_BULK 等示例会给您带来很多障碍。 该示例使用 tUsbBuffer、这是一个位于端点数据处理程序和应用程序之间的软件环缓冲区。 您可以放弃它!
所有操作都在包含在 tCustomHandlers 结构中的 Endpoint Handler 中完成。 有一个 USB 中断由库首先处理。 如果库无法处理该条件,它将调用您定义的处理程序。 在处理程序中、您处理触发中断的数据或条件。
总之、如果您认为该库令人困惑、您就不会错。
尊敬的 Andy:
感谢您发表这篇非常详细的文章。 您已经很好地描述了整个情况! 我会和大家一起同意图书馆令人困惑。 它使我以及继承它的人感到沮丧。
您好、Gaurav、
正如 Andy 所说的、这种能力本身并不是 USB 库的一部分、因此您需要在您的末端完成实施 我同意 Andy 关于如何执行该任务的指导。
还有一件事。 Ralph 知道我一直在(作为支付账单的后台任务)实施 USB MIDI、这可能是人们想象中最简单的通信格式。 USB MIDI 设备与音频类设备的复合方式相同。 有一个音频控制接口和一个(单个) MIDI 流接口。 (实际上、可以向器件添加一个或多个音频流接口。) 我之所以这么做、是因为我的设计需要它。
昨天晚上我终于得到了 USB 输出传输来工作了!
USB MIDI 通过批量端点发送四字节消息。 端点数据包可以包含其中一条或多条消息。 对于输出事务(主机到器件)、HandleEndpoints 处理程序(由主 USB0 ISR 调用)会检查中断状态(传递给回调)以确保中断来自我的输出端点、然后检查端点状态以查看是否为"接收数据包就绪"。
如果是这样、我将得到输出传输中实际接收到的字节数(USBEndpointDataAvail)、然后实际将数据从端点 FIFO 传输到本地64字节(最大包大小)缓冲区(USBEndpointDataGet)。 然后我获取该缓冲区、并使用它来构建四字节 USB MIDI 数据包。 每个数据包都被压入 FIFO。 最后、我会 ACK 数据(USBDevEndpointDataAck)、以使主机知道数据包已被接受。 这是我卡在打开状态的 ACK、但批量器件示例在 USBDBulkPacketRead 中有该 ACK 调用、因此添加后、传输工作正常。
主循环监视我的消息 FIFO、如果它有消息、它会一次弹出一个消息、并将每个消息的内容打印到终端(UARTprintf)。 下一步是对消息执行更有用的操作、例如响应控制更改消息的指示灯 LED、或者将消息路由到基于 UART 的真正 MIDI 端口。 (基于 UART 的 MIDI 工作正常。)
下一步是响应按钮按下操作的 USB 输入事务。 我将构建消息数据包并将其推送到 FIFO、但问题是如何开始传输? 我过去所做的是将数据排队以在缓冲区中发送、然后调用在传输完成时调用的 ISR。 ISR 将查看是否有更多字节要发送、如果有、则会启动该过程。 但我不知道在这种情况下如何调用 ISR (或者更有可能是 EndpointHandler 回调)。
感谢 Andy 和 Ralph 的指导! 我不是很期待得到这么好的回应! 真的很感谢!
USB 库有点令人困惑、但我想我会为所有 USB 请求绘制一个地图或一些内容、以便更好地了解该结构并为我的应用正确配置它。 )