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.

[参考译文] ADS8694:与 ADS8694 18位 ADC 通信

Guru**** 2510885 points
Other Parts Discussed in Thread: ADS8694

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/720935/ads8694-communication-with-the-ads8694-18bit-adc

器件型号:ADS8694

大家好、Dale、Cynthia、大家都知道 ADS8694!

我尝试在由 F28379 Launchpad 控制的定制板中使用 ADS8694。

我的想法是使用 SPI、但由于没有任何结果、 我决定以蛮力逐步设置的方式检查通信、以查看是否可以解决首先知道芯片是否活跃的问题。

因此、我无法从器件中获得任何反应、我想知道我是否做了一些(很多)事情。

我测试了其中的两个、并焊接在两个不同的板上。
从那个、我什么都没有。 完全没有反应。
从另一个示例中、发送的每个命令只对一个进行一次应答。

您能否查看我使用的以下代码以查看时序是否正确?

在帧起始处、clk 信号必须处于高电平的时刻、我有点困惑。 在 CS 变为低电平之前是否应为高电平?

无论如何、我已经测试了这两种可能性、但都没有成功。

非常感谢

此致、

Gustavo

这是我的代码。 它在 C2000 ware 的 SPI 示例中工作


#include "F28x_Project.h"     

//函数原型
void delay_loop (void);
void initSerialPins (void);
void ADS8694_CMD (uint16 a、uint16 clkCycles);

uint16 Cmd0、Cmd1、Cmd2、Cmd3、Cmd4、Cmd5;
uint16 r、i、k;

uint32 rdataadc;

void main (void)

   //初始化 GPIO
   InitGpio();
   //清除所有中断并初始化 PIE 矢量表
   Dint;
   InitPieCtrl();
   IER = 0x0000;
   IFR = 0x0000;
   InitPieVectTable();

   initSerialPins();                               //此函数使用与 SPI 相同的引脚

   Cmd0 = 0b10000101;                               //复位程序寄存器(RST)(1000 0101 00000000)
   Cmd1 = 0b11000000;                               //手动通道 n 选择(MAN_Ch_0)(1100 0000 00000000)
   Cmd2 = 0b00000000;                               //继续使用最后一个配置(0000 0000 00000000)
   Cmd3 = 0b00001010;                               //读取范围通道0   (0000 101 0 00000000)
   Cmd4 = 0b00001011;                               //写入通道0输入范围。 我需要0x0110 (0000 101 1 00000000)

   Cmd5 = 0b11010011;                               // 0b1000001011010011如果一切都按要求返回,则用于在环回模式下进行测试


