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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.