工具与软件:
大家好、团队成员:
在尝试写入 ADS131M08 ADC 的时钟寄存器时遇到一些困难。 我的目标是改变 XTAL_DIS 位(我使用外部晶体)。
下图显示了我要发送到 ADC 的帧:0x618000
(WREG)、后跟寄存器数据(0x24E
)、0x00
以满足字大小要求。 但是、回读寄存器时、其值保持默认值。
您能帮我解决这个问题吗?
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.
大家好、Lucas:
您是否可以上传类似以下时序的时序、包括/CS、SCLK、SDI 和 SDO? 如果可能、也最好包含/DRDY 信号。 该时序用于将0x0E0E 寄存器数据写入 GAIN 寄存器(04h 地址)。
为了清除、您是否计划将 CLOCK 寄存器中的 XTAL_DIS 位设置为"1"? 该位的默认值为"0"。 时钟寄存器定义为晶体振荡器使能、低电平有效。 因此、0 =振荡器被启用、1 =振荡器被禁用。
BR、
戴尔
尊敬的 Dale:
感谢您的答复!
遗憾的是、我的示波器只有2个通道、只能测量 SDI、SDO 和 SCK。
我之所以设置 XTAL_DIS 位、是因为我使用外部晶体。 数据表有点令人困惑、因为该位的说明为"禁用晶体振荡器"、默认情况下设置为"0"(启用)。
我所面临的问题是、我没有从通道获得任何测量结果。 我希望这与振荡器有关、因为振荡器的工作默认使用 MCU 提供的时钟信号。
尊敬的 Dale:
首先、我尝试读取默认激活的通道、根据时钟寄存器的复位值、应该启用所有通道。 DRDY 变为低电平后、我将 CS 引脚拉至低电平、然后在 SDK 线路上发出9字(24位)命令。 但是、它无法正常工作-所有通道都从 ADC 返回零、并且我仅收到状态。
鉴于这种行为、我分析了数据表、并注意到时钟寄存器 XTAL 位说明中有一句关于"晶体振荡器禁用"的歧义句子。 因此、我开始尝试更改 XTAL 和通道使能位以查看它是否会起作用。
大家好、Lucas:
感谢您提供的信息。
您是否有可用于检查的外部时钟(振荡器或来自 CPU 的时钟)? 我没有晶体、因此无法为您进行检查。 我的理解是、您的寄存器读数(包括其他寄存器)是正确的、如果我的理解不正确、请告诉我。 您的 SCLK 频率和晶振频率是多少? 您是否尝试过对其他寄存器进行编程并回读以进行检查? 您的时序和原理图将非常有助于识别问题、您可以对 /CS、SCLK、SDI 和 SDO 信号使用不同的捕获。 您可以使用这些配置在不写入任何寄存器的情况下收集数据。
BR、
戴尔
尊敬的 Dale:
我有一个7.68 MHz 晶体、我们无法使用 MCU 馈送时钟、只能使用晶体。 我的 SCLK 频率是2.5Mb/s
更新:
我最终成功地正确写入了寄存器。 此问题似乎与我的代码有关。 更改 XTAL 位的状态后、DRDY 引脚停止振荡。 当使用外部晶体时、寄存器的默认值似乎正确。 但是、我仍然无法执行通道读数。
在下图中、我在不更改任何寄存器值的情况下为 ADC 加电、并 在 DRDY (CH4、蓝色走线)变为低电平之前在 SCLK (CH2、浅蓝色走线)上发出3个字(9字节)。 如您在 MISO 信号(CH1、黄色迹线)上所见、我只接收第一个状态字、而以下数据全部为 NULL。 这些值应为 NULL 以外的任何值。
您能帮我解决这个问题吗?
大家好、Lucas:
/DRDY 是指示数据转换是否完成的信号。 低电平/DRDY 表示数据已就绪、您可以读取。 根据时序、您是在/DRDY 为高电平期间发送 SCLK、这是不正确的。 来自 ADC 的/DRDY 信号可用作 微控制器的中断、/DRDY 的下降沿可以触发中断、然后您可以在中断子例程中将 SCLK 发送到 ADC。
此外、应向 ADC 发送更多 SCLK 以读取所有通道数据。 预计10个字(30字节)会移出状态字+所有通道数据+CRC。
根据晶体频率和默认 OSR=1024、实际数据速率为~3.76ksps。 这表示您需要在265us 期间读取所有数据。 您的2.5MHz SCLK 频率 太低、无法读取数据。 您需要提高 SCLK 频率。 当 DVDD 为3.3V 时、最大 SCLK 频率为25MHz。
在向 ADC 发送 SCLK 时是否要切换/CS?
BR、
戴尔
尊敬的 Dale:
我按照下面的顺序进行操作。 您能帮助我确定错误在哪里吗?
uint8_t reset[30]={0};
RESET[0]= 0x00;
RESET[1]= 0x06;
RESET[2]= 0x00;
HAL_DELAY (10);// 10ms 延迟
HAL_GPIO_WritePin (SPI3_CS_GPIO_Port、SPI3_CS_Pin、RESET);
HAL_SPI_TRANSMIT (&hspi3、reset、30,100);
HAL_GPIO_WritePin (SPI3_CS_GPIO_Port、SPI3_CS_Pin、SET);
uint8_t dummy[30]={0};
drdy_flag = 0;
while (1)
{
if (drdy_flag == 1)
{
HAL_GPIO_WritePin (SPI3_CS_GPIO_Port、SPI3_CS_Pin、RESET);
HAL_SPI_RECEIVE (&hspi3、dummy、30、10);
HAL_GPIO_WritePin (SPI3_CS_GPIO_Port、SPI3_CS_Pin、SET);
for (uint8_t i = 0;i<sizeof (conversion);i++)
{
conversion[i]= dummy[i];
Dummy [i]= 0;
}
for (uint8_t i = 0;i<9;i++)
{
Channel[i]=(conversion[3*I]<< 16)|(conversion[3*I+1]<< 8)| conversion[3*I+2];
}
drdy_flag = 0;
}
}
我从 ADC 获得的响应始终如下:
第一个字:0xFF2800
2ST 字:null
3ST 字:null
4ST 字: null
第5个 字: null
6st 字: null
第7个 字: null
8ST 字: null
第9 个字: null
10ST 字:0x95E400
SPI 以2.5Mb/s 的速率运行(我还尝试了20Mb/s 的速率、但是响应是一样的)。 我仍然无法测量 CS 引脚、需要解决这个问题。 所有寄存器处于各自的复位值。
大家好、Lucas:
是否有办法增加 DRDY 的低电平持续时间? 如我之前发送的示波器屏幕截图所示、对于1024的 OSR、这个持续时间小于5 µs。 我有一个在80 MHz 下运行的 MCU、通过中断处理信号、
DL:您的数据速率为3.75ksps、对于 ADS131M08的/DRDY、周期约为266us。 我不知道您的/DRDY 低电平时间为何如此短 且小于5us。 您能否仔细检查/DRDY 的时间间隔(下降至下降沿或上升至上升沿)是否为~266us? 这是从 ADC 到 MCU 的专用信号/布线吗?
"但在 DRDY 再次变为高电平之前、仍然无法发出 SCLK "
DL:这不是 ADC 引起的问题、我不是 MCU 专家、但 MCU 应该能够在外部中断信号的下降沿触发 SCLK 后发送 SCLK、我以前从未见过这样的问题。 您必须根据 MCU 软件或配置解决此问题、可以联系 MCU 制造商以获取支持。
您能解释一下执行 测量的正确命令顺序吗?
DL:没有读取数据的命令序列。 你唯一需要做的就是,重现我在上一篇文章中向你展示的时间。 您可以在以下链接中找到示例代码、还可以在 ADS131M08数据表的第9.16节中看到示例代码。
ADS131M08-ADS131M08 —C-EXAMPLE-CODE 示例 C 代码
关于您的软件代码、我不知道您正在使用哪个 MCU、并且我也不是 MCU 专家、但您好像是通过使用"while"循环检查 DRDY 标志来发送 MOSI 数据。 我通常使用一个中断子例程、这是在 MCU 中进入中断的一种有效且快速的方法、这可能是您无法在/DRDY 变为高电平之前发送 MOSI 数据的原因、因为您的"while"循环需要很长时间才能进行检查。 我想您需要联系 您的 MCU 制造商以获取支持。
如果您可以共享您的原理图、我可以为您进行检查。
BR、
戴尔
尊敬的 Dale:
是的、DRDY 周期大约为266 µs、低电平时间小于5 µs。
我拍摄了一些示波器照片、以展示发生的情况。 遗憾的是、坏消息是、我没有给我认为是的寄存器进行写入。
下面的图片捕获了复位、写入、读取操作和转换读数:
MISO:黄色迹线
MOSI:紫色迹线
SCLK:浅蓝色迹线
CS:蓝色迹线
首先、出于上电目的、执行50ms 延迟。 以下是发送用于复位 ADC 的10字(24位)命令(0x11):
在 RESET 命令之后、针对 t_REGACQ 要求执行1ms 延迟。 在此延迟之后、执行写入命令。 如图所示、我将仅使用值0xFF5A 写入一个寄存器(时钟):
在写入操作之后、会延迟50ms。 然后在同一寄存器(时钟)上执行读取操作。 示波器捕获如下所示:
如上所示、时钟寄存器的值不是0xFF5A、而是其默认值0xFF0E。 读取操作后、我开始在 SCLK 线上发出10个字、我接收的 ADC 测量值如下所示:
在示波器捕获中、紫色迹线(CH3)表示 DRDY 信号、蓝色迹线(CH4)表示 CS 信号。 如第一个映像所示、我收到的第一个字是0xFF2800、后跟8个 NULL 字、最后一个字是0x95E400。 我不确定这些值(0xFF2800和0x95E400)代表的是什么。
执行写操作和读取转换时、我有什么操作错误? 读取操作似乎工作正常
您好!
响应0xFF28包含在器件复位后下一帧的第一个字中、这是正确的响应。
我不知道您是否注意到了您的 SCLK 行为。 为什么我在下面强调了您的 SCLK 在振幅上表现出奇怪的行为? 它的振幅不一致。
顺便说一下、我无法从示波器捕获中查看详细信息、请参阅 ADS131M08数据表的第8.5.1节。 该器件仅支持 SPI 模式1 (CPOL = 0、CPHA = 1)。 主机控制器和 ADS131M08都必须在 SCLK 上升沿启动数据、并在 SCLK 下降沿锁存数据。 在此模式下、SCLK 将空闲为低电平。
BR、
戴尔
大家好、Lucas:
如果您可以保证您的数字信号并按照我之前向您展示的方式以及下面的时序示例将信号发送到 ADS131M08、则无法从 ADC 获得正确的响应和数据。 您可以检查并比较计时和计时。
WREG 用于将0x0E0E 寄存器数据写入 GAIN 寄存器(04h 地址):
RREG 读取增益寄存器(04h 地址)_RESPONSE 0x0E0E 寄存器数据将显示在下一帧中:
NORMAL Operation_6字(每个字的长度为24位)和帧(例如、ADS131M08需要更多 SCLK 和 NULL):
我希望您的硬件没有任何问题、因为我没有看到您的原理图和电路。
BR、
戴尔
尊敬的 Dale:
我的新电路板终于到达、我在尝试将值写入0x0E0E
增益(0x04
)寄存器的同时执行了一些测量。
下图的组织方式如下:
其中涉及的信号 MISO、MOSI、SCLK、DRDY 和 CS . 但是、由于我的示波器只有四个输入、因此我捕获了两组测量值:
下面是与 RESET 命令(在10字通信帧中发送0x11)相关的3个图像:
如下所示、读取命令返回 NULL
尽管进行了这些测试、但我仍然无法写入增益寄存器或从通道读取测量值。 您是否在这些帧中看到任何缺失? 我还没有弄清楚。
谢谢
你(们)好、Dale
我刚才在 osc 测量中捕获的还有一条信息:
在上面可以看到、CH4是 DRDY 信号、CH1是 CS 信号。
在我开始在 SCLK 线路中发出时钟信号之前、DRDY 信号具有较窄的高电平行为。
上图显示、首先我具有窄的高电平 DRDY 行为;然后我与 DRDY 同步执行复位、写入和读取操作、结果更改为窄的低电平行为;然后通信后、它再次变为窄高电平行为。
这是否正常? 在我的通道读取期间、DRDY 始终处于窄低电平行为。
大家好、Lucas:
我强烈建议您这样做
如果您能将其与我分享、您的原理图将会很有帮助。
/DRDY 的窄脉冲表示丢失了读取数据。 您可以在 首次或在 ADS131M08数据表中的数据收集暂停后查看8.5.1.9.1采集数据部分中的详细信息。
BR、
戴尔