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?
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)
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
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
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 :-)
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.