如何在 RPI 3B+ 上使用 C++ 通过 i2c 从 MAX11613 芯片读取数据

Posted

技术标签:

【中文标题】如何在 RPI 3B+ 上使用 C++ 通过 i2c 从 MAX11613 芯片读取数据【英文标题】:How do I read data via i2c from a MAX11613 chip using C++ on a RPI 3B+ 【发布时间】:2021-12-30 04:19:06 【问题描述】:

我正在尝试用 c++ 为 MAX11613 ADC 芯片 (MAX11613 Datasheet) 编写驱动程序。我认为我的写入代码对于设置和配置是正确的,但是我在读取代码时遇到了一些问题。我将芯片设置为使用单极模式下的内部时钟和内部电压参考进行读取,然后使用 AIN0 作为 + 信号和 AIN1 作为 - 信号通道写入配置以进行扫描并报告差分读数。它似乎确实读取了数据,尽管数据似乎非常不稳定,并且不是基于示波器结果的预期。

设置位://1111 0000=0xF0 SEL2=1,SEL1=1,SEL0=1,内部时钟,单极

配置位://0110 0000=0x60 SCAN1=1, SCAN0=1, AIN0-AIN1, DIFFERENTIAL

这是我阅读的代码,可能是问题的一部分:

static uint16_t readMAXRegister(uint8_t i2cAddress, uint8_t reg) 
  unsigned char buff[16];
  beginMAXTransmission(i2cAddress);
  i2c_smbus_read_i2c_block_data(i2cMAXHandle, reg, 16, buff);
  endMAXTransmission();
  uint16_t res = (buff[1] << 8) + buff[0];
  return res;

int16_t MAX11613::readMAXADC_Differential_0_1() 
  // Write config register to the ADC
  writeMAXRegister(m_i2cAddress, MAX_WRITE, MAX_CONFIG);
  // Wait for the conversion to complete
  usleep(m_conversionDelay);
  // Read the conversion results
  uint16_t res = readMAXRegister(m_i2cAddress, 1) >> m_bitShift;
  // Shift 12-bit results right 4 bits
  res = (res >> 11) == 0 ? res : -1 ^ 0xFFF | res;
  std::bitset<12> y(res);
  std::cout << "READ RESULT " << y << " " << res << std::endl;
  return (int16_t)res;

【问题讨论】:

现有驱动程序elixir.bootlin.com/linux/latest/source/drivers/iio/adc/… 有什么问题?或者你运行的不是 Linux 吗? 经过几周的研究,我还没有遇到过这些信息。我确实在那里看到了一些可能有帮助的信息。我会仔细看看它,看看我能想出什么。似乎我在编写代码时正在从芯片获取数据,它只是没有产生我预期的结果。 (不稳定的值……这在我正在阅读的正弦波上可能是正常的,而且我得到的值似乎不在我期望的范围内。) 【参考方案1】:

经过更多检查后,我现在似乎可以从设备中读取数据了。这是最终有效的代码,供任何可能感兴趣的人使用。

static void writeMAXRegister(uint8_t i2cAddress, uint8_t reg, uint8_t value) 
    beginMAXTransmission(i2cAddress);
    i2c_smbus_write_word_data(i2cMAXHandle, reg, payload);
    endMAXTransmission();
    uint8_t payload = value;

static uint16_t readMAXRegister(uint8_t i2cAddress, uint8_t reg) 
    const uint8_t datalength = 2;
    unsigned char data[datalength];
    beginMAXTransmission(i2cAddress);
    i2c_smbus_read_i2c_block_data(i2cMAXHandle, reg, datalength, data);
    endMAXTransmission();
    uint16_t res =((data[0]&0xF)<<8)+data[1];//<---THIS READS 16 BITS AND REMOVES FIRST 4 '1111' BITS OF DATA
    return res;

【讨论】:

以上是关于如何在 RPI 3B+ 上使用 C++ 通过 i2c 从 MAX11613 芯片读取数据的主要内容,如果未能解决你的问题,请参考以下文章

树莓派 3b+ 没有 /dev/i2c-*

RPi 3B Aduio 3.5mm output

RPi 如何读取 I2C/SPI PN532 NFCRFID/NFC 模块?

RPi 3B 无线连接配置

GPS模块闪烁但没有接收到RPi 3的任何数据[关闭]

在 Armbian 上从 i2c 2 读取 BME680