Forum: Mikrocontroller und Digitale Elektronik I2C-Routine für MSP430F20XX


von Schorschi (Gast)


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

von Oliver (Gast)


Angehängte Dateien:

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.

von Oliver (Gast)


Lesenswert?

Nach dem Empfangen muss übrigens quittiert werden, wenn Du auf weitere
Bytes wartest, aber da Du ja senden kannst, sollte ein Ack ja kein
Problem sein.

von Schorschi (Gast)


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/

von Oliver (Gast)


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?

von Schorschi (Gast)


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

von Oliver (Gast)


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.

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
Noch kein Account? Hier anmelden.