3

我一直在使用 Teensy 3.6 微控制器板(180 MHz ARM Cortex-M4 处理器)来尝试实现传感器驱动程序。传感器通过 SPI 进行控制,当它被命令进行测量时,它通过两条线(DOUT 和 PCLK)发送数据。PCLK 是一个 5 MHz 时钟信号,位通过 DOUT 发送,在 PCLK 信号的下降沿测量。数据帧本身由 1,024 个 16 位值组成。

我的第一次尝试是一种相对简单的方法:我在 PCLK 引脚上附加了一个中断,以寻找下降沿。当它检测到下降沿时,它会设置一个新位可用的布尔值,并将另一个布尔值设置为 DOUT 线的值。程序的主循环从这些位生成一个 uint_16 值,并为整个测量帧收集 1,024 个这些值。

然而,这个程序几乎立即锁定了青少年。从我的实验来看,它似乎在附加中断后立即锁定。我相信微处理器被中断淹没了。

我认为正确的做法是使用 Teensy 的 DMA 控制器。我一直在阅读 Paul Stoffregen 的 DMAChannel 库,但我无法理解。我需要从 PCLK 数字引脚触发 DMA 测量,并从 DOUT 数字引脚读取位。有人能告诉我我是否以正确的方式看待这个问题吗?我是否忽略了某些东西,我应该查看哪些资源来更好地了解 Teensy 上的 DMA?

谢谢!

我把它放在 Software Engineering Stack Exchange 上,因为我觉得这主要是一个编程问题,但如果是 EE 问题,请随时将其移至 EE SE。

4

1 回答 1

2

DMA 是在微处理器上接收高速数字数据的正确方法吗?

“高速数字数据”的来源不止一种。DMA 不是针对所有数据的全局正确解决方案,但它可以是一个解决方案。

它通过 DOUT 和 PCLK 两条线发送数据。PCLK 是一个 5 MHz 时钟信号,位通过 DOUT 发送,在 PCLK 信号的下降沿测量。

我在 PCLK 引脚上附加了一个中断,以寻找下降沿。当它检测到下降沿时,它会设置一个新位可用的布尔值,并将另一个布尔值设置为 DOUT 线的值。

这种方法被称为“bit bashing”。您正在使用 CPU 对引脚进行物理测量。这是我看到许多有经验的开发人员实施的最坏情况解决方案。它适用于任何硬件连接。幸运的是,Kinetis K66 有几个外围设备可以帮助您。

具体来说,FTM、CMP、I2C、SPI 和 UART 模块可能很有用。这些硬件模块能够减少从处理每个比特到比特组的工作量。例如,FTM 支持捕获模式。这个想法是忽略 PCLK 信号,只测量边沿之间的时间。这些时间将固定在一个位周期/CLK 中。如果定时器捕获一个两位周期,那么您知道发送了两个 1 或 0。

此外,您的信号看起来像 SSI,它是一个“数字音频”通道。不幸的是,K66 没有 SSI 模块。典型的 I2C 是开漏的,它总是有一个起始位和固定的字长。如果您对数据有一些了解和/或可以附加一些电路来伪造一些位(稍后将被删除),则可以使用它。

您可以使用 UART 和字符之间的时间来捕获数据。时间将是一系列不是开始位的位。然而,看起来这个 UART 模块需要停止位(SIM 功能可能非常有限)。


一旦你这样做了,就可以在 DMA、中断和轮询之间做出决定。如果 CPU 使用数据,没有什么比轮询更快的了。如果您需要将 CPU 与数据传输多路复用,则需要 DMA 和中断。如果 CPU 不需要对大部分数据采取行动,或者 CPU 所做的工作不是内存密集型(数字运算),则 DMA 会更好。中断取决于您的上下文节省开销。根据您的主线使用的设施,这可以最小化。

一些将信号调整到 K66 模块之一的胶水电路可以大大有助于制定更有效的解决方案。如果你不能改变信号,另一个(NXP?)带有 SSI 模块的 SOC 会很好用。NXP 模块通常支持链接到 eDMA 模块以及中断。

于 2017-07-19T14:33:28.260 回答