![](/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.