Forum: Mikrocontroller und Digitale Elektronik 2 Mikrocontroller Kommunikation über I2C


von Embed (Gast)


Lesenswert?

Hallo,

ich will Daten zwischen 2 Mikrocontroller über I²C-Schnittstelle 
austauschen aber habe kein Plan wo ich anfangen kann.

Wie kann ich I²C-Schnittstelle realisieren?

Ich weiß nicht wie und wo ich anfangen soll. Wäre für jede Hilfe sehr 
dankbar.

von Galle (Gast)


Lesenswert?

Nimm µCs mit integriertem I2C, gucke im Datenblatt, benutze die 
Programmschnipsel, fertig.

von Otto (Gast)


Lesenswert?

Hallo Embed,

wenn beide Controller eine HW-TWI haben, ist es schnell realisiert - der 
Code für AVR-Master und Slave sind in der Codesammlung.....

Gruss Otto

von Peter (Gast)


Lesenswert?

einfach scl mit scl und sda mit sda verbinden, dann noch pull-ups auf 
beide leitungen (weil iic open drain ist), den einen controller als 
master und den anderen als slave konfigurieren und fertig.
geht aber nicht mit einigen atmels, weil die keinen slave-modus haben.

von Embed (Gast)


Lesenswert?

danke für die Antworten ;-)..

I²C ist intergriert.

1. Was ist mit "Programmschnipsel" gemeint?
2. Wofür steht "HW-TWI"?

Wie sende ich die Daten und wo werden die Daten beim Empfänger 
gespeichert?
Kann ich einfach einen Puffer erzeugen und die Daten beim Empfang dort 
ablegen?

von Gast (Gast)


Lesenswert?

1. Application nots vom Chip Hersteller, Codesammlungen im Internet
2. Hardware TWI (TWI ist im Prinzip I²C)
3. Do wo du sie hin speicherst
4. Ja wenn du programmieren kannst.

von Peter (Gast)


Lesenswert?

> 1. Was ist mit "Programmschnipsel" gemeint?
beispielcodes zum ansprechen des iic-interfaces

> 2. Wofür steht "HW-TWI"?
hw für hardware, d.h. dass der controller ein eingebautes iic-peripheral 
hat. twi heisst 'two wire interface'. manche hersteller nennen iic so, 
wohl weil die bezeichnungen iic oder i2c phillips 'gehören'

> Wie sende ich die Daten und wo werden die Daten beim Empfänger gespeichert?
das ist bei jedem controller unterschiedlich, musst du ins unser manual 
schauen.

> Kann ich einfach einen Puffer erzeugen und die Daten beim Empfang dort ablegen?
klar, warum sollte das nicht gehen?

von Otto (Gast)


Lesenswert?

Hallo Embed,

Du kannst die Hardware-TWI des Controllers nutzen (wenn er denn eine 
hat) oder diese in Software nachbilden.

Gruss Otto

von Embed (Gast)


Lesenswert?

Ihr seid alle Spitze, DANKE !

von Embed (Gast)


Lesenswert?

Hi,

wo lege ich die Adressen von Master und Slave fest oder werden die 
Adressen es automatisch vergeben? Wo finde ich die 7-Bit Adresse?

Wenn ich nur einen Master und einen Slave habe,erkennt das I²C-Protokoll 
selber dass es nur einen Master und einen Slave gibt?

von Ulrich P. (uprinz)


Lesenswert?

Hi!

Warum, warum nur, werden Hilfegesucher hier immer so geheimnisvoll 
formuliert? Nicht einmal die verwendeten Prozessoren werden genannt. Wie 
soll man da denn helfen?

Das Protokoll beinhaltet grundsätzlich nur die Slave-Adresse, allerdings 
ist I2C Multimaster fähig, d.h. ein Master kann auch zum Slave werden.

Wenn Dein Prozessor ein Addressregister hat, dann wird er 
sinnvollerweise auch einen Interrupt generieren, wenn er seine Adresse 
empfängt. Ein Master hat erst einmal keine eigene Adresse, da er von 
Slaves nicht addressiert werden kann. Ein Slave kann normalerweise nur 
über eine zusätzliche Leitung auf sich aufmerksam machen. ( CRQ oder IRQ 
Leitung).

Daraus ergeben sich bei manchen Prozessoren aber auch 
Kombimöglichkeiten. D.h. Jeder Prozessor am Bus ist erst einmal Slave 
und hat eine eindeutige Slave-Adresse. Will einer eine Kommunikation 
starten, so schaltet er in dem Master-Modus um und addressiert einen 
Slave.
Das Protokoll ist, wenn korrekt implementiert, gegen Buskollisionen 
geschützt. D.h. es gibt im Prozessor eine Statusantwort, die den Erfolg 
oder den Grund des Misserfolges signalisiert, mind. als ein paar 
Register-Bits.

