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.

[参考译文] ADS7028:ADS7028的读取和写入问题

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1502404/ads7028-read-and-write-issue-with-ads7028

器件型号:ADS7028
线程中讨论的其他器件: TMS320F28377D

工具/软件:

您好:

我们在项目中尝试使用 ADS7028传感器进行 ADC 读数。 但通信存在问题。 简而言之、我们似乎无法向 ADS7028的寄存器写入任何内容、当我们回读同一寄存器的内容以进行调试时、内容会不断变化。 这可以从随附的图片中看到。  

在这些图片中、会针对 系统状态寄存器发送寄存器读取命令。 但从图中可以看出、从 ADS7028接收到的数据会针对每条消息而发生变化。  

 

橙色:来自 ADS7028的数据

蓝色:芯片选择

黄色:SCLK

绿色:来自 MCU 的数据

我们真的困难重重、因此感谢您提供的任何帮助。

谢谢。

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

    尊敬的 Ege:

    感谢您的联系。 您是否能够发送一些更放大的通信图片、并且可以清楚地看到 SCLK 转换? 或者、如果您有可用的逻辑分析仪捕获结果、最好也是这样。

    ~、我注意到的一点是、ADS7028 SDO 在 Δ V CS 变为高电平后的上升时间相当慢。 仅靠这一点可能不是问题、但您能否分享原理图或这条线上的上拉电阻值?  

    此致、
    Joel

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

    嗨、Joel、  

    为了放大更多信息、我将它们都分为两部分。 一个用于读取寄存器命令、另一个用于结果。 他们可能与旧照片略有不同,这是奇怪的,正如我所说的。 这是我最能放大的、比这更重要的是、数据不能放入屏幕中。

    第一个查询:

    第二个查询:

    即将到来的数据部分的作用很奇怪。 但我不确定我们是否有逻辑分析仪。

    对于 SDO 的上升时间、我在片选切换之间实现了延迟、以确保器件可以获取正在进行的操作。 我相信在芯片选择切换之前和之后、它们都是5us。 对于上拉、我们在片选通道上有10k Ω 电阻器。

    ADS7028的原理图:

    由于机密性、我不得不省略左侧、但如果没有交叉点、它们就会连接在一起。  

    谢谢。

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

    尊敬的 Ege:

    您的控制器上的 SPI 模式配置似乎不正确。 ~情况下、ADS7028在 SPI 模式0 (CPHA = 0、CPOL = 0)下运行、其中 SCLK 在 Δ i CS 处于非活动状态时处于空闲状态、数据在前沿(在本例中为上升沿)捕获。 ADS7028器件在 SCLK 上升沿从控制器读取 SDI 数据。 因此、需要一定的建立时间来确保 SDI 在 SCLK 上升沿之前保持稳定、并且 SCLK 下一个上升沿的数据通常会在前一个 SCLK 下降沿改变。

    目前、SDI 看起来与 SCLK 上升沿同时变化、因此 违反了建立时间。 这应该相对容易改变。  假定其他一切都正确、这将解决您的问题。 如果您 有任何其他问题、请告诉我。

    此致、
    Joel

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

    嘿、Joel、令人惊讶的是实际上解决了这个问题。  

    令人惊讶的是、我的 MCU 是 TMS320F28377D、初始化代码如下:

    //初始化 SPI-A
    //在配置更改前将 RESET 设置为低电平
    SpiaRegs.SPICCR.bit.SPISWRESET = 0;
    //启用主器件(0 =从器件、1 =主器件)
    SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;
    //时钟极性(0 ==上升、1 ==下降)
    SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
    //无环回
    SpiaRegs.SPICCR.bit.SPILBK = 0;
    //时钟相位(0 ==正常、1 ==延迟)
    SpiaRegs.SPICTL.bit.CLK_PHASE = 0;
    //设置波特率(SPI 波特率= LSPCLK/(BRR + 1))
    SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = 49;//(1 MHz)
    //无高速模式。
    SpiaRegs.SPICCR.bit.HS_MODE = 0;
    // 8位字符
    SpiaRegs.SPICCR.bit.SPICHAR = 0x07;
    //清除 SPI 标志
    SpiaRegs.SPISTS.bit.overlulation_flag = 1;


    //初始化 SPI-A FIFO 寄存器
    //启用 FIFO
    SpiaRegs.SPIFFTX.bit.SPIFFENA = 0;
    //清除 FIFO 标志
    SpiaRegs.SPIFFTX.bit.TXFFINTCLR = 1;
    SpiaRegs.SPIFFRX.bit.RXFFOVFCLR = 1;
    SpiaRegs.SPIFFRX.bit.RXFFINTCLR = 1;
    //从复位中释放 FIFO
    SpiaRegs.SPIFFTX.bit.TXFIFO = 1;
    SpiaRegs.SPIFFRX.bit.RXFIFORESET = 1;
    //为中断设置级别、将不使用中断
    SpiaRegs.SPIFFRX.bit.RXFFIL = 1;
    SpiaRegs.SPIFFRX.bit.RXFFIENA = 0;

    但这不起作用。 它通常应该具有具有具有 CLKPHA 和 CLKPOL 0的初始化 SPI。 但当我像下面这样将相位更改为1时、它以某种方式解决了问题:

    //初始化 SPI-A
    //在配置更改前将 RESET 设置为低电平
    SpiaRegs.SPICCR.bit.SPISWRESET = 0;
    //启用主器件(0 =从器件、1 =主器件)
    SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;
    //时钟极性(0 ==上升、1 ==下降)
    SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
    //无环回
    SpiaRegs.SPICCR.bit.SPILBK = 0;
    //时钟相位(0 ==正常、1 ==延迟)
    SpiaRegs.SPICTL.bit.CLK_PHASE = 1;
    //设置波特率(SPI 波特率= LSPCLK/(BRR + 1))
    SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = 49;//(1 MHz)
    //无高速模式。
    SpiaRegs.SPICCR.bit.HS_MODE = 0;
    // 8位字符
    SpiaRegs.SPICCR.bit.SPICHAR = 0x07;
    //清除 SPI 标志
    SpiaRegs.SPISTS.bit.overlulation_flag = 1;


    //初始化 SPI-A FIFO 寄存器
    //启用 FIFO
    SpiaRegs.SPIFFTX.bit.SPIFFENA = 0;
    //清除 FIFO 标志
    SpiaRegs.SPIFFTX.bit.TXFFINTCLR = 1;
    SpiaRegs.SPIFFRX.bit.RXFFOVFCLR = 1;
    SpiaRegs.SPIFFRX.bit.RXFFINTCLR = 1;
    //从复位中释放 FIFO
    SpiaRegs.SPIFFTX.bit.TXFIFO = 1;
    SpiaRegs.SPIFFRX.bit.RXFIFORESET = 1;
    //为中断设置级别、将不使用中断
    SpiaRegs.SPIFFRX.bit.RXFFIL = 1;
    SpiaRegs.SPIFFRX.bit.RXFFIENA = 0;

    不知道为什么。 如果你有什么想法,为什么发生这种情况,我很感激。  

    谢谢。

    Ege