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.

[参考译文] CCS/ADC124S101:ADC124S101多通道读取

Guru**** 1079370 points
Other Parts Discussed in Thread: CC3220SF, ADC124S101
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/893583/ccs-adc124s101-adc124s101-multi-channel-reading

器件型号:ADC124S101
主题中讨论的其他部件:CC3220SF、、

工具/软件:Code Composer Studio

您好!

我在 CCS (TI-RTOS)上为 CC3220SF IC 开发代码。 在使用 CS*下降沿激活(加电) ADC124S101后,我尝试读取所有通道(1-4),但无法读取多通道。 另一方面,在读取通道1后,我使用 CS*的上升沿禁用 ADC124S101。 下一步,我激活 (加电) 具有 CS*下降沿的 ADC124S101,因此我可以读取通道2。 在对 ADC124S101芯片执行操作并再次激活后、我可以读取通道3和通道4。 那么、要读取多通道、我们应该 反复停用并激活 ADC124S101芯片吗?

此外、当我再次激活芯片时、由于跟踪和保持问题、我第一次读取最后一个通道电压。 例如、我  分别读取通道1、通道2、通道3和通道4、当我尝试读取 通道2时、我获得通道1值。  由于这个问题、我读取通道值2次、并使用第二次测量值。 我用这种方法开发的代码位于附件中。 您可以检查一下。所以、要解决这个问题、您有什么建议? 在测量之前、能否对控制 SW1或 SW2的电容器进行放电?

它也是 ADC124S101数据表的一部分(第17页)。 您能否更清楚地解释粗体句子、举个例子? 此外、本节还与我的第一个问题顶部相关。

在 SCLK 的前3个周期内、ADC 处于跟踪模式、以获取输入电压。 在接下来的13SCLK 周期中、转换完成、数据将计时输出、MSB 首先从第5个时钟开始。 如果一个帧中有多个转换、ADC 将在 SCLK 的 N*16上升沿之后的 SCLK下降 沿上重新进入跟踪模式、并在 SCLK 的 N*16+4下降沿上重新进入保持/转换模式、其中"N"是整数。

感谢您的支持。