Wenn es erforderlich ist, den Master zu identifizieren, von dem ein 
Slave eine Information bekommen hat, so steht es dem geneigten 
Entwickler frei, die Daten nach seinem belieben zu gestalten.
Also z.B. [ST][ADR/W][MADR][LEN[CMD][...DATA...][SP]
ST/SP sind Start/Stop Kondition, ADR/W sind die I2C Adresse des Slave 
und das Write-Bit, MADR ist die Adresse des Masters, wenn er als Slave 
am Bus lauscht, der Rest sind dann die Daten.
Es gibt, wenn ich mich recht erinnere sogar eine Broadcast-Adresse, auf 
die alle Slaves hören sollten. Ich weiß aber nicht, ob alle Prozessoren 
diese Funktion können.

Eigentlich ist I2C super simpel aber auch super flexibel. Leider habe 
ich bei noch keinem Bus so viel Mist in Sachen Software- oder 
Hardware-Implementierung gesehen. Aber die Codeschnipsel hier sehen gut 
aus.

Gruß, Ulrich

von Embed (Gast)


Lesenswert?

Hallo,

zu Pull-Up:

im Datenblatt steht, dass die Pins intern einen Pull-Up Widerstand 
besitzen. Würde es Sinn machen noch extern Pull-Ups zu verwenden?

Wieviel Ohm wären extern bei 3,3 V Versorgungsspannung passend? Kann man 
es irgendwie berechen?

von Embed (Gast)


Lesenswert?

hmmm... zu viele Fragen gestellt?? :-$


eine wichtige Frage:

- wie kann ich über JTAG den empfangenen Wert abfragen?

von Embed (Gast)


Lesenswert?

hat jemand ein Beispiel-Code für die I²C-Kommunikation?

ich wäre sehr dankbar...

-> Nicht jeder wird als Genie geboren :'(

von Embed (Gast)


Lesenswert?

Niemand ein Beispiel für mich?

von AVR-User (Gast)


Lesenswert?

Prozessor? Programmiersprache?
Du erwartest Beispiele ohne genaue Informationen... Witzbold...

von Embed (Gast)


Lesenswert?

OK Programmiersprache sollte man doch angeben, aber Prozessor ist doch 
unwichtig. Man kann es dann an an den Prozessor anpassen.

Programmiersprahce ist C

Ich will nur sehen wie so was abläuft.

von Ulrich P. (uprinz)


Lesenswert?

Beispiele:
Warum schaust Du nicht mal bei den verschiedenen, oder Deinem speziellen 
CPU-Hersteller auf die Homepage? Da sollten I2C COdes in den 
ApplicationNotes herum liegen. Gerade bei Hardware-I2C Interfaces 
unterscheiden sich die Chips doch sehr. Der eine Hersteller unterstützt 
nur simple Register für Data, Address und Error-Flags, der andere 
Hersteller hat eine komplette State-Machine implementiert. Zilog und 
ATMEL haben z.B. komplette State-Machines, die bei Status-Änderung einen 
Interrupt generieren. So kann man seine Software schick in einen völlig 
passiven Treiber implementieren, der nur auf Interrupt und aktuellen 
State reagiert. Leider unterscheiden sich die einzelnen States recht 
stark voneinander. Ist also essig mit einem universellen Treiber.
Trotzdem, da Du von TWI und nicht von I2C gesprochen hast, vermute ich 
mal eine ATMEL-Lastigkeit:
http://www.atmel.com/dyn/resources/prod_documents/doc1981.pdf
http://www.atmel.com/dyn/resources/prod_documents/doc8013.pdf
http://www.atmel.com/dyn/resources/prod_documents/doc2561.pdf
http://www.atmel.com/dyn/resources/prod_documents/doc2565.pdf
http://www.atmel.com/dyn/resources/prod_documents/doc2560.pdf
http://www.atmel.com/dyn/resources/prod_documents/doc2564.pdf
http://www.atmel.com/dyn/resources/prod_documents/doc2583.pdf

Pull-Ups:
Die Pullups eines AVR haben irgendwas um die 20k. I2C sollte aber 
zwischen 2k2 und 4k7 haben. Kommt auf die Anzahl der Devices und die 
Länge des Busses an. Nachzulesen in der I2C Specification bei NXP 
(ehemals Philips).
Warum Du das nicht selber findest weiß ich nicht, aber bitte schön:
Im Gegensatz zu Philips, hat NXP den I2C Bus sehr schön auf einer Seite 
zusammen gefasst. hier findest Du alles, was Du zum aufbau eines 
funktionierenden I2C Bus brauchst:
http://www.standardics.nxp.com/support/i2c/

Es ist wirklich schwer Dir zu helfen, wenn Du aus dem zu verwendeten 
Prozessor und dem Ziel Deiner Entwicklung solch ein Geheimnis machst. 
Daher darfst Du Dich nicht wundern, wenn hier alle mit RTFM antworten, 
oder garnicht antworten. Du beschreibst den Weg, aber weder Start noch 
Ziel.

Gruß, Ulrich

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.