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