DW EditSeite anzeigenÄltere VersionenLinks hierherAlles aus-/einklappenNach oben Diese Seite ist nicht editierbar. Sie können den Quelltext sehen, jedoch nicht verändern. Kontaktieren Sie den Administrator, wenn Sie glauben, dass hier ein Fehler vorliegt. CKG Editor ====== 10. I2C Schnittstelle ====== <WRAP group> <WRAP column 30%> ==== Ziele ==== Nach dieser Lektion sollten Sie: - wissen wie die Kommunikation zwischen I2C Master und Slave funktioniert </WRAP> <WRAP column 65%> ==== Video ==== {{youtube>7aZ43cl7o_w?size=700x400}} </WRAP> </WRAP> ==== Dokumentation von Atmel ==== * [[https://www.microchip.com/wwwAppNotes/AppNotes.aspx?appnote=en591794|Application Note: TWI Module as I2C Master]] * [[https://www.microchip.com/wwwAppNotes/AppNotes.aspx?appnote=en591792|Application Note: TWI Module as I2C Slave]] * alternative Implementierung von [[https://github.com/knightshrub/I2C-master-lib|Elia Ritterbusch]] \\ ==== Übersicht über die am häufigsten verwendeten, seriellen Schnittstellen ==== <WRAP group><WRAP column third> === USART === <WRAP> <imgcaption BildNr0 | Konzeptbild U(S)ART> </imgcaption> {{drawio>KonzeptbildUsart}} </WRAP> * Keine gibt Takt vor. \\ Es sind gleichberechtigte Kommunikationspartner (siehe <imgref BildNr0>). * Jeder darf zu jederzeit senden. * Senden und Empfangen geschieht über zwei separate Leitungen. * Kommunikation ist nur zwischen zwei Geräten möglich. \\ Ein weiterer Slave würde eine weiteren U(S)ART-Bus benötigen. </WRAP><WRAP column third> === I2C === <WRAP> <imgcaption BildNr1 | Konzeptbild I2C> </imgcaption> {{drawio>KonzeptbildI2c}} </WRAP> * Master gibt Takt vor (siehe <imgref BildNr1>). * Slave darf nur zu bestimmten Zeiten senden und nur, wenn der Master dies anfordert. * Senden und Empfangen geschieht über die gleiche Leitung. * Alle Slaves hören am gleichen Bus mit und schreiben auf die gleiche Leitung. * Jeder Slave muss anhand der Signale überprüfen, ob die Daten für ihn gemeint sind. </WRAP><WRAP column third> === SPI === <WRAP> <imgcaption BildNr2 | Konzeptbild SPI> </imgcaption> {{drawio>KonzeptbildSpi}} </WRAP> * Master gibt Takt vor (siehe <imgref BildNr2>). * Slave darf nur zu bestimmten Zeiten senden und nur, wenn der Master dies anfordert. * Senden und Empfangen geschieht über zwei separate Leitungen. * Alle Slaves hören auf der gleichen Leitung mit und schreiben auf die gleiche Leitung. * Der gewünschte Slave wird über die __S__lave __S__elect Leitung ausgewählt. </WRAP></WRAP> ==== Statemachine für Datenpaket ==== ++++ Statemachine der I2C Kommunikation | === Statemachine der I2C Kommunikation === <WRAP> <imgcaption BildNr3 | Statemachine der I2C Kommunikation > </imgcaption> {{drawio>StatemachinederI2CKommunikation}} </WRAP> ++++ ==== I2C in Kürze und Zeitverlaufsdiagramm ==== **Übertragung**\\ Für die I2C Übertragung "trommelt" der Master-IC auf der Taktleitung (SCL). Bei jedem "Trommelschlag" (SCL=High), darf der Slave die Datenleitung (SDA) lesen. \\ D.h. während der Datenübertragung bleibt die Datenleitung bei SCL=High konstant. \\ Eine Flanke (=Signalwechsel) auf der Datenleitung während SCL=High definiert Beginn und Ende der Kommunikation. \\ Eine fallende Flanke auf SDA bei SCL=High stellt das Startbit dar, eine steigende Flanke das Stoppbit. \\ Läuft keine Kommunikation sind Daten- und Tankleitung auf High. <WRAP> <imgcaption BildNr4 | Zeitverlaufsdiagramm der I2C Kommunikation > </imgcaption> {{drawio>ZeitverlaufsdiagrammderI2CKommunikation}} </WRAP> === Startbedingung === <WRAP group><WRAP column 30%> Um die Übertragung zu beginnen muss die Startbedingung eingeleitet werden. Während SCL HIGH ist (a), geht SDA von HIGH auf LOW. Anschließend startet SCL mit LOW (b). <WRAP> <imgcaption BildNr5 | Startbedingung> </imgcaption> {{drawio>Startbedingung}} </WRAP> </WRAP><WRAP column 65%> Für eine Startbedingung werden die Bits innerhalb des TWCR wie folgt gesetzt: <WRAP> <sxh c; first-line: 1> TWCR = (1<<TWINT)|(1<<TWEN); // Setting TWINT clears interupt flag // to set the following state: | (1<<TWIE ) // Enable TWI Interrupt. | (1<<TWSTA)|(0<<TWSTO); // Initiate a START condition. </sxh> </WRAP> </WRAP></WRAP> === Übertragung === <WRAP group><WRAP column 30%> Die entscheidende Voraussetzung für eine erfolgreiche Bitübertragung ist, dass sich der Zustand von SDA nur ändern darf solange SCL auf LOW ist. Allerdings ist der Zustand von SDA erst gültig, wenn SCL auf HIGH ist. <WRAP> <imgcaption BildNr6 | Übertragung> </imgcaption> {{drawio>Uebertragung}} </WRAP> </WRAP><WRAP column 65%> Für die Übertragung eines Bytes muss TWDR und TWCR wie folgt gesetzt werden. \\ Zunächst wird die Übertragung der Adresse (''SLA_W'') betrachtet: <WRAP> <sxh c; first-line: 1> TWDR = SLA_W; // Load SLA_W into TWDR TWCR = (1<<TWINT)|(1<<TWEN); // Setting TWINT clears interupt flag // to start transmission of address </sxh> </WRAP> Die Daten (''DATA'') werden in gleicher Weise übertragen: <WRAP> <sxh c; first-line: 1> TWDR = DATA; // Load DATA into TWDR TWCR = (1<<TWINT)|(1<<TWEN); // Setting TWINT clears interupt flag // to start transmission of address </sxh> </WRAP> </WRAP></WRAP> === Stoppbedingung === <WRAP group><WRAP column 30%> Die Stoppbedingung beendet die Übertragung. SCL geht auf HIGH (c), anschließend wechselt die SDA-Leitung von LOW nach HIGH (d). <WRAP> <imgcaption BildNr7 | Stoppbedingung > </imgcaption> {{drawio>Stoppbedingung }} </WRAP> </WRAP><WRAP column 65%> Für eine Stoppbedingung werden die Bits innerhalb des TWCR wie folgt gesetzt: <WRAP> <sxh c; first-line: 1> TWCR = (1<<TWINT)|(1<<TWEN); // Setting TWINT clears interupt flag // to set the following state: | (1<<TWIE ) // Enable TWI Interrupt. | (0<<TWSTA)|(1<<TWSTO); // Initiate a STOP condition. </sxh> </WRAP> </WRAP></WRAP> ==== Beispiele ==== * Simulide: ''...\share\simulide\examples\Arduino\sofware_i2c_lcd\i2c_lcd-arduino'' (hierbei wird Software I2C eingesetzt) * Software I2C: * Library von Peter Fleury: [[http://www.peterfleury.epizy.com/avr-software.html|library]], [[http://www.peterfleury.epizy.com/doxygen/avr-gcc-libraries/group__pfleury__ic2master.html|Dokumentation]]