Raspberryy Pi: I2C Probleme

OP #3483548
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
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
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.
OP
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 
:-)
OP
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

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.