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.

[参考译文] ADS1148-Q1:获取数据时出现问题

Guru**** 2393725 points
Other Parts Discussed in Thread: ADS1148, ADS1148-Q1

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/687649/ads1148-q1-issue-in-obtaining-data

器件型号:ADS1148-Q1
主题中讨论的其他器件:ADS1148

我目前正在使用连接到单个 Microchip PIC32MX564F128L 的两个 ADS1148-Q1。 我正在使用 PIC32上的内置 SPI 外设与 ADS1148s 进行通信、然后获取该输入并通过 CAN 总线将其传输、以便其他电路板使用传感器数据。 但是、对电路板进行测试表明 ADS1148正在返回 DOUT 线路上的任何数据。 我已通读 Cliff ShakAmtech、并确保我的启动和复位线路在 CS 低电平时保持高电平。 我将 ADS 和 PIC32安装在自定义 PCB 上、 可以在此处查看 与电路板的一致原理图。  pastebin 上的代码 显示 了我连接到 ADS1148的 SPI 总线的当前配置设置以及我如何将引脚保持在高电平。 testing_XX 方法是测试无法正常工作的基本功能的简化方法。  

我使用示波器进行的测试显示发送的时钟以及 DIN。 启动和复位显示为高电平、CS 为低电平。 DRDY 似乎保持高电平、但我尚不确定。 即使在发送时钟时、DOUT 也始终为低电平。 测试代码的 CAN 输出读取 FF FF FF FF FF FF FF FF FF FF FF FF、而非测试代码将输出 FF 01 FF 01 FF 01 FF 01、而更改连接器上的输入电压将不会显示 CAN 输出发生任何变化。  