//仅取消注释要发送到 ADC 的内容

   ADS8694_CMD (Cmd0、33);                                  //   复位程序寄存器(0b10000101)
   ADS8694_CMD (Cmd4、23);                               //写入范围 Ch0 (MAN_Ch_0)(0b00001011)(十进制11)
   ADS8694_CMD (Cmd3、23);                               //读取范围 Ch0 (MAN_Ch_0)(0b00001010)(十进制10)
   //   ADS8694_CMD (Cmd1、33);                                  //手动通道 n 选择(MAN_Ch_0)(0b11000000)
   //   ADS8694_CMD (Cmd2、33);                                  //继续使用最后一个配置(0b00000000)

   /*   继续永久转换
  对于(;)
   {
      ADS8694_CMD (Cmd2、33);      //现在测量循环中的通道0。
       测量 Nr ++;
        delay_loop();
   }
    *

// main 末尾()


void ADS8694_CMD (UINT16 A、UINT16 clkCycles)

   rdataADC = 0;
   GpioDataRegs.GPBSET.bit.GPIO60=1;                      //将 clk 设置为高电平以开始换用已知位置
   delay_loop();
   GpioDataRegs.GPBCLEAR.bit.GPIO61=1;                      //将 CS 设为低电平以启动传输
   delay_loop();

   for (i=0;i<8;i++)                                     //发送 CMD 8位
   {        
       IF (A & 0b10000000)                                   //如果 a 的第一个字符为1
           GpioDataRegs.GPBSET.BIO58 = 1;
       其他
           GpioDataRegs.GPBCLEAR.bit.GPIO58=1;
       
       GpioDataRegs.GPBTOGGLE.bit.GPIO60=1;                   // SCLK 低电平- ADC 读取位
       delay_loop();
       GpioDataRegs.GPBTOGGLE.bit.GPIO60=1;                    // SCLK 为高电平
       delay_loop();
       
       A = A << 1;                           
   }
   
   R=0;
   GpioDataRegs.GPBCLEAR.bit.GPIO58=1;                        //将 SPISIMO 置于低电平的剩余时间
   
   for (i=8;i<16;i++)                                     //发送接下来的八个位= 0
   {
       GpioDataRegs.GPBTOGGLE.bit.GPIO60=1;                   // SCLK 低电平- ADC 读取位
       delay_loop();
       GpioDataRegs.GPBTOGGLE.bit.GPIO60=1;                    // SCLK 高电平
       delay_loop();
   }
      
   //在 SCLK 信号的第16个下降沿(已经发生)
   //转换数据的 MSB 在 SDO 线上输出,并可由主机处理器在 SCLK 信号的后续(17)下降沿读取。

   GpioDataRegs.GPBTOGGLE.bit.GPIO60=1;                      // SCLK 低第17个下降沿(现在我们可以读取 ADC18的 MSB)
   delay_loop();

   if (GpioDataRegs.GPBDAT.bit.GPIO59 = 1)                      //检查 SDO 1或0 (读取8位 ADC 配置的 MSB)
       rdataADC = 1;
   其他
       rdataADC = 0;
       
   GpioDataRegs.GPBTOGGLE.bit.GPIO60=1;                      // SCLK 高电平
   delay_loop();

   for (i=16;<clkCycles;i++)
   {
       GpioDataRegs.GPBTOGGLE.bit.GPIO60=1;                   // SCLK 为低电平
       delay_loop();

       if (GpioDataRegs.GPBDAT.bit.GPIO59 = 1)                   //检查 SDO 1或0
           R = 1;
       其他
           R = 0;
       rdataADC = rdataADC << 1;                            //将接收到的数据      MSB 置为8或18位
       rdataADC = rdataADC | r;                            //将接收到的数据      MSB 置为8或18位
       
       GpioDataRegs.GPBTOGGLE.bit.GPIO60=1;                   // SCLK 高电平
       delay_loop();
   }

   GpioDataRegs.GPBCLEAR.bit.GPIO60=1;                      //将 clk 设置为低,确保传输停止
   GpioDataRegs.GPBSET.bit.GPIO61=1;                         //将 CS 设置为高电平以结束传输
   返回;


// delay_loop -添加延迟的函数
//
void delay_loop ()

   long k;
   对于(k = 0;k < 10000;k++){}


空 initSerialPins()

   EALLOW;
   GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 0;                    // GPIO58 = GPIO58 (SPISIMOA)
   GpioCtrlRegs.GPBGMUX2.bit.GPIO59=0;                    // GPIO59 = GPIO59 (SPISOMIA)
   GpioCtrlRegs.GPBGMUX2.bit.GPIO60=0;                    // GPIO60 = GPIO60 (SPICLKA)
   GpioCtrlRegs.GPBGMUX2.bit.GPIO61=0;                    // GPIO61=GPIO61 (SPISTEA)

   GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 0;                    // GPIO58 = GPIO58 (SPISIMOA)
   GpioCtrlRegs.GPBMUX2.bit.GPIO59=0;                    // GPIO59 = GPIO59 (SPISOMIA)
   GpioCtrlRegs.GPBMUX2.bit.GPIO60=0;                    // GPIO60 = GPIO60 (SPICLKA)
   GpioCtrlRegs.GPBMUX2.bit.GPIO61=0;                    // GPIO61=GPIO61 (SPISTEA)

   GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0;                    //在 GPIO58上启用上拉(SPISIMOA)
   GpioCtrlRegs.GPBPUD.bit.GPIO59=0;                    //在 GPIO59上启用上拉电阻(SPISOMIA)
   GpioCtrlRegs.GPBPUD.bit.GPIO60=0;                    //在 GPIO60上启用上拉(SPICLKA)
   GpioCtrlRegs.GPBPUD.bit.GPIO61=0;                    //启用 GPIO61上的上拉电阻器(SPISTEA)

   GpioCtrlRegs.GPBDIR.bit.GPIO58 = 1;                      //将 GPIO58配置为输出(SPISIMOA)
   GpioCtrlRegs.GPBDIR.bit.GPIO59 = 0;                      //将 GPIO59配置为输入 (SPISOMIA)
   GpioCtrlRegs.GPBDIR.bit.GPIO60=1;                      //将 GPIO60配置为输出(SPICLKA)
   GpioCtrlRegs.GPBDIR.bit.GPIO61=1;                      //将 GPIO61配置为输出(SPISTEA)

   // GPIO111用于 ADS8694的硬件复位。
   //必须为高电平才能激活它
   GpioCtrlRegs.GPDGMUX1.bit.GPIO111 = 0;                 // GPIO111 = GPIO111
   GpioCtrlRegs.GPDMUX1.bit.GPIO111 = 0;                    // GPIO111 = GPIO111
   GpioCtrlRegs.GPDDIR.bit.GPIO111 = 1;                   //将 GPIO111配置为输出
   GpioCtrlRegs.GPDPUD.bit.GPIO111 = 0;                    //启用 GPIO111 (RST)上的上拉
   GpioDataRegs.GPDSET.BIPO111 = 1;                   //将 GPIO111设置为高电平!!!! 以激活 ADS8694
   EDIS;




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

    您好 Gustavo、

    感谢您的查询。

    我将查看您的代码、但 您的数字计时屏幕截图始终优于代码、  您的原理图需要检查、还请描述您检查的方式(模拟输入电压、您获取的转换代码等)、所有这些信息将非常有助于 解决该问题。 谢谢。

    顺便说一下、请尝试将有关同一 ADC 的问题保留在 E2E 上的同一主题中、谢谢。

    此致

    戴尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Dale、
    很抱歉、您需要额外发帖。 另一个线程已关闭、因此我发布了一个相关问题。 :(

    我收到了您的邮件、但文件已被删除、正如您所预测的。 请检查您的电子邮件。 我已经在我的下拉框中创建了一个文件夹、希望您可以在其中放置文件。

    好消息是、我解决了!
    正如预期的那样,我的错:我发送了错误的写指令!!!
    现在、一切都按我的要求工作。

    为便于记录、我发送0b0000101100000000对通道0的输入范围进行编程、但它应该是0b0000101100000110
    当然、读取指令也是错误的。 (之前为0b0000101000000000、而不是0b0000101000000000)
    我改变了我的常规,voilá 他活了!

    现在、我必须让具有 DMA 的 SPI 正常工作、然后是圣诞节!

    很抱歉、您什么也不会打扰您。

    此致、
    Gustavo

    PS:无论如何、如果您设法将文件放入我的下拉框中、最好了解更多信息。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Gustavo、

    感谢您的更新、我很高兴您已解决问题、如果您有任何其他问题、请告诉我。

    我已在框中与您分享、请检查您的电子邮件。

    此致

    戴尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    亲爱的 Dale、非常感谢!
    您在 TI 的一切都很棒!!!