【发布时间】: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 吗?
-
经过几周的研究,我还没有遇到过这些信息。我确实在那里看到了一些可能有帮助的信息。我会仔细看看它,看看我能想出什么。似乎我在编写代码时正在从芯片获取数据,它只是没有产生我预期的结果。 (不稳定的值……这在我正在阅读的正弦波上可能是正常的,而且我得到的值似乎不在我期望的范围内。)
标签: c++ raspberry-pi3 i2c adc