简体   繁体   中英

I2c format causing problem: Raspberry Pi not reading ADC

I am unable to read an ADC (LTC2453) over i2c using a Raspberry Pi and python. I believe the problem is a mismatch between what SMBus outputs and what the ADC expects.

In my python program (copied below) I call for an ADC read with the bus.read_block_data() command and get the following error message: OSError: [Errno 121] Remote I/O error . I recorded oscilloscope traces showing how the SCK and SDA lines behave when this happens (figure linked below). The scope traces show four bytes of data, which I have labeled "address byte", "register byte" and "two bytes of data". The address byte shows that the Raspberry Pi outputs the 7 bit address followed by a 0, and that the ADC does not acknowledge. I believe the NACK from the ADC is why I get the error message. Scope traces I note that when I look for devices on the Raspberry Pi using the i2cdetect -y 1 command, the ADC does not acknowledge. This is also a case where the Raspberry Pi sends the address followed by 0 and again it gets no acknowledge bit from the ADC and the pi does not report seeing the ADC. Thus, it appears that the ADC requires the 1 following the 7 bit address. The behavior expected by the ADC is described on page 10 of its datasheet .

As shown in the scope traces linked above, the ADC does acknowledge the register address, which is comprised of the 7 bit address followed by a '1'. Receiving the correct signal, the ADC then outputs the two bytes of data. I would be grateful if someone could tell me how to just send the address followed by the read bit (1) and then collect two bytes of data.

python sketch:

from smbus import SMBus
import re
import time

adcAddress = 0x14
adcRegister = 0x29
adcReading = bytearray()
adcReading.append(0x00)
adcReading.append(0x00)
adcReading.append(0x00)
adcReading.append(0x00)

bus = SMBus(1)
time.sleep(1)

def getReading(address, register):
    adcReading = bus.read_i2c_block_data(address, register, 2)
    h = adcReading[0]
    m = adcReading[1]
    t = ((h & 0b01111111) << 8) | m
    return t

while True:
    v = getReading(adcAddress, adcRegister)
    print(v)
    print(‘/n’)

Problem solved but not using python. I wrote new code in Processing using available libraries. I could not get Processing to download onto my Pi Zero but was able to get it running on a Pi 4B. Once I had the program running, I moved the SD card from the 4B to the Zero where the program worked fine. I then exported an executable, which runs also fine on my PI Zero.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM