This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM3358:TSC ADC

Guru**** 2788275 points

Other Parts Discussed in Thread: AM3358, ADS1115

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1610561/am3358-tsc-adc

部件号: AM3358
主题中讨论的其他器件: ADS1115

我们有一个使用 BeagleBone Black 的原型系统、该系统基于 AM3358 SOC。
我们运行 Debian Linux Buster 并将我们的代码写在 C 语言中

该应用程序当前使用 C 代码通过 PRU 读取 ADC (TSC) 的两个通道。  该代码设置 ADC、然后触发读取。

我们需要读取第三个通道、但需要使用 SOC ARM 部分上运行的 C 代码来读取该通道。  在做很多事情之前、a) 这是可能的、b) 是否会有冲突问题、c) 如果有冲突、那么最佳做法是什么、如果确实有冲突的话。  

谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Walter、

    在不同的软件实例 (Linux 和 PRU) 之间直接共享单个外设是很棘手的。 硬件的设计并不是为了跟踪多个软件所有者、因此 Linux 和 PRU 内核可能会意外覆盖彼此的设置等

    设计讨论

    我们实际上必须解决 Linux 驱动程序的类似问题。 编写 Linux 触摸屏驱动程序时并未与任何其他软件任务共享外设、ADC 驱动程序也是如此。 但我们有 8 个 ADC 通道、客户通常希望将 4-5 个通道用于电阻式触摸屏、而其他通道用于一般 ADC 工作。 我们最终所做的是创建一个拥有 ADC 硬件 (tscadc) 的单个低级驱动程序。 更高级别的触摸屏 (tsc) 和 ADC 驱动程序必须与 tscadc 驱动程序交互、然后 tscadc 驱动程序是与 ADC 外设交互的所有者。

    最简单的方法可能是对 Linux/PRU 设计执行类似的概念。 对我来说、最简单(但最不优化)的设计是使 PRU 保持为您当前拥有的 ADC 所有者、然后让 Linux 发送一个 RPMsg 来请求 PRU 触发 ADC 读取、然后 PRU 将数据发送回另一条 RPMsg 消息中。

    还可以进行大量其他优化(例如,开发自定义 Linux 驱动程序以比 RPMsg 更快,更高效地接收中断和发送数据)、但这将为您带来额外的开发工作。 如果不需要、我们不需要对解决方案进行过度设计。

    TI 的现有示例

    对于希望开始在 AM335x 上进行 PRU/ADC 开发的未来读者、我在此处提供了 PRU 软件支持包中控制 AM335x 片上 ADC 的 PRU 内核的基本示例:
    https://git.ti.com/cgit/pru-software-support-package/pru-software-support-package/tree/examples/am335x/PRU_ADC_onChip 

    我在 7 年中没有提及该代码、因此不记得我是否不得不在 Linux 器件树中禁用 ADC 时为 ADC 外设计时、或者 init_adc 中的 PRU 代码是否足够了。 如果您根据自己的经验对该示例有任何反馈、请告诉我。

    使用案例问题

    Linux 中的 ADC 读数需要什么类型的数据吞吐量? (即,您希望触发 ADC 读取的频率如何、以及您希望一次执行多少次 ADC 读取?)

    您是否对 ADC 读取执行需要多长时间有延迟要求?

    此致、

    Nick

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     感谢您发送编修。我们会重新检视您的建议。   多年来、我们一直使用 PRU 读取该系统上的 ADC、这一开发过程非常出色。   为了回答您的问题、我们在机器运行时尽可能快地连续阅读(称为传感器 A)。  我们正在分析来自传感器的信号、以检测流体中流动的颗粒。  我最近没有检查读取率、因为我不再执行实际的应用程序编程。   理想情况下、ARM 侧将以非常相似的速率读取第二个模拟输入。   此输入是传感器 A 输出的倒数 。目标是读取它、以便我们可以跟踪基线输出是什么、并在存在任何漂移时对其进行调整。  这个线程中包含了很多内容。   但考虑到您的回答、我认为最佳解决方案可能是使用第二个连接 I2C 的 ADC 来读取第二个模拟输入。 这不是什么大问题、因为我们在使用合适的 I2C ADC (ADS1115) 方面有一定的经验。

    对于其他读者而言、通过 PRU 读取 TSC 效果良好、一旦您了解它的工作原理、它就是一个功能强大的单元。  任何人都可以首先做的最重要的事情是阅读技术参考手册中有关 TSC 的章节。  这真的很有帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的答复 Walter、感谢您的答复!

    从软件开发的角度来看、为 Linux 添加一个单独的 ADC 肯定是更简单的选择、那么无需担心读取 A 等的倒数

    但是、如果您需要为测量设置一个共享的时基、以便将 sensorA 测量#X 与~(sensorA) 测量#X 相关联、这可能会有问题。 特别是、如果 Linux 手动触发读取、我预计它与使用片上 ADC 的 PRU 相比、对外部 ADC 的采样速度要慢得多。

    如果需要共享时基、您可能只需添加额外的读取、而不会影响当前时序(假设 PRU 内核在读取之间具有空闲时间)。  如果在当前设计中仅使用一个 PRU 内核、则可以保持一个 PRU 内核与 ADC 交互、然后对另一个内核进行编程、以便通过 Linux 进行数据传输、对 ADC 读取进行基本数据处理等

    此致、

    Nick