我很乐意分享任何其他帮助解决此问题所需的信息、感谢您的阅读。

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


    仔细观察您的原理图和布局、我没有发现任何具体问题。 如前所述、您已验证 START 和/RESET 均为高电平。 我还将确保 CLK 引脚接地、以便启用内部振荡器。 之后、器件应该在运行。 如果不写入器件、您是否可以看到/DRDY 提供周期性脉冲? 默认数据速率为5SPS、因此您可能会每200ms 看到一次窄脉冲。

    您能否写入和读取器件配置寄存器? 我希望确保器件理解已发出的写入寄存器命令、并且读取命令正常工作。

    此外、看起来您确实发出了 SDATAC 命令。 要读取数据、您需要发出 RDATA 命令并再发出16个 SCLK 的时钟来获取数据。 确保/CS 低电平跨越整个事务以读取数据。

    不管怎样、如果您有通信的示波器照片、我很想看到它们。


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

    感谢您的再次光临! 我浏览并获得了发送到 ADC 的每个信号的图像。

    所有示波器图像都包含此代码  

    void main(){
    systemconfig (SYS_FREQ、SYS_CFG_WAIT_States | SYS_CFG_PCACHE);
    代莱女士(20);
    
    //设置 SPI
    SpiChnOpen(.
    SPI_CHN_R、
    SPI_OPEN_MSTEN | SPI_OPEN_MODE8 | SPI_OPEN_CKE_REV、
    800000/LED_SPI_SPEED
    );
    
    AD1PCFGbits.PCFG8 = 1;
    mPORTBSetPinsDigitalIn (bit_8);//DRDY 输入
    mPORTDESTinsDigitalOut (bit_9);//CS 输出
    mPORTBSetPinsDigitalOut (bit_7);//开始输出
    mPORTBSetPinsDigitalOut (bit_9);//复位输出
    mPORTDSetBits (bit_9); //CS 高电平(关闭))
    mPORTBSetBits (bit_7); //启动高电平
    mPORTBSetBits (bit_9); //重置高电平
    
    代尔马(200);
    CAN_init();
    
    mPORTDClearBits (bit_9); //CS 低电平(接通)
    while (1){
    while (PORTBbits.RB4){}
    SpiChnPutC (SPI_CHN_R、0xFF);
    CANToSend[0]= SpiChnGetC (SPI_CHN_R); //Caliper Temp 1 (卡尺温度1)
    while (PORTBbits.RB4){}
    SpiChnPutC (SPI_CHN_R、0xFF);
    CANToSend[1]= SpiChnGetC (SPI_CHN_R);//Caliper Temp 2.
    while (PORTBbits.RB4){}
    SpiChnPutC (SPI_CHN_R、0xFF);
    CANToSend[2]= SpiChnGetC (SPI_CHN_R); //转子温度1.
    while (PORTBbits.RB4){}
    SpiChnPutC (SPI_CHN_R、0xFF);
    CANToSend[3]= SpiChnGetC (SPI_CHN_R);//转子温度2.
    while (PORTBbits.RB4){}
    SpiChnPutC (SPI_CHN_R、0xFF);
    CANToSend[4]= SpiChnGetC (SPI_CHN_R); //刹车片温度1
    while (PORTBbits.RB4){}
    SpiChnPutC (SPI_CHN_R、0xFF);
    CANToSend[5]= SpiChnGetC (SPI_CHN_R);//刹车片温度2.
    while (PORTBbits.RB4){}
    SpiChnPutC (SPI_CHN_R、0xFF);
    CANToSend[6]= SpiChnGetC (SPI_CHN_R);
    while (PORTBbits.RB4){}
    SpiChnPutC (SPI_CHN_R、0xFF);
    CANToSend[7]= SpiChnGetC (SPI_CHN_R);
    
    CAN1TxSendMsg (0x201);
    }
    } 

    数据输入和时钟

    数据输出和时钟

    DRDY 和时钟、gfycat 上的视频

    DRDY 和时钟+200ms、gfycat 上的视频

    /CS 始终连接低电平、我确保不运行 SDATAC 命令、我相信 RDATAC 是 ADC 的默认模式。 我不确定是否可以写入寄存器、我已经多次尝试查看采样率从5Hz 变为100Hz 或更高时是否有明显变化、但我看不到任何影响。 I double checked、Start 和/reset 在整个周期内保持高电平。 当触发器被置位时、DRDY 会出现、但如视频所示、它与一个时钟周期不正确对应、并且其宽度在相当大的范围内摆动。 我还展望了200ms、并看到 DRDY 的变化非常大、但仍然与时钟信号完全不相关。  

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


    查看您的图片和视频、您不会显示太多信息。 最好使用4通道示波器并在同一屏幕上捕获更多信息。 这对于验证与器件的通信非常重要。

    第一张照片显示的是 SCLK 和 DIN、然后是 SCLK 和 DOUT。 DIN 唯一的时钟重复进入 FF、看起来 DOUT 时钟输出00。 在视频中、您看起来是以5SPS 的数据速率运行、而您可以在其中查看 DRDY。

    但是、我确实有一些问题或意见。

    1.如何确定何时读取数据? 通常、您使用/DRDY 作为中断、然后在/DRDY 转换为低电平时时钟输出16位数据。 如果您继续添加更多时钟、则您已经为所有数据计时、并且我认为在下一个/DRDY 指示器件已完成新转换之前、您不会在 DOUT 上获得任何数据。 从视频中可以看到、您在 SCLK 中持续发送数据、而无需将这些数据读取计时为 ADC 转换计时。

    2.在视频中、/DRDY 也不会完全返回接地。 它看起来是高于接地大约1.6V 的低电平。 电路的数字部分是否存在连接错误?

    验证 ADC SPI 通信仍然很重要。 您应该能够使用 RREG 命令从寄存器中读取数据。 这是验证寄存器是否正确写入的最佳方法。 您至少应使用示波器(SCLK + DIN)捕获写入命令。 我只想看到 SPI 写入正确、并且您使用的是正确版本的 SPI。

    4.是否有原因不使用/CS? 它有助于对命令进行分段、如果 SCLK 噪声有问题、则可以重置 SPI 以确保错误不会继续。

    如果可以、则获取4通道示波器或逻辑分析仪。 查看器件写入和读取的通信时序非常重要。 然后根据/DRDY 转换为低电平来对读取进行时序控制。


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

    我的代码

    while (DRDY 高电平);

    While (DRDY HIGH);
    SPIChnPutC (SpiChannel、0xFF);
    SpiChnGetC (SpiChannel);
    SPIChnPutC (SpiChannel、 0xFF);
    SpiChnGetC (SpiChannel);
    while (DRDY HIGH);
    SPIChnPutC (SpiChannel、0xFF);
    SpiChnGetC (SpiChannel);
    SPIChnPutC (SpiChannel、0xFF);
    SpiChnGetC (SpiChannel);
    
    x2 

    因此、我等待 DRDY 变为低电平、然后再运行两个8位时钟周期并从这些周期中读回数据。 但是、如示波器所示、SPI 时钟与 DRDY 引脚变为低电平完全不一致。 我不确定为什么该行为不正确、因为4Mhz 时的2个 SPI 时钟周期比 DRDY 再次变为低电平的200ms 快得多。 我今晚将按照建议在 DRDY 引脚上设置中断代码、以查看这是否解决了该问题。

    2. DRDY 似乎仅降至1.2V、这可能会导致检测引脚是否为低电平的问题。 我查看了原理图、PCB 设计和物理板、以查看任何可能将引脚保持在1.2V 而非接地的连接。 除了 ADC 上可能出现故障/连接不良或 PIC32芯片编程不正确之外、不会出现任何可能导致该行为的现象。 一旦我开始对中断进行编码、我将仔细检查代码、并确保 PIC32在 ADC 拉低时不会尝试将同一引脚设置为高电平。

    3.我已经尝试向其发送 RREG 命令、 这是4通道读数、从上至下输入为:时钟、DIN、DRDY、DOUT。 下面是 DIN 和时钟的更近视图。 对于代码、在 while 环路之外、我通过 SPI 发送 ADC 0x16来命令 ADC SDATAC。 然后、在 while (1)循环内部、我立即发送 ADC 0x20用于 RReg 和0x03以从寄存器0开始读取4个寄存器。 然后、我发送0xFF 四次以读出这些寄存器(发送0x00而不是0xFF 时的结果相同)。 DOUT 不跟随这些时钟信号、而是在 DRDY 脉冲为低电平后直接发送大约16位值为1s 的信号、即使 ADC 应该已经听到 SDATAC 且 DRDY 没有理由变为低电平。  

    4.我已经尝试了默认设置数据读取代码以及读取寄存器代码(无论是否使用/CS)、但仍然看到连续的 CLK 信号、并且在示波器上没有看到其他行为的变化。  

    今天晚上、我将努力将 DRDY 设置为下降沿中断、并希望分享积极成果。

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


    请快速回答:

    您的 SPI 时钟速率是多少? 您提到4MHz、但在前一张示波器照片中、每2us 分段看起来像2个 SPI 时钟。 请注意、对于4.096MHz 外部主时钟、最快的 SPI 时钟速率将约为2MHz。 您可以在第11页的"时序要求"表中找到它。

    2、如果 DRDY 仅降至1.2V、则可能存在某种与主器件引脚的争用(可能该引脚设置为输出?)。 无论如何、1中的问题可能与2中的此问题有关。

    3.查看示波器照片、您的 SPI 版本错误。 对于 ADS1148、时钟空闲低电平、数据在 SCLK 的下降沿随时钟移入器件。 对于关闭示波器快照、您的时钟确实具有低时钟闲置状态、但您的输入数据尝试在上升沿将数据时钟输入到器件中。 修复此问题并再次检查读取结果。

    4.好的。 同样、数据在上升沿设置、并在 SCLK 的下降沿随时钟移入和移出器件。 我认为这称为 SPI 模式1、其中 CPOL=0、CPHA=1。 检查您如何设置 SPI、然后重试。


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


    您是否能够与 ADS1148进行通信? 我在您提供的示波器截图中看到您的通信中存在两个问题。 首先、SPI 版本错误、DIN 是针对 SCLK 上升沿编写的、而 ADS1148实际上是在 SCLK 下降沿读取 DIN。 其次、您好像在不断向器件写入 SCLK、但由于数据缓冲区不是循环的、因此您可能会对数据计时、稍后不会返回任何内容。

    如果您从器件中获取了数据、很好。 如果不是、请发帖、我们可以继续进行此操作。 如果您没有响应、我将关闭此帖子。 如果您被锁定到此线程、只需启动一个新线程。


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

    很抱歉耽误你的回复。

    我一直在努力使中断在我的 PIC32板上正常工作、因为我很确信这是获取实际数据的一个主要问题。 更改 SPI 模式是一个简单的解决方法。 我仍然不确定为什么等待 DRDY 的方法会持续一段时间(DRDY 处于高电平);没有强制程序等待其变为低电平、但我正在测试中断、希望我很快能收到好消息。  

    谢谢!

    Alex