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.

[参考译文] ADS7038:TI-ADS7038 仅读取第一个模拟通道

Guru**** 2490905 points


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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1536062/ads7038-ti-ads7038-only-reads-first-analog-channel

器件型号:ADS7038


工具/软件:

你(们)好 我们无法从任何输入通道读取 7038、但从最近_CH0_LSB 0xA0 读取的第一个通道除外。

下面简要介绍了将 7038 配置为手动模式和八个模拟输入的启动代码。

U8 REGISTER_BYTE = 0;

/*在完成初始测试之前启用禁用 CRC */
/* REGISTER_BYTE |= ADS_7038_REG_CFG_CRCEN;*/
/*启用已禁用统计模型*/
/* REGISTER_BYTE |= ADS_7038_REG_CFG_STATS;*/
/*启用禁用数字窗口比较器*/
/* REGISTER_BYTE |= ADS_7038_REG_CFG_WINDW;*/
/*将 CONV_MODE 位 5、6 保持为零以选择手动模式*/
/*启用禁用 ADC 校准*/
/* REGISTER_BYTE |= ADS_7038_REG_CFG_CALIB;*/

/*将所有通道设置为模拟输入*/
Register_byte |= ADS_7038_REG_CFG_Analg;

/*使用配置寄存器复位位位位从器件。 */
REGISTER_BYTE |= ADS_7038_REG_CFG_RESET;

ADS_7038_InstancePtr (Reg_Write、ADS_7038_REG_CFG_Addrs、REGISTER_BYTE);

/*将操作模式配置寄存器设置为低速振荡器内部时序。 */
REGISTER_BYTE = ADS_7038_REG_OPM_LOWSP | ADS_7038_CLK_DIV_09;

ADS_7038_InstancePtr (Reg_Write、ADS_7038_OFFSET_OPMODE_CFG、REGISTER_BYTE);

/*将序列配置寄存器中的所有选项设置为零以选择手动模式*/
ADS_7038_InstancePtr (Reg_Write、ADS_7038_OFFSET_SEQUENCE_CFG、0);

/*选择所有要读取的通道(尝试使用和不使用手动模式无效)。 */
ADS_7038_InstancePtr (Reg_Write、ADS_7038_OFFSET_CHAN_SELECT、0xFF);

/*回读通道选择寄存器以进行确认。 */
REGISTER_BYTE = 0;
ADS_7038_InstancePtr (Reg_Read、ADS_7038_OFFSET_CHAN_SELECT、&REGISTER_BYTE)> 0);
/*返回 0x00 No channels Selected。 */


读取原始 ADC

以下是从 7038 读取 ADC 的代码部分、
它效果良好、但仅适用于第一个通道零点。

/*选择频道*/
ADS_7038_InstancePtr (Reg_Write、ADS_7038_OFFSET_CHANNEL_SELECT、(u8) INDEX_CHANNEL);

/*回读以确认。 即使在上面选择了第二个通道 1、也始终返回零*/
ADS_7038_InstancePtr (Reg_Read、ADS_7038_OFFSET_CHANNEL_SELECT、&CHAN_CONFIRM);

/*从 7038 中读取 LSB 和 MSB 并进行组合以获得原始 ADC 值*/

U8 register_lsb = 0;
U8 REGISTER_MSB = 0;

S32 STATUS_lsb = ADS_7038_InstancePtr Reg_Read (offset_channel、&register_lsb);
S32 STATUS_MSB = ADS_7038_InstancePtr Reg_Read (offset_channel + 1、&REGISTER_MSB);

REGISTER_MSB =(REGISTER_MSB >> 4) 和 0x0F;

ANALOG_READING =(u32) REGISTER_lsb +((u32) REGISTER_MSB << 8);

电压读数正确、但只有在对第一个引脚通道零施加测试电压时才正确。
如果选择了任何其他通道、它仍然只从通道零读取值。

软件日志输出
读取 ADC 通道 1 选择写入= 0x00000001。
读取 ADC 通道 1 选择 confm = 0x00000000。
读取 ADC 通道索引 1 块= 0x000000A0。
读取 ADC 通道索引 1 offst = 0x000000A2。
读取 ADC 原始= 0x002991A8 电压= 0.000

