Ich bin aktuell dabei für den MSP430(FG4618) eine I2C(Master) SW zu schreiben. Dabei bin ich mir bei einem Punkt etwas unsicher. Ich habe SDA und SCL, beide sind mit Pullup Widerständen an VDD angeschlossen. Solange ich den Pin als Input betreibe sollte eigentlich alles funktionieren, der Pin registriert ob HIGH oder LOW anliegt und die SW verarbeitet das. Wenn ich nun einen der Pins als Output schalte und versuche das Signal auf LOW/HIGH zu ziehen, muss ich dabei etwas beachten? Meiner bisherigen Überlegung nach, sollte es auf jeden Fall unkritisch sein, wenn ich den Pin auf High schalte. Kritisch denke ich könnte es nur werden, falls der Pin auf LOW geschaltet wird. Es liegt VDD an und der Pin versucht das Signal auf GND zu ziehen. Kann dabei was schiefgehen, kann ich dafür nur bestimmte Pins benutzen oder ist da unkritisch? Vielen Dank schonmal für alle Antworten, würd da gerne mehr wissen, bevor ich den Code austeste und dabei im schlimmsten Fall meinen µC kaputt mach...
Da der MSP keine Open Drain Ausgänge hat, muss man das Risiko eines Kurzschlusses eingehen. Soweit ich das weiss ist das aber beim MSP eher unkritisch. Die Ausgänge haltet das i.d.R. aus.
> muss man das Risiko eines Kurzschlusses eingehen. Wieso Kurzschluss? Er hat doch einen PullUp-Widerstand dazwischen. > Ich habe SDA und SCL, beide sind mit Pullup Widerständen an VDD > angeschlossen.
Wenn man den Pin auf Ausgang schaltet könnte es womöglich vorkommen das er auf high steht. Steht Slave dabei auf low -> Kurzschluss. Das wäre halt der Worst-Case.
Für so Zwecke gibts es PxDIR und ev. PxREN. D.h. für ein 0 am Ausgang schaltet man den Pin mit PxDIR auf Ausgang. Für eine 1, wie nicht anders zu erwarten: als Eingang. Vorher natürlich eine 0 in das PxOUT-Register. Mit den internen Pullups kann man sich meist die externen ersparen. Du solltest Dir erstmal die Beratungsmuster von TI zu Gemüte führen.
Die Beratungsmuster von TI sind gerade mein Problem. TI hat zu I2C einiges an Beispielcode, der allerdings immer die HW I2C Schnittstelle verwendet. Allerdings läuft von sämtlichen Beispielen kein einziges bei mir. Ich habe leider keinen Logicanalyzer sondern nur ein Oszi zum auswerten des Datenverkehrs auf SDA und SCL. Um zu überprüfen, was von dem Code, der Master oder Slave, Probleme macht, war meine Idee, dass ich den I2C Master als SW gestalte, dann wenn der I2C Master richtig läuft, weiss ich ob mein Slave Code oder mein Master Code Probleme macht. Soweit ich aus dem was das Oszi liefert schlau werde, läuft aktuell folgendes ab: - Master sendet Startbedingung: funktioniert - Master sendet Adresse: funktioniert - Master sendet R/W Bit: funktioniert - Slave sendet bei der passenden Adresse ein ACK: funktioniert - Daten nach UCB1TXBUF schreiben: funktioniert - Master sendet die Daten die in UCB1TXBUF stehen: funktioniert nicht Das passiert mit meinem selbergeschriebenen Code für die HW I2C Schnittstelle. Bei dem TI Beispielcode seh ich nichtmal eine Startbedingung. >D.h. für ein 0 am Ausgang schaltet man den Pin mit PxDIR auf Ausgang. >Für eine 1, wie nicht anders zu erwarten: als Eingang. >Vorher natürlich eine 0 in das PxOUT-Register. >Mit den internen Pullups kann man sich meist die externen ersparen. => Wenn ich die internen PullUps benutze und die 1 und die 0 so schalte, dann dürften aber weder Clockstretching noch ACK's des Slaves funktionieren, oder? >Für so Zwecke gibts es PxDIR und ev. PxREN. Leider hat der MSP430FG4618 kein PxREN Register. Schonmal Danke für alle Antworten. Ich denke ich werde die I2C Master HW Funktionen mal schreiben und bevor ich sie dann benutze hier posten. Ich würd mich sehr freuen, wenn dann einer von euch mal kurz drüberschauen würde, ob ich da irgendwo großen Mist gebaut habe.
>Ich habe leider keinen Logicanalyzer sondern nur ein Oszi zum auswerten >des Datenverkehrs auf SDA und SCL. Solange es ein Speicheroszi ist, ist das doch ausreichend. Also an deiner Stelle würde ich mit HW I2C weiter machen. Zum testen würde ich einfach mal ein EEPROM o.ä. dran hängen, dann weiss man das der Slave auch 100%ig funktioniert.
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.