我们刚刚收到了 ADS1248板,它测量2个差分电压(AIN0/AIN1、AIN4/AIN5)和2个 RTD (AIN2/AIN3、AIN6/AIN7)。 为了进行测试、我在 RTD 输入上放置了1.5k 电阻器。
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板,它测量2个差分电压(AIN0/AIN1、AIN4/AIN5)和2个 RTD (AIN2/AIN3、AIN6/AIN7)。 为了进行测试、我在 RTD 输入上放置了1.5k 电阻器。
您好、Parker、
很抱歉耽误你周末的答复。
您是否可以提供全范围捕获而不是片段?
与示波器捕获中所示的黄色和绿色迹线之间的串扰有关的一点是、 当黄色迹线被拉高时、绿色迹线中会出现明显的下冲。 我假设两个器件都使用2V 垂直增量、看起来下冲大约为1V、可能低于 GND。 如果您查看表 7.1绝对最大额定值(1)、您会发现不建议将 DGND 负值超出300mV 以上、并且可能会损坏器件。 您的原理图中未显示该电阻器、但数字通信线路上是否有电阻器或电容器? 这些线路到 UC 有多长时间?
作为测试、请尝试从器件读回寄存器。 加电后以及写入一些新寄存器、例如启用 IDAC。 如果寄存器读/写操作正常、请通过测量 R35上的 IDAC 输出、如您所述。
如果您还没有看到、RTD 测量的基本指南也可能会有所帮助: https://www.ti.com/lit/an/sbaa275/sbaa275.pdf?ts=1597095675338&ref_url=https%253A%252F%252Fwww.google.com%252F
数字 SPI 线路上没有电阻器/电容器、微处理器和 adc1248之间的走线非常短。
串扰似乎与示波器接地相关。 我找到了更好的连接、请参见下图。
但是、无论我读回的寄存器如何、我都看不到 MISO 上的任何活动。
为了最大限度地减少和简化配置/流量、上电后以及设置 NRST 并开始高电平后、 我现在要执行的唯一 SPI 写入是3个字节来将 AIN6和 AIN7设置为 GPIO: 0x4C、0x00、0xC0
我还将 SCLK 的速度减至大约100kbps、并增加了 CSn 和第一个 SCLK 之间的时间。 我还尝试在上升沿或下降沿更改 MOSI (示波器图片用于在 SCLK 的上升沿更改 MOSI)
然后,在循环中,我尝试每秒通过发送 0x4E、0x00、0x00 和 0x4E、0x00、0xC0来切换 GPIO (AIN6、AIN7)
但是、我在 AIN6/7测试点上看不到任何活动。
原理图中未显示、但我们通过将 CLK 引脚3接地来使用内部振荡器。 由于 NDRDY 似乎定期切换、因此内部时钟似乎正常工作。 还有什么可能导致基本 GPIO 无法正常工作的问题?
谢谢
您好、Parker、
感谢您提供有关其他测试的更多信息和详细信息。 我要尝试的一件事是在您发送 SCLK 后将 CS 保持为低电平。 发送 SCLK 后、似乎会将 CS 恢复为高电平、从而使 DOUT 进入高输入阻抗状态。
"
9.5.1.1芯片选择(CS)
CS 引脚激活 SPI 通信。 CS 必须在数据传输前处于低电平、并且必须在整个 SPI 通信周期内保持低电平。 当 CS 为高电平时、DOUT/DRDY 引脚进入高阻抗状态。 因此、对串行接口的读取和写入被忽略并且串行接口被复位。 DRDY 引脚运行独立于 CS。 DRDY 仍将指示新转换已完成、并作为对 SCLK 的响应强制为高电平、即使 CS 处于高电平也是如此。 将 CS 置为高电平只会停用与器件的 SPI 通信。 数据转换继续、并且可以监控 DRDY 信号以检查新的转换结果是否就绪。 监控 DRDY 信号的主器件可通过拉低 CS 引脚来选择合适的从器件。
"
接下来,我看到您正在写入 0x4E、0x00、0x00 和 0x4E、0x00、0xC0。
此格式:9.5.3.9 WREG (0100 rrr、0000 nnnn)
"4"表示写入寄存器、而 rrr 表示要写入的寄存器。 E 是 ADS1248上的 GPIO 寄存器。 0x4E 看起来正常。
接下来是0000、后跟 nnnn、其中 nnnn 表示要写入的字节数。 这里是0000、而不是0001。 尝试将0x00更改为0x01。
最后、要写入的字节。 您有0x00和0xC0。 0x00将关闭所有 GPIO。 而0xC0可能会写入0到1保留的位。 查看 9.6.4.11 GPIODAT - GPIO 数据寄存器(偏移= 0Eh)[复位= 00h]、您可以看到前4个位是保留的、应该被写为0000。 尝试将0xC0更改为0x0C。
请尝试这些步骤、并告诉我这是否有帮助!
尝试始终保持芯片选择为低电平、不仅是在3字节传输期间、而且不幸运。
同样、我尝试将第二个(长度)字节设置为1、但没有更改。 但是、我将数据表解释为、您必须减去1才能写入的数据字节数。 即写入1个数据字节、要求将此长度字节设置为0。
在 GPIODAT 上、我们使用 ADS1248、它使用位7和6f 将 AIN7和 AIN6用作 GPIO。
是否有任何功耗或时钟方面的措施会阻止 AIN6/7 GPIO 做出反应? 是否有任何其他方法可以判断芯片是否处于活动状态? 由于 Abide 不会进行 NDRDY 切换、因此它似乎不会响应任何命令(IDAC、GPIO 等)。
谢谢!
您好、Parker、
我再次查看了原理图、看不到任何明显的问题。 您可以探测电源以仔细检查 AVDD/DVDD 是否均按预期加电。 接下来、我将尝试使用 10.1.7伪代码示例来验证是否观察到所有时序周期和命令。
但是、由于器件正在切换 DRDY、我相信器件处于活动状态。 加电时序(等待16ms)可能存在问题、可能会导致问题。 我还建议发布一个额外的复位以及 SDATAC。
最大 SCLK 频率为2MHz。 最小值为64 * ODR (默认值为5)= 320Hz。
此帖子中还有一些示例代码可能会有所帮助。 https://e2e.ti.com/support/data-converters/f/73/p/340614/1190469#1190469
谢谢、初始化与我在尝试 GPIO 切换之前最初使用的初始化类似、因为验证所需的配置似乎较少。 您是否看到了在上电后立即 CPU 需要大约一秒钟的时间来初始化、然后 ADS1248被置出复位状态、并且启动线路被设置为高电平的任何原因? 发送这3个字节 0x4C、0x00、0xC0 、然后发送这3个字节 0x4E、0x00、0xC0不会导致 AIN6/AIN7变为高电平? SPI 的时序在之前的示波器捕获中... 但我还尝试将时钟速度降至100kbps、但结果相同(无 MISO 活动、无 GPIO 切换)。 我还尝试在发送 GPIO 命令之前先发送 RESET 命令、然后发送 WAKEUP 命令。
微控制器和 ADS1248之间的走线很短。 但是、示波器会拾取一点过冲。 不确定它是否真实。 由于我们没有任何串联的电阻器、因此器件是否对这可能是问题的位置非常敏感?
5V 和3.3V 电压轨看起来很好、同时导通。
您好、Parker、
在进入 GPIO 之前、您是否还能提供示波器捕获来显示您对寄存器的读取情况?
内部基准必须打开、IDAC 电流才能流动、即使您可能正在使用外部基准。
要使用 GPIO 引脚、首先必须 将 GPIO 配置寄存器从模拟输入设置为 GPIO (寄存器0x0C)。 寄存器0x0D 用于将 GPIO 设置为输入或输出、寄存器0x0E 用于将引脚设置为高电平或低电平。 和您一直在做的一样。
要写入寄存器、RESET 引脚必须为高电平、START 引脚必须为高电平、并且必须有有效的 CLK。 为了使用内部振荡器、CLK 引脚必须被接至低电平或者一个实际应用的有效时钟。 如果时钟引脚悬空、DEICE 可能会锁定、直到通过电源引脚或 RESET 引脚复位。
另一个需要确认的问题是 uC 是否将 DOUT 引脚保持在低电平。 您可以尝试将 DOUT 引脚提离迹线、以查看它是否在未连接 UC 时进行通信。
已验证 CLK 引脚是否接地以及 NRST 和 START 是否均为高电平。 虽然返回的数据始终为0、但 DOUT 确实会在数据之前显示活动!
下面的序列显示了一个到 GPIO CFG 寄存 器(0x0C)的 WREG 命令、其数据值为0xC0 (为 GPIO 设置 AIN6和 AIN7)、后跟 CFG 寄存器(0x0C)的立即 RREG。
数据采集时未显示、但 CSn 环绕每组28个 SCLK、如第一张图片所示。 右下角的画面与右上角的画面同时出现。 和显示 DOUT 在前16位有活动、但数据为0 (预期为0xC0)。
尽管在引脚上存在、但芯片看起来没有看到 DIN。 我已经尝试调整了 CSn 和 SCLK 之间的时间、SCLK 频率以及在上升/下降沿更改数据。 似乎没有任何东西能使芯片做出反应。
您好、Parker、
我已经与团队中的另一位成员详细讨论了这个问题、我们都同意我们应该从一开始就开始。
作为新的开始、请尝试将 SCLK 频率设置为1MHz。 我们知道、该频率可与 ADS1248配合使用、没有任何问题。
实际上、我们可以看到 ADS1248的数据、如右下角的图片所示。 ADS1248默认为连续转换模式(RDATAC)、因为结果会自动置于发送缓冲区中。 一旦收到 SCLK、数据就会被发出。 无论发送 RREG 或 WREG 命令、dat 都将针对前16位(MSB 和中字节)发出。 )。 如果该命令为 WREG、则将传输整个转换。 如果命令为 RREG、则仅发送前16位、因为在对 RREG 命令进行解码(命令和字节数)后、输出缓冲器将使用新的寄存器信息进行更新。
当 RESET 引脚为高电平且 START 引脚为高电平时、强烈建议您尝试使用寄存器0的 RREG 命令作为上电后的首次操作、而无需寄存器写入或任何其他命令。 该寄存器的默认值为0x01。 最好能看到该通信的示波器截图。
接下来、尝试发出 SDATA 命令以查看此命令是否起作用。 发送此命令后、您可以通过读取各种寄存器来验证它是否正常工作、并且在传输 SCLK 时、不应再在输出寄存器中看到转换数据。 我们希望看到此通信的示波器截图。
如果这正常工作、则尝试 WREG、并使用 RREG 读回它。 我们希望看到此通信的示波器截图。
从原理图上讲、AGND 和 DGND 看起来是相同的电位、但原理图确实显示了它们都标记为 AGND。 只需仔细检查它们是否是同一个网络。 如果它们是分离的、则应通过将接地端与低阻抗连接在一起、而不使用任何类型的电感、将它们连接到尽可能靠近 ADC 的位置。
很有可能、UC 和 ADS1248之间是否存在任何隔离? 如果是、信号可能会在隔离层上反相。
最后但同样重要的是、我们想确认您在哪里探测这些信号? 应尽可能靠近器件引脚。
之前的屏幕截图都是在 ADS1248的引脚上进行探测。 MCU (BGA)直接连接到芯片、之间没有电阻器/隔离。 这使得捕捉所有 SPI 活动变得有点困难。 我们正在进行线缆堆叠、但与此同时...
我已经调整了预分频器、以便 SCLK 现在测量926khz (而不是之前的1.8Mhz)。
上电后,复位保持低电平,1秒后释放,1秒后,Start 被置为高电平。 第二次之后,我读取寄存器0 (3字节传输),MISO 线路(和 CPU)请参阅:0xFE、0xD6、0x01。 (即0x01的 Mux0寄存器值是正常的)。
接下来发送 SDATAC 命令(0x16),MISO 行返回:0xFE。
最后、在循环中读取寄存器0、我看到 MISO 线路流量为 :0x00、0x00、0x01。 (芯片看起来好像不再转换了。 有趣的是、紧随 SDATAC 之后的读取会在前几个字节上看到非零数据。 这大概是旧数据)
遗憾的是、写入 GPIO CFG 寄存器(0x4C、0x00、0xC0)、然后命令读取(0x2C、0x00、0x00)、MISO 行返回0x00、0x00、0x00。 类似地、写入其他(IDAC、GPIO Direct、MUX0)的行为都相同。 它们不会返回写入的值。
AGND 和 DGND 之间无电压电势。 之前的示波器截图是使用 ADS1248引脚上的探头进行的。 CPU (BGA)和芯片之间没有电阻器/隔离器、这使得探测更加困难。 我们正在对导线进行堆叠以获取示波器捕获、但与此同时 、我们将 SCLK 减慢2、以便我们测量的频率现在为975khz (而不是1.875Mhz)。 接下来、我们将执行以下操作:
1)上电、 NRST/启动低电平、1秒延迟、NRST 高电平、1秒延迟、启动高电平、1秒延迟
2)读取寄存器0命令(3字节事务0x20、0x00、0x00)、MISO 线路(和 CPU)显示: 0xFE、0xD6、0x01
3) 3)发送 SDATAC 命令(0x16)、MISO 线路返回: 0xFE
循环中:
4)读取寄存器0命令,MISO 行返回: 0x00、0x00、0x01。 有趣 的是、在发送 SDATAC 后首次读取寄存器时、前2个字节是非零字节。 此外、NDRDY 继续切换。
遗憾的是、写入任何寄存器(例如 MUX0、IDAC0、GPIOCFG、GPIODIR、GPIODATA、 ETC)从寄存器返回的 RREG 数据表明写入的数据未被锁存。 例如、向 GPIODIR (0x4D、0x00、0xFF)写入输入 RREG 命令(0x2D、0x00、0x00)时 MISO 返回0x00 、0x00、0x00 、器件版本字段返回0x9。 DIN 数据未锁存是否存在任何已知问题?
您好、Parker、
我明白了、感谢您的努力。 我知道、将线路直接连接到布线上可能很困难。
这种行为非常特殊。 ADS1248似乎正在通信、WREG 命令除外。
另一个需要考虑的问题 是、WREG 命令包含3个字节;WREG 命令+启动寄存器、要读取的寄存器数量和数据。 RREG 命令包含2个字节的命令和一个用于读取寄存器的 NOP。 使用的命令序列是 RREG 命令+寄存器起始地址、要读取的寄存器数量、以及针对 NOP 的 WAKEUP 命令(0x00)而非(0xFF)。 此虚拟字节检索数据。 图84。 不正确、因为它不显示此 NOP 传输。
WREG 不工作的唯一原因是如果 START 不是高电平、CS 不是低电平、或者 SCLK 太快/太慢。 我们知道、所有这些标准在较高层面上都是正确的、这意味着它可能是通信线路中的干扰。 我们希望看到926kHz SCLK 频率下 WREG 通信(CS、START、SCLK、MOSI)的示波器图。 查看此通信的放大图也将大有裨益、以便我们可以查找干扰。
adc1248和 CPU 之间的布线长度约为一英寸。 我们正在重新设计电路板以添加电阻器/电容器。 但是、我不确定我们看到的过冲不是示波器的伪影。 微控制器不支持配置驱动强度。
有趣的是、它不是100%、但会进一步降低 SCLK 的速度、使用重试、寄存器将返回写入它们的数据。
如果正确读取 ADC 值、我将在明天进行测试、这至少是一个前进的权变措施。 我还想尽量减少所有寄存 器初始化后所需的寄存器写入量、理想情况下、只需写入 MUX0即可选择输入(将所有其他寄存器(包括 IDAC)保留为它们初始化一次的值)。
在设置权变措施的情况下、寄存器回读包含写入的数据:
一旦初始化,我们只需更新 MUXSEL,就可以最大程度地减少写入/重试次数 :
0x40 0x00 0x01
0x40 0x00 0x13
0x40 0x00 0x25
目前、所有通道的 PGA、REF 和 IDAC 设置都是相同的。
但是、尽管 R35处的电压为~2V、但 ADC 数据为零或0xc00000。 无论 CH0/1和 CH4/5上的电压 如何、或者 CH2/3上的 RTD 电阻如何。
可能仍然是 Flakey SPI 通信的一个遗留问题、但寄存器设置中是否有任何可能导致的问题?