非常感谢有关如何在手动模式下选择其他模拟输入通道 1-7 的任何建议。

Everett Sellner

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

    分析仪 PICS

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

    尊敬的 Everett:  

    我认为这里缺少的是其他频道的选择。

    这是通过写入 CHANNEL_SEL (0x11) 寄存器的 MANUAL_Chid 字段来完成的。  

    如果有用、请告诉我。 我从您的逻辑捕获中看不到 MOSI 上有任何活动、因此如果您还需要发送写入寄存器命令方面的帮助、请告诉我。

    此致、
    Joel

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

    Joel,

    你(们)好 感谢您查看这个。 我已经在选择通道。 请参阅我的代码中的上述内容。

    /*选择频道*/
    ADS_7038_InstancePtr (Reg_Write、ADS_7038_OFFSET_CHANNEL_SELECT、(u8) INDEX_CHANNEL);

    其中:

    #define ADS_7038_OFFSET_CHANNEL_SELECT 0x11

    我知道我的寄存器正确和 SPI 总线写入代码是有效的、因为我从通道 0 读取的电压与测试电压完全匹配、我们可以移动所有测试电压、并且 7038 从模拟输入零读取相同的电压。 这也证明 SPI 总线正常工作。 但是、当我尝试如您所指出的那样更改通道时、无论我们选择哪个通道、我们只得到与通道零相同的电压。

    此外、我向通道选择寄存器写入无零值后、正在立即读回该寄存器、而我读回的值始终为零。 如果读取状态寄存器或最新测量寄存器等其他寄存器、会得到非零值。

    Everett

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

    尊敬的 Everrett:

    我可以看到发送该命令的逻辑分析仪结果吗? 这将有助于验证是否正在发送正确的命令以及是否以正确的格式写入正确的寄存器。

    如果您在上面发送了它、请告诉我。 我认为、MOSI (SDI) 和 MISO (SDO) 线路可能已在逻辑分析仪上打开。

    此致、
    Joel

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

    好的、谢谢、今天我会给大家发送一些新的图表。

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

    好的。 也可以将逻辑捕获导出为文件并将其附加为.zip 文件、以便我可以将其打开并与之交互。 它通常比发送多个屏幕截图更容易,我得到更好的分辨率。

    此致、
    Joel

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

    很抱歉耽误你的时间。 我在使 SPI 总线的发送和接收看起来像 7038 规范中建议的那样用于通道选择、特别是用于寄存器写入和读取时、遇到了麻烦。 此外、当逻辑分析仪显示良好的解码读取寄存器响应来确认所选通道寄存器时、我的软件无法从 SPI 总线接收 FIFO 中读取该响应。 因此、我需要捕捉新的图形、并花更多时间尝试弄清楚接收 FIFO 没有保存预期通道字节的原因。 请继续解决问题。 谢谢。

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

    我现在对所有交易都有一整套图表、我认为下面的图表是唯一一个真正必要的图表。 它显示了用于在偏移 0x11 处读回通道选择寄存器的读取寄存器事务。 这很重要的原因是我们仍然从所有通道读取相同的电压、我认为我们实际上不是更改通道、当我在写入下一个通道索引后读回通道选择寄存器时、该值始终返回为零。

    请注意、在该图中、我相信在调整我的 SPI 总线 C 代码后、整个事务都尽可能接近读取寄存器规格中的图、还请注意 7038 的响应显然是正确的通道索引字节、所有七个通道都是如此、尽管下图仅显示了通道 4 的事务。  

    问题是当我读取 SPI 总线 FIFO 时、总是恢复为零。 我认为我没有正确读取 FIFO。 一种可能的解释是 7038 实际上是在图中线为低电平的时钟段的 MISO 上发送回零、并且我没有读取足够的 FIFO 字节来到达 7038 中包含正确通道索引的字节。 我今天将对此进行探讨。 如果您能想到有关如何正确阅读此内容的任何提示、请告诉我。

    请参阅此处的图表。 (很明显,MISO 和 MOSI 在这里翻转)。

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

    我从 SPI RX FIFO 读取所有此类事务的所有六个可能的 MISO 字节几乎是数千次、并且始终归零、即使逻辑分析仪清楚地显示 7038 发送了良好通道索引字节也是如此。 我的 SPI 轮询传输代码用于读取原始 ADC 寄存器、因为电压与测试电压匹配。 因此、不知道为什么同样的方法无法读取通道选择寄存器。  此时不确定该怎么做。  

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

    尊敬的 Everett:

    这 绝对是不寻常的。 我希望至少会有一些东西出来。 我自己试过,下面是我的结果(见右边的表格)。 这里的时间并不那么重要、因为发送的每个字节之间都会有较大的延迟、但它仍然会做出响应。

    我将通道 4 连接到 AVDD 以获得 0xFFF。 鉴于此、我至少预计会得到一些结果、甚至几个 LSB 也是如此。 您为器件提供的输入电压是多少? 您能否验证器件的输入引脚和提供输入的位置之间是否导通?

    除此之外、以前的某些配置可能会导致问题。 在默认操作中没有配置的情况下、您是否能够为 ADC 加电、只需更改 ADC 通道并读回结果? 如果上述任何一项都不起作用、则可能是器件本身已损坏、应将其替换为另一个进行检查。

    此致、
    Joel

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

    我们仍然存在问题、主要是在两个方面。 我无法再获得可预测的硬件读数结果、并且读数与施加的电压不匹配、尽管它们之前是这样。 当我确实获得 ADC 值并计算出电压并且匹配时、我继续在多个通道上看到读数、并且通常在所有通道上看到读数、因此似乎仍然没有收到更改通道的命令。

    我决定更改为“Auto-Sequence Mode“、如 7038 规范第 7.4.4 节所述。 这是因为它使通道变化问题不再符合公式。 据我所知、一切都在我的软件和 SPI 总线通信级别上正常运行。 我将在下面提供一整套图。 这使我相信这一切都是由硬件问题引起的、而不是 SPI 总线或 7038。

    我会要求您简要检查下图、以确认我正在正确编程“自动序列模式“、如果您可以这样做、我建议您立即关闭此问题。 原因是、在重新旋转电路板并正确安装 7038 并根据隔离、接地和其他硬件要求配置所有引脚和模拟输入方面超出我的理解、我无法排除测试设置中的硬件问题。 然后、如果正确制造 SPI 引脚和模拟输入后问题仍然存在、我们可以重新打开问题。

    因此、在结束时、请检查以下各项并验证我的自动序列模式。

    01 Total Transaction Overview、一个自动序列、然后读取所有最新值寄存器进行确认。

    02 向寄存器 0x12 写入可选择所有通道。

    03 写入到序列配置寄存器的 0x10、0x11 =序列模式、启动

    在此之后、我在每次读取之间切换 CS、并读取 SPI 输入 FIFO MISO(图像中相反)以获取每个通道。

    04 读取序列概述

    05 读取通道 0

    06 读取通道 1

    07 读取通道 2

    。 。 。 08 读取通道 7

    09 终止自动模式序列

    以下内容不是必需的、但我这样做是为了进行调试、希望从 A0 开始获得与从 SPI MISO 自动序列读取通道时相同的值、遗憾的是情况并非如此。 但这里是图表。

    10 读取 A0 偏移 0 处的寄存器(读取 AIN 0 MSB)

    11 读取 A0 偏移 1 处的寄存器(读取 AIN 0 LSB)

    如果所有这些都是正确的、那么我们可以关闭此问题、直到 7038 位于生产板中。

    感谢你的帮助。

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

    尊敬的 Everett:  

    我已经看了几次了,不要注意到在顺序中的任何可能是错误的。 我将再次查看它、并尝试在我自己的电路板上重新创建它、但是的、在另一个电路板上尝试这可能是值得 的、以排除当前电路板存在问题。

    此致、
    Joel

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

    Joel,

    你(们)好 感谢您了解自动序列输出。 我们可以根据我现在需要的内容关闭该线程、如果需要、在硬件重新旋转后可以进行进一步测试时、我将重新打开或启动新线程以引用该线程。 另外、非常感谢您的关注。

    Everett