e2e.ti.com/.../spimaster.c

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

    您好!

    您应该能够在 CS 不改变状态的情况下读取不同的通道。 如果您不能这样做、我预测 SDI 控制寄存器的时序不正确。 当您将 CS 保持在低电平并尝试读取不同的通道时、您会得到什么结果? 有关 更改通道的控制寄存器信息、请参阅数据表第17页的表2至表4。

    在调试过程中、我建议将每个输入设置为不同 的已知直流值、例如、Ch0 =GND、Ch1 =1V、等等、在模拟满量程范围内。

    请包含数字通信的示波器截图、包括 CS、SDO、SDI、SCLK 的2个转换周期。 这将有助于提供一个可视化的方法来检查时序、并确认代码实际执行的操作与应执行的操作。

    关于您询问的粗体陈述。 当 CS 保持低电平且 SCLK 脉冲仍然存在时、器件会自动启动新的转换周期。

    一个转换周期采用16个 SCLK。 在这16个脉冲内、前 4个脉冲是采集阶段、另12个脉冲是转换阶段。 对于提供的每组16SCLK、都会重复此过程。

    此致、Cynthia

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

    您好!

    我将代码更新为读取多通道 而不更改 CS 状态。 但是、我的读取值似乎发生了漂移。 例如、我看到通道1的通道4值。 我将在下面发送我的代码和信号。 请检查并建议我应该做什么。

    板载实际电压值为:IN1 (0V;十进制:0)- IN2 (3V3;十进制:4096) - IN3 (3V3;十进制:4096) - IN4 (27°C;十进制:1120)

    未:IN4已连接温度 ADC124S101EVM 电路板上的 Senson。

    但正如您从信号中看到的那样,我也得到了这个调试消息: 1123 (IN1)-- 2 (IN2)-- 4059 (IN3)-- 4061 (IN4)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    我想 ı 正确地移动了、但为什么我得到不同的值 ı 不理解。 您能否检查情况并向我提出正确的建议?

    我的代码:

    /*
    *==== stc3100/c ===
    *
    #include
    #include
    #include

    /* POSIX 头文件*/
    #include
    #include
    #include

    /*驱动程序头文件*/
    #include
    #include
    #include

    /*示例/板头文件*/
    #include "SSKB_Board.h"

    #define THREADSTACKSIZE (1024)

    uint16_t MASTER_MSG[4]={0x0000,0x0800,0x1000,0x1800};

    SPI_Handle masterSpi;
    SPI_Params spiParams;
    SPI_Transaction 事务;
    bool transferOK;
    int32_t status;
    uint16_t RX_Buffer_1、RX_Buffer_2、RX_Buffer_3、RX_Buffer_4、I、j;

    静态 Display_Handle 显示;

    uint16_t masterRxBuffer[4];
    uint16_t masterTxBuffer[4];

    void read_adc_channels();

    /*
    *==== mainThread ====
    *
    void * mainThread (void * arg0)

    /*调用驱动程序初始化函数。 *
    display_init();
    GPIO_init();
    spi_init();

    /*配置 LED 引脚*/
    GPIO_setConfig (Output1、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);

    /*打开输出的显示屏*/
    Display = Display_open (Display_Type_UART、NULL);
    if (display =NULL){
    /*无法打开显示驱动程序*/
    while (1);

    /*打开用户 LED */
    GPIO_WRITE (Output1、Board_GPIO_ON);

    display_printf (display、0、0、"启动 SPI 主设备示例");
    /*将 SPI 作为主器件打开(默认)*/
    SPI_Params_init (&spiParams);
    spiParams.frameFormat = SPI_POL0_PHA0;
    spiParams.dataSize = 16;
    spiParams.bitrate = 100000;
    masterSpi = SPI_open (Board_SPI_master、&spiParams);
    display_printf (display、0、0、"Master SPI initialized");

    /*
    *主器件已打开 Board_SPI_MASTER;将 Board_SPI_MASTER_READY 设置为高电平
    *通知从属方。
    *
    //GPIO_WRITE (Board_SPI_MASTER_READY、0);

    while (1)

    read_adc_channels();
    usleep(500000);

    空 READ_ADC_CHANNELS ()

    /*将消息复制到发送缓冲区*/
    MASTERTxBuffer[0]= MASTER_MSG[0];
    MASTERTxBuffer[1]= MASTER_MSG[1];
    MASTERTxBuffer[2]= MASTER_MSG[2];
    MASTERTxBuffer[3]= MASTER_MSG[3];
    transaction.count = 4;
    transaction.txBuf =(void *) masterTxBuffer;
    transaction.rxBuf =(void *) masterRxBuffer;

    /*执行 SPI 传输*/
    transferOK = SPI_transfer (masterSpi、事务);
    if (transferOK){
    RX_Buffer_1 = masterRxBuffer[0]和0x0FFF;
    RX_Buffer_2 = masterRxBuffer[1]和0x0FFF;
    RX_Buffer_3 = masterRxBuffer[2]和0x0FFF;
    RX_Buffer_4 = masterRxBuffer[3]和0x0FFF;

    否则{
    display_printf (display、0、0、"unsuccessful master SPI transfer");

    //********* //

    Display_printf (display、0、0、"ADC channels:%lu -%lu -%lu -%lu "、RX_Buffer_1、RX_Buffer_2、RX_Buffer_3、RX_Buffer_4);
    GPIO_TOGGLE (Output1);

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

    您好!

    该器件不会在同一帧中输出所选通道的数据、而是在之后的帧中输出数据。 有一个帧延迟。 请注意、在采集期间是输入电压被采样的时候、这在 SDI 数据被完全发送以选择哪个通道之前结束、因此不可能在一帧中为所选通道提供相同的通道数据

    示例

    在周期 N 期间:

       SDI=选择 CH1

       SDO =来自周期 N-1的数据

    在周期 N+1期间:

       SDI=选择通道2

       SDO=来自周期 N 的数据、即 Ch1数据

    此致、Cynthia