I2C-Routine für MSP430F20XX

Gast #401173
Lesenswert?

Hallo,

ich wollte fragen, ob irgendjemand von euch eine Routine für das Lesen
vom I2C-Bus hat und online stellen könnte.
Mein Problem ist, dass ich mit einem MSP430F2013 (EZ430) einen Sensor
über I2C ansprechen muss. Dass ich dem Ding sage in welchen Modus es
gehen soll (reines schreiben) ist keine Problem, ich bekomme daraufhin
auch vom Sensor auch ein "Data ready" an einem Portpin, ich weiß nur
nicht, wie ich es mache, dass der uC auch Daten vom Bus lesen kann.

Vielen vielen Dank für eure Hilfe!
Schorschi
Gast #401174
Lesenswert?

Hallo Schorschi,

mein Code ist vielleicht nicht der Weisheit letzter Schluss, aber
vielleicht kann er Dich inspirieren. Da Du nichts von einer Sprache
geschrieben hast, hier der Code in asm.
SCL liegt bei dem Beispiel auf P11,
SDA auf P12.

Wenn Du den code aus einem C-code aufrufen willst, musst Du die
Funktionen als "extern void" deklarieren.
Am Ende der Funktion kannst Du das 8-bittige Ergebnis an eine
C-Variable übergeben lassen, hier xyz. Diese musst Du im Assembler-Code
ebenfalls als EXTERN deklarieren.

Viel Spaß beim Probieren.
Angehängte Dateien:
Gast #401176
Lesenswert?

Also ich beschreib jetzt mal genauer was gemacht werden soll:
Der Sensor bekommt von mir:
0x22    // Adresse bei Schreibzugriff
Slave Ack
0x03    // Damit wird das Register für die Operation Modi angesprochen
Slave Ack
0x0A    // Der Sensor beginnt in High Resolution Mode und
           setzt seinen DRDY-Pin high, wenn er fertig ist
           mir bleiben dann 50ms die Daten abzufragen
Slave Ack

Bis hier her funktioniert auch alles.

Wenn dann der DRDY high ist soll folgendes passieren:
0x22    // Adresse für Schreibzugriff
Slave Ack
0x08    // Damit wird ihm gesagt, dass er mir den Inhalt eines 16
           bit breiten Registers mit Daten schicken soll
Slave Ack
Dann soll der Master erneut ein Start Bit gefolgt von 0x23 (Adresse für
Lesezugriff) schicken und den Tackt bereitstellen, dass der Slave das
erste Byte schicken kann, dann eine Master Ack und dann soll das zweite
Byte folgen

Ich hab aber nun überhaupt keine Ahnung (bin ziemlicher Anfänger in
Sachen uC, wie ich die Daten auslesen soll)

Sollte es jemanden interessieren, den Sensor findet man hier:
http://www.vti.fi/en/products-solutions/products/pressure-sensors/scp1000-pressure-sensor/
Gast #401177
Lesenswert?

Ich habe das Datenblatt jetzt mal nur überflogen,
wenn Du den High-Resolution Modus benutzen willst, ist das Ergebnis
m.E. sogar 17 bit breit. Du musst die Register DATARD8, hier befindet
sich das MSB in Bits 2:0, und das Register DATARD16 lesen.
Du musst das Lesen also ab 0x7F beginnen.
Gesamt sollte das also so aussehen:

Start-Condition
0x22
Ack Slave
0x7F
Ack Slave
Repeat Start-Condition
0x23
Ack Slave
Byte lesen
Ack Master
Byte lesen
Ack Master
Byte lesen
Stop-Condition

Wo ist denn jetzt Dein Problem beim lesen?
Wie im o.g. Codeschnipsel ersichtlich, wird beim Lesen SDA vom Master
hochohmig geschaltet, also als Eingang definiert. Der Master sendet
dann nur noch die Clocks auf SCL und wertet den Pegel auf SDA aus. Die
Acks vom Slave musst Du doch auch ausgewertet haben?
Gast #401178
Lesenswert?

Fürs schreiben auf den I2C hab ich eine Routine bekommen, die eigentlich
für einen Displaytreiber gedacht war. Die konnte ich soweit ummodeln,
dass sie funktioniert hat, mit dem Lesen haperts aber.
Dass es noch ein zweites Datenregister gibt ist mir auch klar,
interessiert mich aber eigentlich nicht, weil ich nur schauen will, wie
genau das Ding im Vacuum ist und wie weit herunter es funktioniert;
spezigfiziert ist es ja nur bis 300mbar (absolut).

Schorschi
Gast #401179
Lesenswert?

Wenn Du nicht auf die Frage reagierst, was denn nun eigentlich am Lesen
nicht funktioniert, kann Dir hier keiner weiterhelfen. Beschreib doch
mal, was Du schon gemacht hast, oder schick am Besten den nicht
funktionierenden Code.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren