Raspberryy Pi: I2C Probleme

OP #3483548
Lesenswert?

Hallo,
ich habe einen MAX127 AD-Wandler an einen Raspberry Pi Typ B 
angeschlossen. i2cdetect zeigt mir auch die korrekte Adresse 0x28 an.

Der Baustein wird wie folgt genutzt:
1) Setzen des Control-Registers für Channel0 (i2cset -y 1 0x28 0 0x80) 
mit dem Wert 0b10000000
2) Das Abholen der Werte erfolgt durch einen Read-Befehl, worauf der 
Baustein 2 Data-Bytes sendet.

Wie kann ich diese beiden Data-Bytes abholen?

i2cget sendet etweder nur ein Byte: i2cget -y 1 0x28 --> 0xFF
oder man muss eine zusätzliche Adresse mit angeben, die dieser Baustein 
aber nicht haben möchte:
i2cget -y 0x28 0 w -->0x4eFF


Hardwareaufbau:
RasPi (3V3) -- ADUM1250 -- MAX127 (5V)

Zwischen ADUM1250 und MAX127 sind als Pullups 4k7 Ohm an SDA und SCL 
vorhanden. Sind 4k7 eventuell zu wenig?
Gast #3483579
Lesenswert?

oder einfach mal i2cget ohne Parameter aufrufen und lesen was da steht!

# i2cget
Usage: i2cget [-f] [-y] I2CBUS CHIP-ADDRESS [DATA-ADDRESS [MODE]]
  I2CBUS is an integer or an I2C bus name
  ADDRESS is an integer (0x03 - 0x77)
  MODE is one of:
    b (read byte data, default)
    w (read word data)
    c (write byte/read byte)
    Append p for SMBus PEC

MODE = w (read word data)
OP #3487134
Lesenswert?

So, das Problem ist gelöst. Nachdem ich mir einen Wolf gesucht habe, wie 
denn die smbus Funktionen genau funktionieren, habe ich festgestellt, 
dass die Funktion read_word_data vor dem Lesen ein write(!) absendet, 
mit welchem sich das Statusregister des MAX127 (Channel0) setzen lässt.

Leider liefert die Funktion das LSB zuerst, so dass man die Bytes noch 
tauschen muss. Von dem LSB werden dann auch nur die bits 4-7 benötigt, 
daher der right-shift um 12 Stellen.
In x2 wird das ganze dann wieder zu einem word zusammengebaut.
1
import os
2
import smbus
3

4
bus=smbus.SMBus(1)
5
address=0x28
6

7
# I2C-Aufruf:
8
# S Addr Wr [A] Comm [A] S Addr Rd [A] [DataLow] A [DataHigh] NA P
9
# Write-Register wird gleich mit gesetzt (Addr W = write)
10

11
x1=bus.read_word_data(address,0x80)
12

13
print 'x1 %s' % x1
14
print '-----------'
15
lsb = x1>>12
16
print 'lsb %s' % lsb
17
msb=x1 & 0x00FF
18
print 'msb %s' % msb
19
x2= (msb<<8) + lsb
20
print 'Ergebnis %s' % x2
21

22
print '-----------'

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren