当前位置:首页 > 工业控制 > 电路设计项目集锦
[导读]本项目旨在验证采用新型Crossover MCU i.MX RT1010开发高可配置、多功能逻辑信号采集单元的可行性。初步评估表明,该设备成本极低,却具备无限的可能性和卓越性能。FlexIO接口是采集单元的核心,能够提供极高的采样速率,并将MCU资源用于其他潜在任务。系统实现了简单的通信协议,并使用开源软件项目作为信号分析接口。

本项目旨在验证采用新型Crossover MCU i.MX RT1010开发高可配置、多功能逻辑信号采集单元的可行性。初步评估表明,该设备成本极低,却具备无限的可能性和卓越性能。FlexIO接口是采集单元的核心,能够提供极高的采样速率,并将MCU资源用于其他潜在任务。系统实现了简单的通信协议,并使用开源软件项目作为信号分析接口。

硬件概览

本项目以NXP评估板MIMXRT1010-EVK为核心构建,该板已具备启动所需的所有组件。由于固件核心依赖于FlexIO,因此需要在板上暴露部分FlexIO信号,这成为首个挑战之一,因为该板并未提供大量FlexIO引脚。最好的理解方式是打开电路板的原理图(附录)以及参考手册第10章,其中列出了与FlexIO外设相关的GPIO引脚,这些信息见于表10-1。

这是因为散射引脚分布在电路板的不同接口上。在本项目中,并非所有使用的引脚都位于Arduino接口上,因为我们将看到,FlexIO具备一种特殊功能,可作为并行接口使用。为此,FlexIO引脚必须按连续相邻的顺序排列,这使得任务更加复杂。在深入描述引脚之前,先简要说明FlexIO的使用方式。

EVK提供了一个USB接口,可直接连接至交叉MCU,用于模拟串行VCOM接口并与PC软件通信。

FlexIO详细说明:

对于此应用而言,最合适的接口是并行接口,它允许在同一时钟周期内采集多个信号。但需满足特定条件,例如仅能将4位、8位、16位或32位的数据输入到FlexIO的移位寄存器中。

由于EVK上相邻的Flexio引脚数量较少,即Flexio编号(注意不要与相邻的设备引脚混淆),因此一种可能的做法是减少引脚使用。在我们的案例中,仅需两个引脚即可验证设计。

在这种情况下,由于需要采样的引脚数量少于实际输入到Flexio移位寄存器中的引脚数,剩余的位将产生填充。在本例中,应设置4位的移位操作。该配置由SHIFTCFGx寄存器的值决定,此时PWIDTH字段被设置为2,这会自动选择4位移位操作,如RM第1596页所示。关于填充的具体说明,请参见第41.4.4.1节“并行接口”。

为了从FlexIo接口同步获取数据,最佳方法仍是依赖硬件,因此必须提供一个时钟信号。

时钟信号可以来自外部或内部生成,但考虑到我们希望在运行过程中能够动态调整采样频率,显然更优的方式是在MCU内部生成该时钟信号。解决方案可以使用定时器来切换GPIO,但由于我们的应用所需的FlexIO定时器数量充足,因此可以直接从同一外设生成时钟信号,无需额外处理。FlexTimer的输出将被分配到一个物理引脚上,该时钟信号将被其他定时器用于生成移位操作。而FlexIO外设的另一大优点是,我们甚至无需考虑将此时钟信号外部连接到下一个定时器输入,因为这种连接在内部就已经可用。

由于本项目需要观察时钟信号以进行验证,我们将其分配到一个可用的引脚上。在此情况下,我们使用了板载的绿色LED灯。但由于没有测试点,直接访问该LED较为困难。经过仔细查阅EVK原理图(因FlexIO引脚数量有限),发现GPIO_11(FlexIO1_I26)与一个用于非音频功能的接线端子相连,该接线端子编号为J54,其第2号引脚连接了LED信号。

对于任何数字信号采集设备,通常都需要一个触发信号来捕获特定感兴趣的信号。在本应用中,触发信号将由FlexTimers提供,以确保采样过程的开始。采样持续时间将由应用程序根据所需采样数量进行控制,并受到设备可用内存的限制。

下表总结了所使用的信号和MCU引脚。

下图展示了测试期间的连接方式。测试信号(如触发信号和并行信号)通过Digilent的外部仪器生成。在测试过程中,也可以使用Saleae逻辑分析仪,例如用于确认输出时钟频率以及触发和数据信号。

输入并行编号0无法轻松连接,但为了快速测试,我们使用了输入1,因为该信号不易暴露。为此,可移除0欧姆电阻R792,并在R800上更换一个新的0欧姆电阻,然后通过Arduino接口J56-10上的信号名称FLEXPWM1_PWMA3进行访问。

图1展示了表1中列出的连接方式。值得注意的是,由于FlexIO接口固件调试时出现问题,导致CMSIS-DAP接口停止工作,因此采用了JTAG接口。

尝试使用Segger J-Link后发现问题仍然存在,且未找到明确解决方案。幸运的是,我注意到如果将Boot跳线从FlexSPI启动位置[0010]改为Boot from fuses [0000],并加载新固件,重新连接设备后即可再次进行调试。不太确定具体原因,但可能是上一次调试会话中某些代码出现故障,导致了启动过程中的异常。相关问题及详细日志已在NXP论坛中提出。

另外请注意,串行连接的跳线已被移除,同时我们还在这些焊盘上使用了一些Flexio引脚。

固件概述

固件可分为两个部分:一部分用于通过FlexIO进行信号采集,另一部分则负责数据传输和与外部软件通信以实现信号分析。在进入FlexIO的详细固件说明之前,先讨论一下如何分析采集到的数据。

我们选择了一个名为sigrok的开源软件作为数据分析工具。除了开源、跨平台以及易于使用之外,最重要的是,我们可以使用一个简单的驱动程序来启动并操作该工具。

在其中一台Windows 10机器上无法让Sigrok正常运行,可能与Java兼容性有关。我已在Debian Buster虚拟机上测试过,一切运行完美。这是从交叉MCU通过VCOM接口实际模拟发送捕获数据的截图。

图2显示了从0到512的8位数字计数的512个样本。在开始时,出现了一串“零”,在本例中对应12个样本。需要指出的是,在此示例中,样本和频率未进行调整,也就是说,sigrok会根据该配置对数据进行缩放,换言之,软件将接收并解释数据,但事实上,这种配置也可以发送给设备,以便正确设置。

Sigrok 实现了多种通信协议,本项目所使用的串行通信协议基于 Open Bench Logic Sniffer,这是一种用于配置和接收捕获样本的简单协议。由于其结构简单而被选中,但在处理数据流时可能并非最高效的传输方式。尽管本项目未采用该方案,但使用 Sigrok 进行连续数据流传输时,若串行数据传输延迟了若干字符,则传输将被视为终止,导致 GUI 中显示的数据会丢弃后续的样本。

在初步测试中,我们使用了虚拟缓冲区来确认通信功能,但值得注意的是,Sigrok 的实现存在一个已知问题:第一个传输的缓冲区与图2中的内容并不完全一致,实际数据显示顺序错误,例如最后一个样本出现在了应为第一个的位置。这一点已在相关问题中得到确认。

为了解决此问题,或者更准确地说,这里提出的一种工作方式是:数据被以不同的顺序存入USB缓冲区,例如最后的数据会先显示。以下是生成图2中数据的代码片段。

在发布此处代码之前,让我们先详细了解一下FlexIO的实现方式。

本项目的固件可在GitHub上找到。

FlexIO固件详情如下。

flexio代码包含在类似其他flexio或设备驱动程序的库驱动文件中,这有助于保持使用方式一致,从而简化导入过程。这些文件名为fsl_flexio_logic.c和fsl_flexio_logic.h。

该代码通过配置flexio外设并启用其从启动开始运行来工作,触发事件将启动新的捕获。对于示例代码,捕获长度是固定的,但我们可以随时轻松修改,这一点稍后将说明。

