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.

[参考译文] ADS1220:一段时间后通信停止(未定义)

Guru**** 2390755 points
Other Parts Discussed in Thread: ADS1220

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1030883/ads1220-communication-stop-after-some-time-not-defined

器件型号:ADS1220

您好!

我在我的应用中使用 ADS1220。 我使用2对差分输入来读取模拟信号。 我的假设是尽可能优化电流、因此我会尽快断电。 假设还需要测量两个通道、一个通道比另一个通道高、然后在特定时间内将其置于睡眠状态。 我在 数据表中选择了连续模式和全双工模式(图66)。 同时发送 WREG 命令时读取数据的示例)。

我正在使用 CS 引脚(它未永久连接低电平)。 仅限 ADS1220器件。 在 UC 的 SPI 配置下:

#define NRF_DRV_SPI_DEFAULT_CONFIG                           \
{                                                            \
    .frequency    = NRF_DRV_SPI_FREQ_2M,                     \
    .mode         = NRF_DRV_SPI_MODE_1,                      \
    .bit_order    = NRF_DRV_SPI_BIT_ORDER_MSB_FIRST,         \
}

我已为 ADS1220准备了两种配置:

static uint8_t m_tx_buf_CONF_1[] = {(WREG | CONF0 | 0x02), (MUX_P_AIN1_N_AIN0 | GAIN_128 | PGA_ON), (DR_G | NORMAL_MODE | CONTINOUS), (AVDD_REFIN | FIR_50_60 | PSW_OPEN | IDAC_OFF)};
static uint8_t m_tx_buf_CONF_2[] = {(WREG | CONF0 | 0x02), (MUX_P_AIN3_N_AIN2 | GAIN_128 | PGA_ON), (DR_G | NORMAL_MODE | CONTINOUS), (AVDD_REFIN | FIR_50_60 | PSW_OPEN | IDAC_OFF)};

在 I present 伪代码下:

SEND_INIT_CONFIG (m_tx_buf_CONF_2)(CH2)

loop:
p.1 SEND_START (0x08)
p.2 WAIT_FOR_DRDY_IRQ
p.3 SEND_CONFIG ((m_tx_buf_CONF_1)(CH1)
    p.3.1 GET_CONVERSION_RESULT_DUPLEX(CH2)
p.4 WAIT_FOR_DRDY_IRQ
p.5 SEND_CONFIG ((m_tx_buf_CONF_2)(CH2)
    p.3.1 GET_CONVERSION_RESULT_DUPLEX(CH1)
p.6 SEND_POWERDOWN (0x02)
p.7 .... generic timer delay 
p.8. go to p.1

代码运行良好、但由于未定义的原因、SPI 在一些未定义的通信时间后死。 我的想法是正确的吗? 或者、我应该以不同的方式执行它吗? 这是否是 timimg 问题? 遗憾的是、这是一种难以调试的情况。 我很难等半天才会出现这种情况。

我将感谢你的任何帮助。

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

    您好、Marcin、

    我没有看到代码流出现任何错误。  我可以认为、可能发生的是一些瞬态事件、其中 ADS1220已进入复位状态。  如果是这种情况、寄存器设置将返回默认加电状态、ADS1220将进入单次模式。  在环路中的某个点 、您将不会看到 DRDY 变为低电平。

    我建议您使用类似于看门狗的计时器来监视这种情况、在该计时器中、您可以在每个周期重置计时器、但如果计时器超时、您会运行错误例程来检查器件配置和操作。

    此致、

    Bob B  

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

    尊敬的 Bob:

    感谢您的评论、无论系统是否发生意外复位、是否发送启动/同步命令(即使处于 sigle -快照模式)、我都将停留在这里 在具有定义的时间间隔的环路中触发的哪一个将不会使器件恢复工作- DRDY 处于低电平状态?

    您对类似于看门狗的专用计时器的想法很好,我只是想我应该做什么错误例程... 执行重置命令,然后重新初始化并转换到主循环? 够了吗?

    最佳佩戴方式

    Marcin

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

    您好、Marcin、

    在循环中、START/SYNC 命令仅在 P1发送一次、这意味着如果器件复位、器件将进行一次转换并在 P.4停止。

    至于处理过程、我首先尝试确定是否正在进行复位。  如果有复位、则需要防止这种情况发生。  器件复位的一种方法是超过 ADS1220的绝对最大额定值。  一种常见的实现方法是瞬态电压进入模拟输入引脚。  您必须确保输入受到适当保护、以使输入电压不超过模拟电源、但如果确实如此、则通过引脚的电流小于10mA。  添加 TVS 二极管和增加输入滤波器电阻有助于防止这种情况。

    此致、

    Bob B