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.
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
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.
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?
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.
> 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?
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?
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
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?
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.
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.pdfhttp://www.atmel.com/dyn/resources/prod_documents/doc8013.pdfhttp://www.atmel.com/dyn/resources/prod_documents/doc2561.pdfhttp://www.atmel.com/dyn/resources/prod_documents/doc2565.pdfhttp://www.atmel.com/dyn/resources/prod_documents/doc2560.pdfhttp://www.atmel.com/dyn/resources/prod_documents/doc2564.pdfhttp://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