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.

[参考译文] ADS131M06:ADS131M06

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1478134/ads131m06-ads131m06

器件型号:ADS131M06
主题中讨论的其他器件: ADS131M08EVM、ADS131M08

工具与软件:

我们使用大量的 TI 产品、尤其是毫米波和 ADS112U04IPW。 我们将 ADS131M06与较旧的 MSP430GF4619配合使用、而我们在使用 SPI、SCI 和许多其他功能方面拥有丰富的经验。 我们在尝试从 ADS131m06中简单地读取6个模拟端口。 配置寄存器是直接的。

RREG (101a aaaa annn nnnn) 1010 0000 0110 //从寄存器0 7-1字节开始读取

假设默认启动增益=1、24位数据和其他默认条件、因此它会自动转换。

void ADS131_readConversion (){//将所有6个通道读入数组中
io_low (P9、BIT7);//片选 ADS13
for (int ch = 0;ch < 6;ch++){//读取6个 ADC 通道
命令= 0xA |(Ch & 0x07);//这看起来不正确? RREG (101a aaaa annn nnnn) 1010 0000 0110 //从寄存器0 7-1字节开始读取
while (!(IFG2 & UCB0TXIFG));//等待 TX 缓冲区就绪
UCB0TXBUF =命令;//发送命令字节
while (!(IFG2 & UCB0RXIFG));ch = UCB0RXBUF;//等待传输并使用虚拟读取清除 RX 标志
unsigned int high = SPI_TRANSFER (0x0000);//读取 lo、MID、hi 字节
unsigned int mid = SPI_TRANSFER (0x0000);
unsigned int low = SPI_transfer (0x0000);
ADC_DATA[ch]=((unsigned long) high << 16)|((unsigned long) mid<< 8)| low;
}//读取6个 ADC 通道
io_high (P9、BIT7);//取消选择 ADS131
}

我们已经阅读了无数示例的代码和用户手册、但内容尚不清楚

24位数据的寄存器在哪里?

是否需要任何其他启动命令?

我们是否需要发送读取命令并寻址每个模数通道0xA |(ch & 0x07);

请帮助处理上面的代码。

