Forum: Mikrocontroller und Digitale Elektronik I2C Master SW kurze Frage


von Chris (Gast)


Lesenswert?

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...

von Jörg S. (joerg-s)


Lesenswert?

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.

von Gast (Gast)


Lesenswert?

> 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.

von Jörg S. (joerg-s)


Lesenswert?

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.

von doofi (Gast)


Lesenswert?

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.

von Chris (Gast)


Lesenswert?

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.

von Jörg S. (joerg-s)


Lesenswert?

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