1

我在做一个USB设备是为了控制步进电机。我在使用并行端口之前已经这样做了。因为这些端口在当前的主板上不存在,所以我决定在我的设备和 PC(主机)之间实现 USB 通信。为了实现我的目标,我为具有 12Mbps USB 模块的设备赋予了飞思卡尔微控制器。我的 USB 设备必须在给定时间接收 4 个字节(每个电机驱动器一个),因为每个字节都是应该移动引擎的一个步骤。在PC(主机)中,用户的应用程序处理带有信息的文本文件,并使轨迹坐标以一定的速率为每个电机发送字节(实现电机的加速度和速度的时间是微不足道的)。

使用并行端口是一项简单的任务,因为每个字节都是按用户应用程序确定的时间顺序发送的。

对全速USB协议进行了一些研究,了解到帧每1ms发送一次。那么您可以每 1ms 发送 4 个字节或更多字节,但我无法像使用并行端口那样管理时间。我的微控制器每帧最多可以发送 64 个字节(基于传输文件类型 Control、Bulk、Int、Iso ..)。

问题1:

我想知道以什么方式可以比每 1 毫秒更快地发送 4 字节数据包?

问题2:

对于这些类型的设备,哪种类型的传输可以为我提供建议?

谢谢。

4

2 回答 2

1

正如里卡多所说,USB 串行就足够了。

至于传输的类型,请尝试实现 CDC 堆栈并使用您的 SCI 接收器来监听 PC 命令。这将为您提供一个满足您需求的接收缓冲区。

  • 初始化您的 SCI(波特率等)
  • 启用接收器和中断
  • 接收数据时,将其移至 4 字节命令缓冲区
  • 清除接收缓冲区,等待更多

当您拥有所有 4 个字节时,请关闭步进器!四个字节应该需要 µs。

请与飞思卡尔核实您的处理器是否受支持。

http://cache.freescale.com/files/microcontrollers/doc/support_info/USB_STACK_RELEASE_NOTES_V4.1.1.pdf?fpsp=1

甚至可能有一些示例代码可以帮助您入门。

-干杯

于 2013-07-31T05:03:05.340 回答
0

我正在实现相同的目标(驱动/控制 CNC 机器),如下所示:

USB设备只是同步I/O并口。使用连续批量传输一根管道作为输入,一根作为输出。通过这种方式,我能够以约 70KHz 的采样率实现同步 64 位并行通信。它使用的流量(i)4.27+(o)4.27 MBit/s是我的 MCU 和代码的限制。由于USB事件中断,更高的速度会导致输出抖动。

怎么做(在MCU端)

我有 2 个FIFO,一个用于传入数据,一个用于传出数据。我有采样率频率发生的定时器中断。在其中,我读取输入并将其馈送到第一个FIFO,然后从另一个FIFO读取数据并将其发送到输出。

最重要的是,调用USB任务(在同一个中断内)检查FIFO以发送和从USB处理传输本身的数据

我为此任务选择了ATMEL AT32UC3A芯片。经过漫长而痛苦的全面研究后,我决定使用这些MCU,因为它们有足够的内存用于FIFO和程序,因此不需要额外的IC。它有可以使用的FPGA封装( BGA不是一个选项)。它有HS USB(大多数USB MCU只有像你这样的FS )。它运行在66MHz. 它支持许多有趣的功能(过去曾用它做过有趣的项目),而且我过去曾使用过ATMEL MCU的粗略经验

因此,如果您想实现类似的目标,那么

  1. 从批量传输开始 ( PC -> USB -> MCU -> output)
  2. 如果需要,添加 FIFO

    不知道你需要的采样率。旧的LPT可以处理80-196KHz取决于制造商。现代的要慢得多(这既愚蠢又可悲)。

  3. 测量临界采样率

    你需要示波器或非常好的听力。输出数据必须是同步的,因此其中没有漏洞,没有抖动等......

    如果其中任何一个存在,则必须降低采样率。我的设置可以处理均匀1MHz的采样率,但存在USB抖动(有时USB事件冻结发送更长的一个样本......)所以我只实现70KHz了稳定的输出。

  4. 如果需要也输入然后添加它们

    but only if the output is working as it should. Do not forget to lower the sample rate after this too ... Use separate bulk pipes and FIFOs for input and output.

于 2015-03-04T08:31:46.510 回答