捕获操作通过阻塞式读取flexio移位缓冲区事件完成。这一过程可以轻松转换为中断事件,甚至更好,可采用EDMA传输。我们已进行了一项初步尝试(尚未完全测试),以提供EDMA支持。

示例代码将上述flexio驱动程序导入到VCOM示例中,该示例同时也作为通信协议。flexio从虚拟_com.c文件初始化,如下所示。

上述函数中可能最重要的是FLEXIO_LOGIC_Init,它负责配置移位缓冲区和定时器的所有工作。为了说明架构,我们基于应用笔记AN12686中的并行图绘制了示意图。

在此我们使用相同数量的移位缓冲区,如有需要也可以减少数量,因此移位寄存器的配置基本一致。

定时器0用于生成时钟信号,在此情况下为50%占空比的PWM。由于我们使用的代码与NXP的PWM示例类似,因此通过以下代码片段可以轻松修改频率。

定时器1则用于计算获取指定采样数所需的时钟周期数。使用下方的配置片段:

如上文代码注释所示,定时器比较寄存器utake取值为samples乘以2再减去1,这是因为定时器会利用两个时钟跳变来递减计数器。对于此情况,定时器被配置为16位模式,并在定时器比较时禁用。定时器触发信号是我们想要测量的信号,该信号会触发一个事件,而该事件将启动定时器1。

定时器2负责处理移位缓冲区的加载操作,它会指示何时需要从输入引脚或相邻引脚加载数据,以及何时需要将移位寄存器的内容加载到移位缓冲区中。

对于定时器2,我们使用与定时器1相同的触发信号。只要定时器1运行,且其禁用值等于前一个定时器的禁用值,定时器2就会继续工作。

配置完成后,逻辑分析仪基本处于待命状态,等待触发信号的到来。另外,还需设置频率和采样次数,如下所示。请注意,sampleData是一个大小为4096的缓冲区。

最后还需注意,需按以下方式设置引脚:

我们已移除了调试控制台引脚的初始化,并从代码中删除了与FlexIO GPIO_09冲突的UART_RX部分。

现在我们可以调用阻塞函数来等待采样数据。

接下来的问题是何时调用该函数,这引导我们进一步了解OLS驱动程序的详细情况。

驱动程序实现涵盖了基本命令,以下是相关代码片段。

某些命令用于建立通信,之后按下运行按钮时,Sigrok将使用OLS驱动发送SUMP_RUN命令。在此过程中会设置一个变量,并在后续进行检查。

请注意,在此情况下捕获的4位字节顺序是如何处理和传输的。

捕获的数据将如图4所示。

验证过程:

首先建立设备连接,参数显示见图5。

为了确认我们的设置,使用Digilent Discovery 2套件生成信号,通过Saleae Pro Logic分析仪捕获信号、时钟和触发信号,当然也包括我们使用Sigrok捕获的数据记录。

首先按照下图5所示,配置Digilent的Waveforms软件。

信号同时通过我们的交叉逻辑设备和Saleae逻辑协议分析仪采集。

图7展示了Saleae的测试结果。

图8显示了使用交叉逻辑设备时的结果。

请注意,时间轴并不完全一致,可能是由于数值不同所致。我们的时钟频率为19.95 kHz。

结论:

本项目充分展示了交叉MCU的强大性能及其在处理数字信号采集方面的高度灵活性。仅通过读取GPIO并使用中断来获取信号,存在较大困难,因为无法保证精确的时间同步和并行接收。本项目可轻松扩展,以支持16甚至32个数字信号的同时采样,这些信号将在同一时钟周期内进行采样。此外,该时钟频率也可轻松提升至5MHz。但本项目选择了较低频率,因为设备到PC的串行传输尚未完全实现,因此需要对发送大缓冲区或连续数据流进行进一步优化。

这可以通过在FlexIO接口上实现乒乓缓冲区来实现,不过设备的采样速率最终可能主要由串行连接速度决定。

本文编译自hackster.io

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