![](/img/trans.png)
[英]How do I read from a correct address of LIDAR using Arduino in I2C?
[英]How do I read data via i2c from a MAX11613 chip using C++ on a RPI 3B+
我正在尝试为 c++ 中的 MAX11613 ADC 芯片( MAX11613 数据表)编写驱动程序。 我想我的写入代码对于设置和配置是正确的,但是我在读取代码时遇到了一些问题。 我将芯片设置为使用单极模式下的内部时钟和内部电压参考进行读取,然后使用 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;
}
经过更多审查后,我现在似乎能够从设备中读取数据。 这是最终有效的代码,供任何可能感兴趣的人使用。
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.