非常感谢、Peter

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

    尊敬的 Peter McCormick:

    您能否向我们提供逻辑分析仪图来显示与 ADC 之间的通信? 请包括 CS、DOUT、DIN、DRDY、SCLK、 和同步

    ADS131M08EVM 的工作原理如下:您可以看到、当您准备好获取数据时、SYNC 引脚被切换以重新同步转换。 然后、一旦 DRDY 下降至低电平、就会通过发送 SCLK 在时钟沿输出数据(DIN 上不执行任何操作、请参阅第二个图像)。

    在第二个图像中、您可以看到10个字在时钟沿输出(响应、8倍数据、CRC)。 M06有8个字、因为信道少了两个

    这是我对您的系统运行的期望、请分享您的系统行为的类似捕获、以便我们进行审查

    -Bryan

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

    尊敬的 Peter:

    感谢您对 TI 在您的 ADC 需求以及您对 ADS131M06的兴趣方面所信任。

    在 ADS131M06中、转换数据不会存储在任何用户寄存器中。 这意味着您无法使用 RREG 命令读取它们。
    除非发送了 RREG 命令来读取多个寄存器、否则 ADS131M06始终在 DOUT 上输出转换数据。
    这意味着在默认配置中、您只需发送一个3 x 8 x 8 = 192位的帧、其中 DIN 保持为0 (=NULL 命令)。
    这将输出八个24位宽的字。 在每个24位字内、数据左对齐(MSB)。
    第一个字包括16位响应、字2至字7包括六个 ADC 通道的24位转换数据、字8包括16位 CRC。

    此致、
    Joachim Wuerker

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

    第一个字是对哪个命令的16位响应?

    DOUT 是否将开始发送通道1、2、3、4、5、6、1、2... 有什么问题?

    我知道默认情况下没有 CRC、这对我们来说是可以的。  如果 DOUT 持续发送通道数据、我们如何知道 DOUT 何时为通道1?
    是同步线路还是我们发送复位后开始发送。  如果不起作用、我们将发送一些 SPI 跟踪。  

    我们是否需要通过任何命令将其发送以立即发送数据?

    感谢您的帮助。 谢谢

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

    尊敬的 Peter McCormick:

    我再次复制逻辑分析仪捕获结果以供参考:

    • 您可以看到、没有发送命令(仅发送 SCLK)来读出数据
    • 如前所述、第一个24位字是来自上一条命令的响应、接下来的8x 字是来自每个通道(Ch0、Ch1、…… Ch7、我再次使用 ADS131M08进行这些测试)、最后一个字是 CRC。 有关典型的通信帧、请参阅图8-18
    • 在本例中、响应是 STATUS 字节、因为上一条命令是 NULL 命令。 更多信息、请参阅表8-11
    • 输入 (DIN)默认没有 CRC、输出(DOUT)始终具有 CRC
    • 响应和 CRC 都是16位、最后8位= 0、因为字长为24位

    应使用 DRDY 作为中断来确定何时读取数据。 采集数据的 EVM 流程为:

    1. 发送同步脉冲
    2. 等待 DRDY 从高电平转换为低电平
    3. 将 CS 降至低电平并保持 DIN 低电平
    4. 根据需要发送尽可能多的 SCLK、具体取决于您选择的字大小。 默认字长为24位、使用 ADS131M06时需要8x24 = 192个 SCLK
    5. 将 CS 置为高电平
    6. 根据需要重复步骤2-5多次、以继续随时钟移出数据

    -Bryan

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

    随附了示波器图。 谢谢、Peter
    ==Sync/Reset 变为低电平、但/DRDY 需要0.5ms 才能变为低电平。 即使长时间等待/DRDY 也没有帮助。
    ===/SYNC 之后/DRDY 需要多长时间?
    ===我没有配置任何设置寄存器。 是否需要首先配置寄存器?
    ==是以下代码中准备读取 AD0所需的第一个 SPI_TRANSFER (0x00)
    === 6结果=4286677119 4294741376 72792 7307266 4286578815 4294741376即使输入为0V 或1V、也会出现问题。


    void ADS131_read (void){int jj;//将全部6个通道读入数组中。 假设默认启动增益=1、24位数据和其他默认条件、因此它会自动转换。
    unsigned int byteHigh、byteMid、byteLow;unsigned long 结果;
    IO_LOW (P9、BIT4);longdelay (2);IO_HIGH (P9、BIT4);//复位以同步数据
    jj=0;while ((P9IN 和 BIT5)&& jj++<100);//if (jjj>90){USER_DEBUG_msg ("Data AD not ready");}//等待数据就绪变为低电平
    io_low (P9、BIT7);//片选 ADS13
    //SPI_TRANSFER (0x00);//??????? 发送空命令和读取响应以启动传输。
    for (jjj=0;jjj<6;jjj++){//读取6个通道
    byteHigh = SPI_TRANSFER (0x00);//虚拟写入以读取高字节
    byteMid = SPI_TRANSFER (0x00);//虚拟写入以读取中间字节
    byteLow = SPI_TRANSFER (0x00);//虚拟写入以读取低字节
    Result =((long) byteHigh << 16)|((long) byteMid << 8)| byteLow;//将三个字节组合成一个24位结果
    if (result & 0x800000){result |= 0xFF000000;}//如果 ADC 使用二进制补码格式、则执行符号扩展
    a_d[jj]=result;//将结果放入数组中
    }//读取6个通道
    io_high (P9、BIT7);//取消选择 ADS131
    }/将所有6个通道读入阵列。
    //------------------
    // SPI_TRANSFTER 通过 SPI 传输一个字节并返回接收到的字节。
    unsigned int SPI_transfer (unsigned int 数据){
    while (!(IFG2 & UCB0TXIFG));//等待 TX 缓冲区就绪
    UCB0TXBUF = data;//发送数据
    while (!(IFG2和 UCB0RXIFG));//等待接收完成
    Return UCB0RXBUF;//返回接收到的数据
    }

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

    随附了示波器图。 谢谢、Peter
    ==Sync/Reset 变为低电平、但/DRDY 需要0.5ms 才能变为低电平。 即使长时间等待/DRDY 也没有帮助。
    ===/SYNC 之后/DRDY 需要多长时间?
    ===我没有配置任何设置寄存器。 是否需要首先配置寄存器?
    ==是以下代码中准备读取 AD0所需的第一个 SPI_TRANSFER (0x00)
    === 6结果=4286677119 4294741376 72792 7307266 4286578815 4294741376即使输入为0V 或1V、也会出现问题。


    void ADS131_read (void){int jj;//将全部6个通道读入数组中。 假设默认启动增益=1、24位数据和其他默认条件、因此它会自动转换。
    unsigned int byteHigh、byteMid、byteLow;unsigned long 结果;
    IO_LOW (P9、BIT4);longdelay (2);IO_HIGH (P9、BIT4);//复位以同步数据
    jj=0;while ((P9IN 和 BIT5)&& jj++<100);//if (jjj>90){USER_DEBUG_msg ("Data AD not ready");}//等待数据就绪变为低电平
    io_low (P9、BIT7);//片选 ADS13
    //SPI_TRANSFER (0x00);//??????? 发送空命令和读取响应以启动传输。
    for (jjj=0;jjj<6;jjj++){//读取6个通道
    byteHigh = SPI_TRANSFER (0x00);//虚拟写入以读取高字节
    byteMid = SPI_TRANSFER (0x00);//虚拟写入以读取中间字节
    byteLow = SPI_TRANSFER (0x00);//虚拟写入以读取低字节
    Result =((long) byteHigh << 16)|((long) byteMid << 8)| byteLow;//将三个字节组合成一个24位结果
    if (result & 0x800000){result |= 0xFF000000;}//如果 ADC 使用二进制补码格式、则执行符号扩展
    a_d[jj]=result;//将结果放入数组中
    }//读取6个通道
    io_high (P9、BIT7);//取消选择 ADS131
    }/将所有6个通道读入阵列。
    //------------------
    // SPI_TRANSFTER 通过 SPI 传输一个字节并返回接收到的字节。
    unsigned int SPI_transfer (unsigned int 数据){
    while (!(IFG2 & UCB0TXIFG));//等待 TX 缓冲区就绪
    UCB0TXBUF = data;//发送数据
    while (!(IFG2和 UCB0RXIFG));//等待接收完成
    Return UCB0RXBUF;//返回接收到的数据
    }

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

    我再次尝试使它再次发挥作用。  看起来很接近了。  DRDY 不能正常工作。   

    我也尝试了这没有效果:  长重置。  等待 DRDY 在同步之前变为高电平。  在 SYNC 之前读取许多帧以尝试刷新缓冲区

    DRDY 在2帧后随机变为高电平、或以其他间隔随机变为高电平。  DIN 为低电平。  输出结果不一致。  我们还将 SPI 用于闪存。

    读取8个帧后 DRDY 不会变为高电平。  下面的代码为

    void ADS131_read (void){   int jj;float fresult;    //将所有6个通道读取到数组中。       假设默认启动增益=1、24位数据和其他默认条件、因此它会自动转换。

    #define ADSCALE_TO_VOLTAGE 0X7FFFFF   //7FFFFF=1V 7FFFFFh       =正   满量程800000h =负满量程

    #define WAIT4RDY 30000 //10个字随时钟移出(响应、8x 数据、CRC)。  DIN 必须为低电平  

         unsigned int byteHigh、byteMid、byteLow;    unsigned long 结果;

        IO_LOW (P9、BIT4);longdelay (2);IO_HIGH (P9、BIT4);//同步

        io_low (P9、BIT7);                            //片选 ADS13

         SPI_TRANSFER (0x00);                         //dummy read initial command response

        for (jjj=0;jjjj<=6;jjj++){                       //read 6个通道

               byteHigh = SPI_TRACE (0x00);     byteMid = SPI_TRACE (0x00);     byteLow = SPI_TRACE (0x00);       //虚拟写入以读取低字节

               Result =((long) byteHigh << 16)|((long) byteMid << 8)| byteLow; //将三个字节组合成一个24位结果

               if (result & 0x800000){fresult =(float)((unsigned long) result & 0x7FFFFF);fresult=fresult-0x7FFFFF;}//最大负数= 800000。   FFFFFFh =略为负值0h =   0V

               否则 fresult=result;                      //结果为正

               a_d[jj]=fresult/ADSCALE_TO_voltage;         //将浮点电压放入数组中

       }               //读取6个通道

       SPI_TRANSFER (0x00); //读取 CRC。  不要选中它

       io_high (P9、BIT7);  //取消选择 ADS131         

    }

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

    尊敬的 Peter McCormick:

    您的 SCLK 速度是多少? 在你的第一个示波器镜头中,它在200uA/div 的时间为8个分段,或1.6毫秒,而在第二个示波器镜头中,它似乎在500us/div 的时间为5个分段,或2.5毫秒。 SCLK 速度是否在变化?

    我假设其中的每一个都有24个 SCLK (在本例中、逻辑分析仪非常有用)?

    您可能检索数据的速度不够快、因此会被覆盖。 这将解释奇数 DRDY 行为。 从我的初始逻辑分析仪图中可以看出、时分值为100us、整个数据事务的时间为该时间的~10%、即~10us。

    -Bryan

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

    我们继续努力使这项工作发挥作用。  您可以看到逻辑分析仪在4 X 24时钟图中工作。 UC 正在正确读取值、以便 SPI 正常工作。   DRDY 在3x24时钟后始终变为高电平。  时钟为392kHz。   

    当我们随机进行同步时、DRDY 已经很低。   它仅在第3帧后变为高电平。

    为什么 DRYD 在第3帧后始终变为高电平?

    如果我们使它能够正常工作、2-7帧中的6个通道是吗 ?  谢谢  

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

    尊敬的 Peter McCormick:

    您的运行速度是多少? 您只是给 ADC 上电并发送数据、以便所有寄存器都处于默认值?

    您为器件提供的 ADC 时钟速度是多少?

    -Bryan