www.mikrocontroller.net

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


Autor: Schorschi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oliver (Gast)
Datum:
Angehängte Dateien:
  • i2c.txt (703 Bytes, 232 Downloads)

Bewertung
0 lesenswert
nicht 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.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Schorschi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/p...

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Schorschi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.