9

我的任务是为嵌入式设备编写一个设备驱动程序,它将通过 SPI 接口与微控制器通信。最终,USB 接口将用于从外部下载更新的代码并在验证阶段使用。

我的问题是,有没有人知道一个好的参考设计或文档或在线教程,其中涵盖了嵌入式系统中 USB 协议栈/设备驱动程序的实现/设计?我刚刚开始阅读 650 页的 USB v2.0 规范目前有点令人生畏。

仅供参考,我使用的微控制器是飞思卡尔 9S12。

标记

根据 Goldenmean 的 (-AD) 评论,我想添加以下信息:

1) 嵌入式设备使用自定义执行程序,不使用 COTS 或 RTOS。

2) 设备将使用中断来指示数据已准备好从设备中检索。

3) 我已经阅读了一些关于 Linux 的文档,但是由于我对 Linux 一点也不熟悉,所以目前它不是很有帮助(尽管我希望它会很快)。

4) 设计方法,至少现在,它为 USB 设备编写设备驱动程序,然后 USB 协议层 (I/O) 将驻留在设备驱动程序的顶部以解释数据。我认为这将是最好的方法,尽管我可能是错的。

编辑 - 一年后

我只是想在它们从我脑海中消失之前分享一些东西,以防我再也不会在 USB 设备上工作。在开发代码并首次启动和运行时,我遇到了一些障碍。

我遇到的第一个问题是,当 USB 设备连接到主机(在我的情况下为 Windows)时,主机发出了重置请求。USB 设备将复位并清除中断使能标志。我没有阅读足够多的文献来知道这种情况正在发生,因此我从未收到设置请求中断。我花了很长时间才弄清楚这一点。

我遇到的第二个问题是没有正确处理 Set_Configuration 的设置请求。我正在处理它,但我没有正确处理请求,因为当这个设置请求进来时 USB 设备没有发送 ACK。我最终通过使用硬件 USB 协议分析器发现了这一点。

我还遇到了其他问题,但这是我花了很长时间才弄清楚的两个最大的问题。我不得不担心的另一个问题是大端和小端,分别是飞思卡尔 9S12 与 USB 数据格式(英特尔)。

我最终构建了类似于我过去所做的 UART 设备驱动程序的 USB 设备驱动程序。我已在以下 URL 上发布了代码。

http://lordhog.wordpress.com/2010/12/13/usb-drive

我经常使用结构,因此人们可能不喜欢它们,因为它们不像使用#defines 那样具有门户(例如,MAX3420_SETUP_DATA_AVAIL_INT_REQR 0x20),但我喜欢它们,因为它使代码对我来说更具可读性。如果有人对此有任何疑问,请随时发送电子邮件,我可以尝试提供一些见解。只要您知道要专注于哪些领域,“USB Complete:开发人员指南”一书就会很有帮助。这是一个简单的应用程序,只使用了低速 USB。

4

7 回答 7

5

在为任何接口(USB、并行端口等)编写设备驱动程序时,需要开发的代码将取决于是否有任何操作系统(OS)、RTOS 在该处理器/微控制器上运行。例如,如果要运行 WinCE - 它将有自己的驱动程序开发工具包,以及在设备驱动程序开发中要遵循的步骤。对于任何其他操作系统(如 Linux、symbian)也是如此。

如果它将是控制处理器/微控制器的普通固件代码(无操作系统),那么情况就完全不同了。因此,根据您所处的上述任何一种情况,您需要阅读和理解:-

1.) 处理器/微控制器开发板的硬件规格——寄存器文件、端口、内存布局等。

2.) USB 规格

3.)我很快找到了几个指针。谷歌应该是你的朋友! http://www.lrr.in.tum.de/Par/arch/usb/usbdoc/ - Linux USB 设备驱动程序

http://www.microsoft.com/technet/archive/wce/support/usbce.mspx

-广告

于 2009-02-05T19:07:54.580 回答
3

我使用了Jan Axelson 的早期版本的 USB Complete。确实很齐全。

从编辑评论:

该通用串行总线 (USB) 接口开发人员指南现已发布到第四版,涵盖了项目开发的所有方面,例如硬件设计、设备固件和主机应用软件。

于 2009-02-09T14:40:25.370 回答
1

我很好奇,你为什么选择9S12?我在以前的工作中使用过它,但并不满意。

  • 它有糟糕的 gcc 支持,所以我们使用 Metrowerks
    • 这对 C 来说可能没问题,但经常会生成错误的 C++
    • 有一个带有二进制项目文件的糟糕 IDE!
  • 9s12 也很慢,很多指令在 5 个周期内执行。
  • 也不是很省电。
  • 没有桶形移位器,使嵌入式代码中常见的操作变慢
  • 没那么便宜。

关于我唯一不喜欢的是 8051。我在目前的工作中使用的是 ARM CortexM3,它在各方面都比 9S12 好(更快的时钟,每个时钟完成的工作更多,功耗更低,更便宜,良好的 gcc 支持, 32 位与 16 位)。

于 2009-03-13T20:59:17.363 回答
0

我不知道您打算使用哪种硬件,但假设它很灵活,STMicro 提供了一系列支持 USB/SPI 的微控制器和一个可与其部件一起使用的 C 代码库。-- 我多年来一直使用他们的 ARM7 系列微机并取得了巨大的成功。

于 2009-02-09T14:26:41.100 回答
0

这是德克萨斯大学教授乔纳森·瓦尔瓦诺(Jonathan Valvano)维护的一个极好的网站。他在那里教四门课程(三门本科,一门研究生),都是关于使用 9S12 微控制器的。他的网站包含他在所有课程中使用的所有讲义、实验室手册,更重要的是,入门文件。

该网站看起来像是 90 年代的,但只要稍微挖掘一下,您应该会找到所需的一切。

users.ece.utexas.edu/~valvano/

于 2009-04-07T05:58:48.073 回答
0

考虑将 AVR 用于您的下一个 MCU 项目,因为它具有出色的LUFAV-USB库。

于 2010-12-16T11:42:59.603 回答
0

我正在使用 Atmel V71 进行项目。该处理器非常强大,在芯片上提供的许多高端连接中,有一个 USB 引擎,它将执行 480 Mhz 或 48Mhz(不是 USB 3.0)的设备或主机模式。这些工具是免费的,并附带许多主机和设备 USB 示例项目,其中包含所有 USB 堆栈代码。它支持 10 个端点,所有传输都通过 DMA 完成,因此您可以将大部分处理器马力用于其他任务。Atmel USB 堆栈无需 RTOS 即可工作

于 2015-12-09T19:19:42.687 回答