Mithilfe von Python-smbus auf einem Raspberry Pi verwechseln mit der syntax
Ich bin versucht, python-smbus auf einem Raspberry Pi für die Kommunikation mit einem accelerometer-MMA7660-chip mit I2C.
Im nachfolgenden code lese ich die Register 0x00, 0x01, 0x02 und 0x03 in der span -, und ich bin immer der exakt gleiche Werte für alle. Blick auf die Werte, und kippen Sie den chip, ich kann sehen, dass Sie alle entsprechen register 0x00, X-Wert zu registrieren.
Ausgabe:
...
1 1 1 2
3 3 3 3
1 1 1 1
59 60 60 60
51 51 51 51
58 58 58 58
3 3 3 3
62 62 62 62
58 58 58 58
62 62 62 62
...
Code:
import smbus
import time
bus = smbus.SMBus(1)
# I2C address for MMA7660
addr = 0x4C
try:
bus.write_byte_data(addr, 0x07, 0x00)
bus.write_byte_data(addr, 0x06, 0x10)
bus.write_byte_data(addr, 0x08, 0x00)
bus.write_byte_data(addr, 0x07, 0x01)
except IOError, err:
print err
while True:
try:
x = bus.read_byte_data(addr,0x00)
y = bus.read_byte_data(addr,0x01)
z = bus.read_byte_data(addr,0x02)
tr = bus.read_byte_data(addr,0x03)
print x, y, z, tr
time.sleep(0.25)
except:
print 'exiting...'
break
Mache ich etwas falsch mit dem smbus-syntax? Ich habe mir die Dokumentation hier.
Habe ich verifiziert, dass der chip funktioniert - ich kann kommunizieren gut mit es mit einem Arduino und dem setzen der Register in der gleichen Reihenfolge wie oben.
Update #1 (28 Jun 2013):
Als pro Sylvain Kommentar, ich füge Oszilloskop-Ausgang für die SDA/SCL-Leitungen für den folgenden code:
bus.write_byte(addr, 0x01)
print bus.read_byte(addr)
Update #2:
Ich denke, es ist ein bekanntes problem mit I2C am Raspberry Pi - es gibt keine ", Wiederholte Starten".
https://raspberrypi.stackexchange.com/questions/7138/mma8452-i2c-module
Laut der Linux SMBus spec:
SMBus Read Byte: i2c_smbus_read_byte_data()
============================================
This reads a single byte from a device, from a designated register.
The register is specified through the Comm byte.
S Addr Wr [A] Comm [A] S Addr Rd [A] [Data] NA P
Aber wenn ich es versuchte, die osciiloscope zeigt deutlich ein STOP (P) bevor der Wiederholte Start (S).
Also ich denke, ich bin viel Glück für die Verwendung von I2C-hardware auf dem Pi zu sprechen, um die MMA7760.
InformationsquelleAutor M-V | 2013-06-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
wenn Sie Lesen, alle benötigten Register auf einmal, es funktioniert Prima:
InformationsquelleAutor ThomGob
Ich bin absolut nicht sicher, ob dies das problem, aber nach den specs p22:
Soweit ich das verstanden habe, zu "Lesen" aus einem register, Sie haben zu Beginn von schreiben die register-Adresse, und dann blind Lesen ein byte. Ich weiß nicht, ob
SMBus.read_byte_data
kümmern, dass für Sie, aber Sie könnten versuchen, es manuell:Vielleicht das würde sogar funktionieren:
Haben Sie ein Oszilloskop oder logical analyzer untersuchen Sie den bus?
Ich habe ein Oszilloskop aber nicht sehr fähig. Ehrlich gesagt, habe ich nicht herausgefunden, wie es zu benutzen für die Analyse von digitalen Wellenformen - Daten geht in eine Zacke.
Sie müssen wahrscheinlich ein DSO zu untersuchen, die Art des Signals.
Danke @Sylvain - ich verbrachte einige Zeit auf, wie mein Umfang zu fangen diese Signale. Ich habe die Signale - bitte teilen Sie irgendwelche Erkenntnisse.
InformationsquelleAutor Sylvain Leroux
Nachdem Sie Ihren Beispiel, als auch für die Klasse geschrieben für den MMA7455, konnte ich Folgendes schreiben:
Sollte den trick tun.
InformationsquelleAutor MangoBoy
Den Raspberry PI I2C-Kernel-Treiber nicht unterstützt, wiederholt, beginnt für eine bestimmte Zeit. Jedoch, der I2C-Kernel-Treiber wurde aktualisiert und unterstützt nun das wiederholte starten, obwohl diese Funktionalität muss explizit aktiviert werden.
Zu setzen, kombiniert transfers "auf"
sudo sh -c '/bin/echo Y > /sys/module/i2c_bcm2708/parameters/combined'
Zu setzen Sammelüberweisungen "off"
sudo sh -c '/bin/echo N > /sys/module/i2c_bcm2708/parameters/combined'
Informationen finden Sie hier: http://raspberrypi.znix.com/hipidocs/topic_i2c_rs_and_cs.htm
Der wiederholte start ausgegeben wird, nachdem der Master übermittelt hat, seine Daten an den slave (slave-in den receiver-Modus), um zum Lesen von Daten von den slave (slave im transmitter-Modus). Der wiederholte start wird verwendet, um vermeiden, einem anderen master auf dem bus die Kontrolle über den bus zu früh. Der Master fordert Daten so lange, wie es nicht ein Problem Stop-Bedingung oder der Slave nicht signal ein
InformationsquelleAutor a.Dippel