首頁>Raspberry Pi>source

我正在尝試使用 pigpiod从連線到Raspi 3B的I²C鏈接的ADS1115 ADC讀取資料 ,但一無所获.為了查明錯誤,我深入研究了我預先寫入ADC的配置寄存器0x01中的配置,以發現有效儲存在寄存器中的資料顯然不是我發送给该寄存器的資料.設備.這是在設備初始化期間發生的:

int Initialize (int handle)
{
  int      ret            = 0;
  uint16_t adc_config     = 0;
  int      pigpiod_handle = handle;
  cout << "Initializing display and dimmer ADC...";
  i2c_handle = i2c_open (pigpiod_handle, 1, 0x48, 0);
  if (i2c_handle < (unsigned int) 0) {
    ret = errno;
    cout << "failed! Error: " << strerror (errno) << endl;
  }
  else {
    uint16_t reg = 0x0000;
    SetADCConfigBitfield (&adc_config, 0x8000, 0x8000); // Conversion: single.
    SetADCConfigBitfield (&adc_config, 0x5000, 0x7000); // Input: AIN1.
    SetADCConfigBitfield (&adc_config, 0x0200, 0x0E00); // Gain: ± 4096 mV.
    SetADCConfigBitfield (&adc_config, 0x0000, 0x0100); // Mode: continuous.
    SetADCConfigBitfield (&adc_config, 0x0000, 0x00E0); // Data rate: 8 samples / second.
    SetADCConfigBitfield (&adc_config, 0x0000, 0x0010); // Comparator mode: traditional.
    SetADCConfigBitfield (&adc_config, 0x0000, 0x0008); // Comparator polarity: active low.
    SetADCConfigBitfield (&adc_config, 0x0000, 0x0004); // Comparator latching: off.
    SetADCConfigBitfield (&adc_config, 0x0003, 0x0003); // Comparator queue: off.
    cout << "¤¤ " << std::bitset<16> (adc_config) << " ¤¤" << endl;
    ret += i2c_write_byte_data (vfd::pigpiod_handle, vfd::i2c_handle, 0x01, adc_config >> 8);
    ret += i2c_write_byte_data (vfd::pigpiod_handle, vfd::i2c_handle, 0x01, adc_config  & 0xFF);
    reg  = i2c_read_byte_data (vfd::pigpiod_handle, vfd::i2c_handle, 0x01) << 8;
    reg |= i2c_read_byte_data (vfd::pigpiod_handle, vfd::i2c_handle, 0x01);
    cout << "±± " << std::bitset<16> (reg) << " ±±" << endl;
    if (ret == 0) {
      cout << "done. Handle: " << vfd::spi_handle << "." << endl;
    }
    else cout << "ADC initialization failed! Error: " << ret << "." << endl;
  }
  return ret;
}
void SetADCConfigBitfield (uint16_t *config, uint16_t value, uint16_t mask)
{
  *config &= ~mask;
  *config |= (value & mask);
}

我拿了 SetADCConfigBitfield () 以及直接从由Elektor Labs編寫的驅動程式(我不能使用)中获得的各種引數值 因為不相容).這是我的應用程式輸出中的相關部分:

Initializing display and dimmer ADC...
¤¤ 1101001000000011 ¤¤
±± 1000010110000101 ±±
done. Handle: 1.

如您所见,当我寫完後立即讀取寄存器時,得到的資料完全不同.這是什麼原因呢? 我做錯什麼了吗?

UPDATE 這是資料表的鏈接.請參阅第28–29頁:ADS111x資料表

最新回復
  • 6月前
    1 #

    好,我發現這裏出了問题:两个 i2c_write_byte_data () Pigpio的方法.它们將以下訊號發送到相應的I²C从站:

    Start Address WriteBit [A] Register [A] Payload [A] Stop
    

    因此,在寫入第一个位元組之後,將發出一个停止位,然後是第二个位元組的起始位. ADC查詢2位元組的值,而不是两个1位元組的值。

    事實上, i2c_write_word_data () 將会是正確的選擇,因為此方法在一个操作中將两个位元組都寫入.但是:它首先寫入低位半字(位#7至#0),然後寫入高位半字(位#15至#8).這不是ADC想要的,因為它期望首先使用高半字。

    我的解決方案是將上半部分与下半部分交換:

    reg = (adc_config << 8) | (adc_config >> 8);
    ret = i2c_write_word_data (vfd::pigpiod_handle, vfd::i2c_handle, 0x01, reg);
    

    現在一切正常。

  • raspbian buster:建立一个守護程式,將一个程式的輸出通過管道傳遞给systemd下的另一个程式?
  • i2c:建議使用哪个介面訪問I²C設備