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.

[参考译文] ADS1248:预设 FSC 值的问题

Guru**** 2390755 points
Other Parts Discussed in Thread: ADS1248, ADS1284

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/721521/ads1248-problems-with-preset-fsc-values

器件型号:ADS1248
主题中讨论的其他器件: ADS1284

我们有一个使用 ADS1248读取一对 T 型热电偶的现有设计。 我们已经完成了两次预量产、每次预量产20个器件、均按预期运行。 我们第三次运行50块电路板、会导致问题。 就热电偶电压而言、所有电路板的读数都不正确、为原来的4倍。 深入研究该问题时、芯片似乎将 FSC 的所有 PGA 值设置为0xFFFFFFF、而不是接近0x400000的正常值。 这是导致4倍误差的因素。 我们的软件无法访问 FSC、我只是通过编写额外的例程来检查其值才发现了这一点。

我附上了一张芯片的照片、其中显示了此问题的日期代码用途等

我可以通过将 FSC 设置为0x400000来解决这个问题、但我可能通过这样做失去了工厂调整的好处。

由于当前编译数很小、因此不是一个主要问题、但我确实需要了解问题的原因、以便我们可以在将来的编译中避免该问题。 有什么想法吗?

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


    正确的做法是、将 FSC 值设置为0x400000将失去工厂修整和增益误差规格的优势。 我不确定、但这对我来说仍然有点软件问题。 我将解释我的意思、并为您提供几个额外的测试、以确保正确。

    首先、我将介绍我认为这仍然是软件问题的原因。 由于 FSC 寄存器针对每个增益进行了出厂调整、因此无法获得如此大的 FSC 值的可用值。 最终测试永远不会从测试中获得合理的结果(在主测试之前对 FSC 进行编程)。 即使我们有一组最终测试的拒绝、我们也不会看到这种类型的故障。 我注意到的另一件事是、我相信生产日期代码是从2013年8月开始。 如果以前出厂时设备出现了此问题、我会就此与我联系。

    您可能可以直接将0xFFFFFFF 写入 FSC 寄存器、但我的第一个猜测是代码中有一些内容正在启动增益误差校准、基准或输入与预期值相比较。 在增益误差校准中、您将一些东西输入到满量程输入中、ADC 会补偿以调整 FSC 值、尝试使满量程输出数据为0x7FFFFF。 如果基准或输入不符合预期(假设输入电压为0V 或基准电压非常大)、则增益校准设置为最高值、但仍超出可用范围。

    为了测试这一点、我会像您所做的那样读取寄存器。 但是、您可能应该确保获得的值是默认值、并且之前未更改过。 您可以通过两种不同的方法来实现它。 首先、您可以运行 RESET 命令、然后读取寄存器。 其次、您可以将增益设置为不同的设置(即从增益1设置为16)、然后立即读取 FSC 值。 在这两种情况下、应将 FSC 寄存器重置为出厂调整的默认值。

    我真的不知道您将不同的构建批次组合在一起的过程是什么、因此我不确定这是否是合理的解释。 但是、我认为值得按照我所解释的那样通过测试来检查值。 如果您对测试有任何疑问或意见、请告诉我、我们可以进一步讨论。 请告诉我您的想法和结果。


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

    您好、Joseph、  

    感谢您的回答。

    这有点棘手、因为硬件不再具有调试端口、因为它是一个生产单元。 我重新配置了几行编程端口、用作位基 RS232、以便从系统中获取数据(我通过直接访问 PIC 存储器获取原始数据)

    这是我使用的代码片段

    它是用 CCS PICC 编写的。 我还没有包括处理芯片的子例程、因为它们显然可以正常工作

    基本上、我读取启动 SYS0、打印它、将 SYS0设置为98 (增益64、20SPS)、再次读取 SYS0作为检查、读取并打印默认 FSC、将 FSC 设置为0x400000、读取并打印新值。

    ///----------------------------------------------

    // SYS0 -增益= 64、每秒20个样本(每50ms 20SPS = 1个)

    ///----------------------------------------------

      iReg = 0;

      iCheckReg = readADS1248Reg (iDev、SYS0);

      fprintf (调试、"读取并打印 SYS0的启动值\n\r\n);

      fprintf (调试、"启动 SYS0 %u \n\r"、iCheckReg);

      iReg =(iReg | GAIN_64 | SPS_20);                                //GAIN = 64

      writeADS1248Reg (iDev、SYS0、iReg);                              //写入寄存器

      delay_ms (1);

      iCheckReg = readADS1248Reg (iDev、SYS0);

      fprintf (调试、"读取并打印 SYS0的新值\n\r\n);

      fprintf (调试、"新设置的 SYS0 %u \n\r"、iCheckReg);

      fprintf (调试、"读取和打印 FSC 字节并汇编为 int32格式\n\r");

      i32FSC = 0;

      ireg = readADS1248Reg (iDev、FSC2);

      fprintf (调试、"fSC MSB %X \n\r"、iReg);

      iFSCMSB = ireg;

      ireg = readADS1248Reg (iDev、FSC1);

      fprintf (调试、"fSC MDB %X \n\r"、iReg);

      iFSCMDB = ireg;

      ireg = readADS1248Reg (iDev、FSC0);

      fprintf (调试、"fSC LSB %X \n\r"、iReg);

      iFSCLSB = ireg;

      delay_ms (1);

      i32FSC = Make32 (0、iFSCMSB、iFSCMDB、iFSCLSB);

      fprintf (调试、"默认 FSC %LX \n\r"、i32FSC);

      fprintf (调试、"将 FSC 设置为0x400000、读取并打印 FSC 字节并汇编为 int32格式\n\r\n);

      writeADS1248Calibration (iDev、0x00400000);

      i32FSC = 0;

      ireg = readADS1248Reg (iDev、FSC2);

      fprintf (调试、"fSC MSB %X \n\r"、iReg);

      iFSCMSB = ireg;

      ireg = readADS1248Reg (iDev、FSC1);

      fprintf (调试、"fSC MDB %X \n\r"、iReg);

      iFSCMDB = ireg;

      ireg = readADS1248Reg (iDev、FSC0);

      fprintf (调试、"fSC LSB %X \n\r"、iReg);

      iFSCLSB = ireg;

      delay_ms (1);

      i32FSC = Make32 (0、iFSCMSB、iFSCMDB、iFSCLSB);

      fprintf (调试、"设置 FSC %LX \n\r"、i32FSC);

    这是输出。。。 您可以看到默认 FSC 为0xFFFFFFC0

    读取并打印 SYS0的启动值

    启动 SYS0 0

    读取并打印 SYS0的新值

    新设置的 SYS0 98

    读取并打印 FSC 字节并汇编为 Int32格式

    FSC MSB FF

    FSC MDB FF

    FSC LSB C0

    默认 FSC FFFFC0

    将 FSC 设置为0x400000、读取并打印 FSC 字节并汇编为 Int32格式

    FSC MSB 40.

    FSC MDB 0

    FSC LSB 0

    设置 FSC 400000

    如果我用不同的批次/生产日期代码换芯片、我会得到以下结果、这比预期的要好得多

    读取并打印 SYS0的启动值

    启动 SYS0 0

    读取并打印 SYS0的新值

    新设置的 SYS0 98

    读取并打印 FSC 字节并汇编为 Int32格式

    FSC MSB 40.

    FSC MDB D

    FSC LSB C0

    默认 FSC 400DC0

    将 FSC 设置为0x400000、读取并打印 FSC 字节并汇编为 Int32格式

    FSC MSB 40.

    FSC MDB 0

    FSC LSB 0

    设置 FSC 400000

    我很难将其视为软件问题!

    您是否知道默认 FSC 是如何存储在芯片上的? 存储器是否易失? 它是否会在较旧的芯片批次上降级?

    在我们进行更多生产之前、我需要先解决这个问题。

    此致、

    标记

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

    Mark、


    感谢您的代码片段。 我仍然认为最好在复位和读取时运行测试。 通过该序列、我可以确保复位会将寄存器设置回默认值。 这样就消除了这两者之间不存在任何其他通信的可能性、这些通信可能会影响 FSR 寄存器的任何更改(例如意外写入或校准命令)。 另一个注意事项是、最好记录不同增益的多个 FSR 值、以确保器件中编程了不同的值。

    但是、如果您尚未更改代码并且仅交换了器件(通过将器件从电路板上拆焊并将新器件焊接到电路板上)、则问题看起来就像器件问题一样。

    该器件采用与闪存类似的结构进行编程、并且是非易失性器件。 我不知道内存损坏或降级的任何情况(更不用说一整批单元)。 这些器件来自哪个经销商? 通常、如果我们认为器件存在缺陷、应将其退回给经销商、然后开始某种故障分析。


    吴约瑟

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

    您好、Joseph、

    我尝试按照建议添加复位 (下面的代码段)、但没有结果。 报告的 FSC 始终为0xFFFFFFC0。 我已经在6个不同的芯片上尝试过这种方法、它们都报告了相同的 FSC 价值。 不确定为什么 FSC 的最后6位为零、FSC 实际上是18位并移位了吗?

    电路板制造商已经确认、芯片来自一盒2000个器件、批号为1342、我从生产日期代码中猜测、这些器件是另一个项目的剩余库存。

    确定了问题的根源后、我可以通过在增益设置后检查 FSC、如果增益大于0x420000、将其设置为0x400000、来相对容易地解决问题。 由于我们随后在软件中进行了二次校准(不使用芯片因子)、因此这可作为一种修复方法、以适应热电偶的微小差异。 不过,我有两个问题:第一,ADC 显然有某种形式的缺陷,我担心可能还有其他问题有待我发现;第二,如果 ADC 在运行时因任何原因复位,仪器校准将受到影响。

    我已经使用这些芯片运行仪器并进行软件修复大约3天了、但这些电路板最终是供客户使用的、我想知道我是否应该更换芯片。

    在你的第一份答覆中,你暗示生产中不会出现这种故障,这意味着这个问题是由一些外部因素引起的,并会令我觉得更换芯片是明智的。 另一方面、如果 FSC 存储器在生产过程中被错误写入、那么我更倾向于使用软件修复。

    欢迎就此提出任何想法。

    此致、

    标记

    代码

    ResetADS1248();

      fprintf (调试、"通过将 RESET 引脚脉冲为低电平250ms 来重置 ADS1284、然后将其设置为高电平并等待20ms 以稳定\n\r\n);

      fprintf (调试、"读取和打印 FSC 字节并汇编为 int32格式\n\r");

      i32FSC = 0;

      ireg = readADS1248Reg (iDev、FSC2);

      fprintf (调试、"fSC MSB %X \n\r"、iReg);

      iFSCMSB = ireg;

      ireg = readADS1248Reg (iDev、FSC1);

      fprintf (调试、"fSC MDB %X \n\r"、iReg);

      iFSCMDB = ireg;

      ireg = readADS1248Reg (iDev、FSC0);

      fprintf (调试、"fSC LSB %X \n\r"、iReg);

      iFSCLSB = ireg;

      delay_ms (1);

      i32FSC = Make32 (0、iFSCMSB、iFSCMDB、iFSCLSB);

      fprintf (调试、"默认 FSC %LX \n\r"、i32FSC);

      fprintf (调试、"将 FSC 设置为0x400000、读取并打印 FSC 字节并汇编为 int32格式\n\r\n);

      writeADS1248Calibration (iDev、0x00400000);

      i32FSC = 0;

      ireg = readADS1248Reg (iDev、FSC2);

      fprintf (调试、"fSC MSB %X \n\r"、iReg);

      iFSCMSB = ireg;

      ireg = readADS1248Reg (iDev、FSC1);

      fprintf (调试、"fSC MDB %X \n\r"、iReg);

      iFSCMDB = ireg;

      ireg = readADS1248Reg (iDev、FSC0);

      fprintf (调试、"fSC LSB %X \n\r"、iReg);

      iFSCLSB = ireg;

      delay_ms (1);

      i32FSC = Make32 (0、iFSCMSB、iFSCMDB、iFSCLSB);

      fprintf (调试、"设置 FSC %LX \n\r"、i32FSC);

    复位功能是  

    //====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

    // void resetADS1248 (void)-复位 ADS1248器件

    // ADS1248器件的复位引脚必须保持低电平才能复位器件。 复位周期为 A

    //每秒样本数的函数-请参阅 TI ADS1248数据表第35页的表格、

    //最慢的数据速率(5SPS)要求复位200.26ms。

    //开始与//芯片通信之前,需要进一步延迟2到16个系统时钟的功率。 使用4.096MHz 的内部振荡器时、该延迟为15.99ms。

    //====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

    void resetADS1248 (void)

      OUTPUT 低电平(ADS1248_RESET);                                          //复位低电平

      delay_ms (250);                                                      //等待250 ms

      OUTPUT 高电平(ADS1248_RESET);                                         //复位高电平

      delay_ms (20);                                                      //等待20 ms

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

    Mark、

    一位同事提出了一种您也应该检查的可能性。 我将验证系统是否满足数据表第11和12页7.6和7.7中列出的 SPI 的时序要求和开关特性。 如果时钟运行得太快、或违反任何其他时序或开关规格、则错误可能是不寻常的、结果可能会从器件批次变为器件批次。 一个常见的错误是 SCLK 频率运行得太快。 另一个可能产生通信错误的违反是 tSCCS 规范、其中在最后一个 SCLK 下降沿到/CS 上升沿之间有一个7 tclk 要求。 我会仔细查看这两个表、以确保通信设置正确。

    最好在示波器上绘制 SPI 通信图、以便查看是否存在任何其他噪声问题。 如果您仍有重置/FSC 读取代码、最好特别显示该代码。 生成该图后、您可以将其发布回这里。

    对于单元和电路板、我有几个问题。 如果装置的性能确实不正确、我会将其退回。 它们不起作用的事实意味着存在一些错误、也许还有更多错误、我们尚未发现。 仅仅因为您可以对要在电路板上工作的器件进行编程并不意味着它是好的、而且对于尚未测试的情况、也不会出现错误。 如前所述、如果 ADC 在运行时复位、校准将受到影响。

    通常、商品通过分销商退货。 这将触发质量分析以确定故障点。 要退回商品、我首先从包装箱中找到"配送追踪代码"。 它如下所示:

    现在、我担心这些单元显示的错误是我认为不可能的。 我不认为我们可能会发出修整错误的器件、我从未看到过任何修整值降级的情况(更不用说具有相同误差的整批器件)。 这些是否可能是灰色市场单位? 如果有人有一批已损坏或损坏的器件、我可以将此视为错误。 我要求提供运输路线代码的原因是要找到这些商品的来源。

    吴约瑟

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


    在这篇文章上、我已经听过您的介绍了。 您是否进一步调查过此问题?

    我对这些器件的担心是、似乎有特定的批次显示出我认为不可能发生的故障。 如果您认为这些器件出厂时已进行了错误编程、我将不会将它们用于您的产品、并将它们退还给经销商。 同样、我不知道出厂测试后在编程中降级的任何器件。

    我现在将关闭此帖子、但如果您想讨论解决方案、您应该能够再次打开它。


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

    您好、Joseph、

    从该电路获取 SPI 数据迹线是一项挑战。 这是一个生产板、没有调试选项卡、加上芯片的间距都为0.5mm、这已经成为一场焊接噩梦。

    我修改了在控制器 PIC24EP256MC204上运行的软件、以便可以切换其中一个引脚以充当示波器的触发器、从而访问特定的 SPI 事务。 我主要是软件、因此我用于此类工作的工具有限、因此数据是在200MHz 带宽、2通道 PicoScope 示波器上收集的。 SPI 波特率为625kHz、因此 Picoscope 示波器应令人满意。  

    首先是 CS 低电平到第一个时钟、最后一个时钟到 CS 高电平

    每端的时序大约为3us、远高于所需的10ns。

    其次、我有 SDO 和时钟

    出站消息读取0x2900 (读取寄存器、寄存器9 (FSC2)、1个字节)、看起来正常

    接下来、我在复位后立即具有用于读取 FSC2的 SCK 和 SDO。

    这个图让我担心、它显示数据读数为0xFF、但 SDO 在多个 MS 上衰减。 我认为、这里发生的情况是、ADS1248只是在 SPI 事务完成后放弃引脚、剩余电压通过高阻抗 PIC 输入引脚放电。 为了证明这一点、我在将 FSC 设置为0x400000后将示波器触发器移至 FSC2的读取、并得到以下跟踪。

    现在的值为预期的0x40

    因此、您可以从此处看到、SPI 似乎正在工作。 根据数据表,我看不到任何计时问题。

    我仍在等待中国制造商提供的器件的 STC 代码。 我会在听到时通知您。

    此致、

    标记

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


    感谢您的观看。 我曾希望能看到从 FSC 的原始读数到新数据编程后的读数的整个数据传输序列。 从第二幅图中可以看出、您最初读取的是 FSC 29H 00h FFh (或按照正确顺序读取的 FF0029h)。

    之后、我假设您已经重新编程了 FSC 值、以便您以00h 00h 40h 的格式(按照正确的顺序再次写入400000h)写入该值。 我会注意到、SDO 现在读取的是5V、而不是原始的3.3V。 我不知道为什么会这样。 不过、SDO 会出现压降。 一旦/CS 再次变为高电平、ADS1248释放 DOUT 线路并使其成为高阻抗。 如果 SPI 上有多个器件、则需要确保没有器件垄断总线、以便其他器件无法使用该总线。

    除此之外、我在 SPI 通信中没有发现任何问题。 计时看起来足够慢。 同样、我更希望看到整个数据序列、但如果没有具有存储器的示波器或逻辑分析仪、则很难看到。

    当您听到制造商的反馈时、请告诉我。 通过使用 STC、我们可以跟踪有关器件的大量信息、包括器件的晶圆制造位置、测试位置以及器件制造过程中使用的所有版本。


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


    自从您发送一篇文章以来、这已经有点过了、我想我会检查您的问题。 我们最近对论坛的结构进行了重新排序、因此我有点担心您无法找到返回原始帖子的方法。

    无论如何、如果您仍然有问题、可以在回帖后继续处理这个问题。


    吴约瑟