我正在做一个USB设备,用来控制步进电机。我以前使用过并行端口。因为这些端口在当前的主板中不存在,所以我决定在我的设备和PC(主机)之间实现USB通信。为了实现我的目标,我给freescale微控制器配备了一个12Mbps的USB模块。我的USB设备必须在给定的时间接收4个字节(每个电机驱动器一个),因为每个字节都是移动引擎的一步。在PC(主机)中,用户的应用程序处理带有信息的文本文件,并使轨迹坐标以一定的速率为每个电机发送字节(实现电机的加速度和速度所需的时间微不足道)。
使用并行端口是一项容易的任务,因为每个字节都是按用户应用程序确定的时间顺序发送的。
对全速USB协议做了一些研究,了解到帧每1ms发送一次。然后你可以每1ms发送4个字节或更多,但我无法像使用并行端口那样管理时间。我的微控制器每帧最多可以发送64字节(基于传输纸类型Control、Bulk、Int、Iso…)
问题1:
我想知道我用什么方法可以比每1毫秒更快地发送4字节的数据包?
问题2:
对于这些类型的设备,什么类型的传输可以建议我?
谢谢。
正如Ricardo所说,USB串行就足够了。
至于传输类型,请尝试实现CDC堆栈,并使用SCI接收器侦听PC命令。这将为您提供一个接收缓冲区,以满足您的需求。
- 初始化SCI(波特率等)
- 启用接收器并中断
- 接收数据时,将其移动到4字节的命令缓冲区
- 清除接收缓冲区,等待更多
当你有了所有的4个字节时,启动步进器!四个字节应该需要µs。
请使用Freescale查看您的处理器是否受支持。
http://cache.freescale.com/files/microcontrollers/doc/support_info/USB_STACK_RELEASE_NOTES_V4.1.1.pdf?fpsp=1
甚至可能有一些示例代码可以帮助您入门。
-干杯
我正在实现同样的目标(驱动/控制数控机床),如下所示:
USB设备只是同步的I/O并行端口。使用连续的批量传输一个管道作为输入,一个作为输出。通过这种方式,我能够实现采样率为~70KHz的同步64位并行通信。它使用(i)4.27+(o)4.27 MBit/s
周围的流量,这是我的MCU和代码的限制。由于USB事件中断,较大的速度会导致输出抖动。
如何操作(在MCU侧)
我有两个FIFO,一个用于输入数据,一个用来输出数据。我有定时器中断发生的采样率频率。在它中,我读取输入并将其馈送到第一个FIFO,从另一个FIFO取数据并将其发送到输出。
除此之外,USB任务被调用(在同一中断内),检查FIFO是否发送到处理传输本身的USB和从其传入的数据
我选择ATMEL AT32UC3A芯片执行此任务。经过漫长而痛苦的全面研究,我决定使用这些MCU,因为它们有足够的内存用于FIFO和程序,因此不需要额外的IC。它有FPGA封装,可以使用(BGA不是选项)。它有HS USB(大多数USB MCU只有FS像您的一样)。它以66MHz
运行。它支持许多有趣的功能(过去用它做过有趣的项目),当然,我在过去的中有ATMEL MCU的经验
因此,如果你想实现类似的目标,那么
-
从批量传输(
PC -> USB -> MCU -> output
)开始 -
如果需要,添加FIFO
不知道你需要的采样率。旧的LPT可以从
80-196KHz
处理,这取决于制造商。现代的要慢得多(这既愚蠢又可悲)。 -
测量临界采样率
你需要示波器或非常好的听力。输出数据必须是同步的,这样就没有孔,没有抖动等…
如果其中任何一种存在,你必须降低采样率。我的设置甚至可以处理
1MHz
采样率,但存在USB抖动(有时USB事件冻结发送的时间比一个采样长…),所以我只能实现稳定输出的70KHz
。 -
如果需要还输入,则添加它们
但前提是输出正常工作。不要忘记在这之后降低采样率。。。使用单独的批量管道和FIFO进行输入和输出。