Forum: Mikrocontroller und Digitale Elektronik Raspberryy Pi: I2C Probleme


von Pete K. (pete77)


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?

von seit_z80 (Gast)


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)

von Pete K. (pete77)


Lesenswert?

MODE geht nur mit DATA-ADDRESS, wie oben geschrieben bekomme ich dann 
0x4eff als Ergebnis. Der MAX127 will aber keine DATA-Address haben.

Am Channel0 liegen etwa 4V an (Drucksensor MXP5100A, gemessen).

Abblockkondensatoren 100nF sind am MAX127 und ADUM1250 jeweils 
vorhanden.

Am MAX127 sind REF mit 10µF und REFADJ mit 100nF beschaltet, etwas mehr 
als im DB angegeben.

: Bearbeitet durch User
von Pete K. (pete77)


Lesenswert?

Mit 10k Pullups geht es auch nicht besser.

von isnah (Gast)


Lesenswert?

Das Problem von "wiringPi" ist, dass nur immer 1 byte eingelesen wird 
und danach ein Kommunikations-Stop erfolgt.

Daher musst du wohl oder übel das Verfahren unter:
http://www.informatik.htw-dresden.de/~beck/RaspberryPI/RaspMCP3422.html
anwenden

von Pete K. (pete77)


Lesenswert?

Genau das scheint das Problem zu sein.

Gibt es eventuell eine Lib für Python, die eine etwas bessere 
Adressierung beim Lesen vom i2c Bus unterstützt?

Ach, wie verwöhnt ist man doch von der Peter Fleurys Umsetzung für µCs 
:-)

von Pete K. (pete77)


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 '-----------'

: Bearbeitet durch User
von Pete K. (pete77)


Lesenswert?


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.