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.

[参考译文] CC2640:能否访问 ADC 以获得200微秒的采样数据

Guru**** 2589245 points
Other Parts Discussed in Thread: CC2640, CC2540, CC2640R2F

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/596526/cc2640-can-i-access-adc-to-get-sampling-data-with-200-microseconds

器件型号:CC2640
主题中讨论的其他器件: CC2540

尊敬的

我将 CC2640用于基于 BLE 的仪表应用。 我们成功实现了与移动应用的 BLE 通信。

现在、我希望使用我的 ADC (2通道)连续获取数据、采样率为每200uSec 1个样本。

我不熟悉将 ADC 与 RTOS 配合使用、因此在我们的代码 BIOS 中、我在后台运行(TI 的参考代码)。 是否可以使用此速率对数据进行采样、对于某些特定事件、我们希望在 ADC 器件中不发生任何中断的情况下处理 BLE 通信。 我应该使用外部控制器来完成此任务、还是可以使用 CC2540 UC 来完成此任务?

提前感谢。

Bhavdipsinh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Bhavdipsinh、这是一个复杂的设计问题。 考虑到 BLE 的设计性质、这里的主要限制可能是 BLE。 除了阅读《软件开发人员指南》以了解 BLE 之外、您的问题没有真正的快速答案。 从听起来、如果您打算"流式传输"通过 BLE 未压缩的2个 ADC 数据通道、则可能无法实现。 再说一次、这不一定是器件的限制、而是 BLE。

    不过,如果您考虑**采用 BLE5-Stack 的 CC2640R2F**,则可能需要考虑。 您可以在其中使用2Mbps PHY、我们在该 PHY 中测试了大约1.3Mbps 的吞吐率(在重负载测试应用中)。 您可以在我们的 GitHub 页面 上找到吞吐量演示:github.com/.../simplelink_sdk-1.35
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好,

    感谢您的回复。
    您似乎知道我希望以这种速率通过 BLE 流式传输数据、对吧? 但我不能。 让我再次解释,如果我解释错误的话。

    我希望在器件开启时连续获取运动和温度数据。 数据应以200uSec 的间隔从 ADC 通道获取。 因此、这将是控制器不会丢失数据的最高优先级。 我将对该数据应用这样的方程式、并获取结果数据、然后在我不需要时将这些数据发送到"网关"/"Mobile"(具有 BLE 的设备)。 (可能每10秒)。

    那么、是否可以应用具有最高优先级的 ADC 工作循环、以及以一定间隔处理 BLE。
    我希望这将有助于更好地了解具体情况。

    正在等待您的回复。
    谢谢
    Bhavdipsinh
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    要解决您的问题、我们首先必须进行一些简单的分析。

    首先、日期率如何? 在200us 周期(= 5kHz)下具有2个 ADC 通道。 支持采样数据、每通道8位采样。 然后2*5K =10KB/s BLE 应该能够处理它。

    其次、如何获取 ADC 数据? 它必须每秒采样10K 样本。 这绝对不能在任务循环中完成。 您有两种方法。
    (1)使用传感器控制器。 传感器控制器在其自己的小型 CPU 中运行。 因此、ARM 可以免费提供 BLE 员工。
    (2)将 DMA 与 ADC 配合使用。 DMA 会将数据从 ADC 移动到存储器。 因此、ARM 可以免费提供 BLE 员工。

    因此、我认为通过 CC2640解决您的问题是很有可能的、而无需其他额外的芯片。

    BTW、应优先减少数据数量。 例如、您是否需要以5kHz 的频率对温度进行采样? 我认为温度变化不会太快。 如果100Hz 实际上足以满足您的需求、该怎么办?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、
    感谢您的回复。

    我想介绍第二个选项、使用 DMA。

    供参考、我告诉过"温度"只是为了解释。 我需要采集数据、数据必须以5kHz 的速度获取。
    再次感谢您的回复。

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

    你好、Robert Chen
    我也是 BdipHavsinh Rathod 的团队

    请访问 processors.wiki.ti.com/.../CC26xx_Family_SW_Quickstart_Guide
    它说" DMA (仅与 SPI 一起使用)"。
    我们使用了"SDK:BLE_SDK_2_02_01_18"。
    那么、如何将 DMA 与 ADC 结合使用呢?

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

    您好!

    DMA 可与多个外设配合使用、而不仅仅是用于 SPI。 您可以学习 CC13xx/26xx TRM 第12章 UDMA、了解更多详细信息。

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

    你好、Robert Chen
    感谢您的回复

    我使用了 TI RTOS

    processors.wiki.ti.com/.../CC26xx_Family_SW_Quickstart_Guide
    =>支持的 TI-RTOS 外设驱动程序
    UART
    SPI
    I2C
    引脚/GPIO
    加密(AES)
    "DMA (仅与 SPI 一起使用)"

    根据上述文档、DMA 仅与 SPI 搭配使用。
    那么、我如何将 DMA 与 TI RTOS 结合使用呢?

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

    您好!

    尽管 TI 为您提供了"驱动程序"、但实施可能受软件而不是硬件的限制。 为此、您仍然可以通过直接访问外设的寄存器来设计自己的驱动程序。

    DMA 的基本配置是、

    1. 设置源地址(其中是数据)
    2. 设置目标地址(数据要到达的位置)
    3. 设置传输计数(要复制的字节数)
    4. 开始传输(由事件触发或手动触发)

    我不使用 TI-RTOS。 我有自己的 RTOS、我的驱动程序是用 C++设计的。 这是供您参考的代码片段。

    空 uDMA:::open (int _ch、uint8_t* src、uint8_t* dst、int _count、uint32_t control)
    {
    //如果未启用 uDMA 模块电源、请启用 uDMA 电源和控制器。
    if (!(REG_PRCM.SECDMA.CLKGDS &(1<8))){
    prcm_enable_module (MOD_UDMA);
    REG_UDMA.CFG = 1;//设置 MASTERENABLE 1以启用 UDMA 控制器
    REG_UDMA.CTRL =(uINT32_t) udmaControlTable;REG_UDMA.Control
    
    
    
    
    = 1;_NOR =_ERR =_DR_COUNT
    ;(_ERR = UDMA.)= UDMA. >UDMA_SRC_INC_S)& 3;
    dstincSize =(controlWord>>UDMA_DST_INC_S)& 3;
    
    //设置主控
    主控主控主控主控主控主控主控主控主控主控主控主控主控主控主控主控主控主控主控主控主控主控主控主控主控 src:src +((count - 1)< dstEndPtr =(dstIncSize==3)? dst:dst+(count - 1)< CONTROL = controlWord;
    
    //对于乒乓模式,需要设置替代控制
    if (CONTROUDA_MODE_M = UDMA_MODE_PINGONG){
    Ctrl->srcEndPtr =(srcIncSize = 3)? src:src +(count*2-1)< dstEndPtr =(dstIncSize==3)? dst:dst+((count*2-1)< CONTROL = CONTROL;
    }ELSE{
    //确保清除备用控制数据
    altCtrl->CONTROL = 0;
    }
    pingpong = 0;//从主控制
    
    REG_UDMA.SETBURST = 1<开始