Ο δίαυλος **I²C** είναι ένας *σειριακός δίαυλος* που δημιουργήθηκε από τη Philips (τώρα NXP) και χρησιμοποιείται για την σύνδεση περιφερειακών μικρής ταχύτητας σε μητρικές πλακέτες (motherboards), ενσωματωμένα συστήματα (embedded systems), κινητά τηλέφωνα ή άλλες ηλεκτρονικές συσκευές. Ο δίαυλος I2C δεν χρησιμοποιείται μόνο για την επικοινωνία συσκευών που βρίσκονται πάνω σε ένα τυπωμένο κύκλωμα (π.χ. μεταξύ των ολοκληρωμένων κυκλωμάτων μικροελεγκτών και αιαθητηρίων), αλλά και για την επικοινωνία συσκευών που συνδέονται με καλώδια και βρίσκονται σε κάποια απόσταση .

Δίαυλος I2C
Στη διπλανή εικόνα φαίνεται ένα παράδειγμα διαύλου I2C. Όπως φαίνεται για την επικοινωνία χρησιμοποιεί μόνο δύο καλώδια: Τα **SCL** και **SDA**. Η γραμμή **SCL** είναι η *γραμμή ρολογιού*, ενώ η **SDA** είναι η *γραμμή δεδομένων η οποία είναι ημιαμφίδρομη* (half dublex): Η ίδια γραμμή χρησιμοποιείται και για εκπομπή και για λήψη, αλλά όχι ταυτόχρονα. Κάποια χρονική στιγμή χρησιμοποιείται για εκπομπή και κάποια για λήψη. Οι γραμμές αυτές συνδέονται σε όλες τις συσκευές, που υπάρχουν πάνω στο δίαυλο I²C. Προφανώς εκτός από τα παραπάνω καλώδια που μεταφέρουν δεδομένα και τον παλμό ρολογιού, απαιτείται και ένα τρίτο καλώδιο το οποίο είναι η *γείωση* (GND) ή 0 V.

Επίσης μπορεί να υπάρχει (προαιρετικά) και ένα τέταρτο καλώδιο το οποίo είναι η *γραμμή τροφοδοσίας με τάση (VCC ή VDD)*, με την οποία τροφοδοτούνται με ισχύ οι διάφορες συσκευές που συνδέονται στο δίαυλο. 

Τυπικές τάσεις που χρησιμοποιούνται στο δίαυλο είναι τα +5V ή +3,3V, αν και επιτρέπονται συστήματα με διαφορετικές τάσεις (συνήθως στην περιοχή από +1,2V έως +5,5V).  
Ο μέγιστος αριθμός *κόμβων* (συσκευών), που μπορούν να συνδεθούν στον δίαυλο, περιορίζεται από τον αριθμό των διαθέσιμων *διευθύνσεων* (θα επεξηγηθεί παρακάτω), αλλά και από τη συνολική *χωρητικότητα* του διαύλου, η οποία π.χ. για τον standard mode, δεν πρέπει να υπερβαίνει τα 400pF. Η απαίτηση αυτή περιορίζει τις αποστάσεις στις οποίες μπορούν να βρίσκονται οι κόμβοι του διαύλου (αποστάσεις επικοινωνίας).  
Παρακάτω γίνεται η σύγκριση διαφόρων υλοποιήσεων του διαύλου (πηγή) Αρχειοθετήθηκε 2017-01-10 στο Wayback Machine.. Στην πράξη μπορούμε π.χ. να πετύχουμε μεγαλύτερα μήκη διαύλου μειώνοντας την ταχύτητα. 

| Δίαυλος | Ρυθμός Δεδομένων (bit/sec) | Μήκος Διαύλου (μέτρα) | Παράγοντας περιορισμού μήκους διαύλου | Μέγιστος Αριθμός κόμβων | Παράγοντας Περιορ. Αριθμ. κόμβων |
| --- | --- | --- | --- | --- | --- |
| I2C | 400k | 2 | Χωρητικότητα καλωδίωσης | 20 | 400pF max |
| I2C με Οδηγούς (Buffer) | 400k | 100 | Καθυστέρηση διάδοσης | Οποιοσδήποτε | Κανένας περιορισμός |
| I2C | 3,4M | 0,5 | Χωρητικότητα καλωδίωσης | 5 | 100pF max |
|

Και οι δύο γραμμές SCL και SDA είναι τύπου *ανοικτού απαγωγού* (open drain στον κόσμο των FET) ή *ανοικτού συλλέκτη* (open collector στον κόσμο των TTL). Αυτό σημαίνει ότι κάθε μία από αυτές τις δύο γραμμές, πρέπει να συνδέεται με μία αντίσταση στην γραμμή τροφοδοσίας, όπως φαίνεται στο παραπάνω σχήμα. Η αντίσταση αυτή ονομάζεται *αντίσταση τερματισμού (ή pull up*).

Η τιμή των αντιστάσεων δεν είναι κρίσιμη, αλλά μαζί με την χωρητικότητα του διαύλου, επηρεάζει την μέγιστη ταχύτητα λειτουργίας του διαύλου. Μεγάλες χωρητικότητες του διαύλου, μπορούν να αντισταθμιστούν με μικρές αντιστάσεις τερματισμού. Συνηθισμένες τιμές αντιστάσεων είναι από 1ΚΩ έως 10ΚΩ. Οι αντιστάσεις αυτές δεν μπορούν να απουσιάζουν, διότι τότε οι γραμμές SCL και SDA θα είναι μονίμως σε κατάσταση λογικού 0 και δίαυλος δεν θα δουλεύει.

Λογικές στάθμες των γραμμών SCL και SDA
---------------------------------------

Επειδή στον δίαυλο I2C συνδέεται ποικιλία συσκευών διαφόρων τεχνολογιών (CMOS, NMOS, Διπολικής τεχνολογίας), οι οποίες μπορεί να έχουν διαφορετικές τάσεις λειτουργίας, οι στάθμες του λογικού 0 (Low) και λογικού 1 (High) σε όλες τις νέες συσκευές δεν είναι σταθερές, αλλά εξαρτώνται από την τάση τροφοδοσίας.  
Έτσι τα κατώφλια του *λογικού 0* και του *λογικού 1* τοποθετούνται στο 30% και το 70% της τάσης τροφοδοσίας VDD αντίστοιχα. Δηλ. μία τάση στην περιοχή 0-0,3VDD θεωρείται λογικό 0 (Low), ενώ μία τάση στην περιοχή 0,7VDD έως VDD, θεωρείται λογικό 1 (High). Παλαιότερα τα κατώφλια του λογικού 0 και 1 είχαν τοποθετηθεί στα 1,5V και 3,0V αντίστοιχα.

Κύριοι και υποτελείς (Masters and Slaves)
-----------------------------------------

Οι συσκευές στον δίαυλο I²C είναι είτε *Κύριοι (Masters)*, είτε *Υποτελείς (Slave)*. Η Master συσκευή είναι αυτή που ελέγχει και οδηγεί τη γραμμή ρολογιού SCL (παράγει τους παλμούς ρολογιού). Οι Slave συσκευές είναι αυτές που ανταποκρίνονται στις συσκευές Master. *Μία συσκευή Slave δεν μπορεί να ξεκινήσει μία μεταφορά πάνω στο δίαυλο, μόνο μία συσκευή Master μπορεί*. Σε έναν δίαυλο μπορεί να είναι συνδεμένες πολλές Master και πολλές Slave συσκευές. Και οι Master και οι Slave συσκευές μπορούν να μεταφέρουν δεδομένα στον δίαυλο, αλλά μόνο οι Master συσκευές ελέγχουν την μεταφορά.

Το φυσικό πρωτόκολλο του διαύλου I²C
------------------------------------

Όταν μία Master συσκευή επιθυμεί να επικοινωνήσει με μία Slave συσκευή, ξεκινά στέλνοντας στον δίαυλο μία **ακολουθία έναρξης (start sequence)**. Η ακολουθία έναρξης, είναι μία από τις δύο ειδικές ακολουθίες που ορίζονται στο δίαυλο I²C. Η άλλη είναι η **ακολουθία λήξης (stop sequence)**. **Οι ακολουθίες έναρξης και λήξης διαφέρουν στο ότι είναι οι μοναδικές περιπτώσεις στις οποίες επιτρέπεται να αλλάζει η γραμμή δεδομένων (SDA), ενόσω η γραμμή ρολογιού (SCL) είναι σε κατάσταση λογικού 1 (high)**. Όταν μεταφέρονται δεδομένα, η γραμμή SDA πρέπει να παραμένει σταθερή και να μην αλλάζει όσο η γραμμή ρολογιού είναι high. Οι ακολουθίες έναρξης και λήξης σημαδεύουν την έναρξη και τη λήξη μιας μεταφοράς με μία slave συσκευή. Δηλαδή ο δίαυλος θεωρείται ότι είναι απασχολημένος, μετά από μία ακολουθία έναρξης και ελεύθερος λίγο χρόνο μετά την ακολουθία λήξης.

**Ακολουθίες Έναρξης** Λήξης
Τα δεδομένα μεταφέρονται σε ακολουθίες των 8 bit. Τα bit τοποθετούνται στη γραμμή SDA, ξεκινώντας από το *περισσότερο σημαντικό bit (MSB)*. Η γραμμή SCL μεταβαίνει στη κατάσταση high και μετά low. Για κάθε 8 bit δεδομένων που μεταφέρονται, η συσκευή που λαμβάνει στέλνει πίσω ένα *bit επιβεβαίωσης (ACK)*. Έτσι στην πραγματικότητα απαιτούνται 9 παλμοί ρολογιού, για την μεταφορά των 8 bit ενός byte δεδομένων. Εάν η συσκευή που λαμβάνει, στείλει πίσω ένα low *bit επιβεβαίωσης (ACK)*, τότε έχει λάβει τα δεδομένα και είναι έτοιμη να λάβει το επόμενο byte δεδομένων. Εάν στείλει πίσω ένα high bit επιβεβαίωσης (που συμβολίζεται και με NACK, από τη φράση Not Acknowledged), αυτό δείχνει ότι η συσκευή που λαμβάνει, δεν μπορεί να λάβει περαιτέρω δεδομένα και η master συσκευή πρέπει να τερματίσει την αποστολή δεδομένων, εκπέμποντας μία ακολουθία λήξης.

**Αποστολή ενός Byte. Πάνω είναι η γραμμή δεδομένων SDA και κάτω η γραμμή ρολογιού SCL. Όπως φαίνεται αλλαγές κατάστασης (από Low σε High και αντιστρόφως) της γραμμής δεδομένων SDA γίνονται μόνο όταν το ρολόι SCL είναι σε κατάσταση Low**

Διευθυνσιοδότηση συσκευών του I²C διαύλου
-----------------------------------------

Σε όλες τις slave συσκευές που συνδέονται στον δίαυλο, έχει αποδοθεί ένας αριθμός σαν διεύθυνση. Οι master συσκευές δεν είναι απαραίτητο να έχουν διεύθυνση, εκτός εάν υπάρχουν πολλές master συσκευές στον δίαυλο (περιβάλλον Multi-master). Οι master συσκευές μπορούν να διαλέξουν αυθαίρετα μία από τις συνδεμένες slave συσκευές για επικοινωνία, χρησιμοποιώντας τη διεύθυνσή της. Οι διευθύνσεις των συσκευών του I²C διαύλου είναι είτε 7 bit (θεωρητικά έως 128 συσκευές στο δίαυλο), είτε 10 bit (θεωρητικά έως 1024 συσκευές στο δίαυλο) ή ακόμη και 16 bit (θεωρητικά 65536 συσκευές στο δίαυλο).   
Εδώ θα μιλήσουμε για την περίπτωση που η διευθυνσιοδότηση είναι 7-bit. Θεωρητικά με 7 bit μπορούμε να έχουμε έως και 128 συσκευές στο δίαυλο. Επειδή όμως ορισμένες διευθύνσεις χρησιμοποιούνται για ειδικούς σκοπούς, μόνο 112 διευθύνσεις είναι διαθέσιμες στην 7-μπιτη διευθυνσιοδότηση. Π.χ η I2C διεύθυνση 0, είναι γενική κλήση προς όλες τις συσκευές. Στον παρακάτω πίνακα φαίνονται οι διευθύνσεις που είναι δεσμευμένες για ειδικές χρήσεις.

**Αποστολή Διεύθυνσης 7 bit**
  
Όταν στέλνουμε την διεύθυνση των 7–bit **Α6Α5Α4Α3Α2Α1Α0** της συσκευής με την οποία θέλουμε να επικοινωνήσουμε, ακόμη και τότε στέλνουμε 8 bit. To επιπλέον (R/W) bit χρησιμεύει να πληροφορήσει την slave συσκευή, εάν η master συσκευή πρόκειται να γράψει (δηλ. να στείλει δεδομένα) ή να διαβάσει (δηλ. να λάβει δεδομένα) από αυτήν. Εάν το bit (R/W) είναι μηδέν η master συσκευή πρόκειται να γράψει στη slave. Εάν είναι 1 (ένα) πρόκειται να διαβάσει από την slave. Τα 7 bit της διεύθυνσης τοποθετούνται στα 7 πάνω (περισσότερο σημαντικά MSBs) bit του byte, ενώ bit ανάγνωσης/εγγραφής (R/W) στο λιγότερο σημαντικό bit (LSB), όπως απεικονίζεται στο παραπάνω σχήμα (το Α στο σχήμα, σημαίνει Address Bit, δηλ. bit διεύθυνσης).

Δεσμευμένες Διευθύνσεις
-----------------------

Δύο ομάδες των 8 διευθύνσεων (0000 ΧXX και 1111 ΧΧΧ) χρησιμοποιούνται για ειδικούς σκοπούς, όπως φαίνεται στον παρακάτω πίνακα

| Διεύθυνση Slave | R/W bit | Περιγραφή |
| --- | --- | --- |
| 0000 000 | 0 | Δ/νση Γενική Κλήσης |
| 0000 000 | 1 | START Byte |
| 0000 001 | x | Δ/νση CBUS |
| 0000 010 | x | Δεσμευμένο για διαφορετικές μορφές διαύλου |
| 0000 011 | x | Δεσμευμένο για μελλοντικούς σκοπούς |
| 0000 1xx | x | High Speed mode master code |
| 1111 1xx | x | Δεσμευμένο για μελλοντικούς σκοπούς |
| 1111 0xx | x | Διευθυνσιοδότηση slave 10 bit |

Ταχύτητες
---------

Υπάρχουν διάφορα πρότυπα του διαύλου, τα οποία μπορούν να λειτουργήσουν σε διάφορες ταχύτητες. Τα πρότυπα αυτά είναι: 

* *Το Standard* Μode: Η συχνότητα ρολογιού για τον δίαυλο I²C είναι 100KHz (και επομένως η ταχύτητα μεταφοράς δεδομένων 100Kbps)
* Το *Fast Μode* με ταχύτητες ρολογιού μέχρι 400KHz (και επομένως η ταχύτητα μεταφοράς δεδομένων 400Kbps)
* Το *Fast Mode* Plus με ταχύτητες ρολογιού μέχρι 1ΜHz (και επομένως η ταχύτητα μεταφοράς δεδομένων 1Mbps)
* *Το High Speed Μode* με ταχύτητες ρολογιού μέχρι και 3,4 MHz (και επομένως η ταχύτητα μεταφοράς δεδομένων 3,4Mbps) και
* Το Ultra Fast Mode (UFM) με ταχύτητες από DC έως 5MHz (*I2C-bus specification and user manual)* Αρχειοθετήθηκε 2013-05-11 στο Wayback Machine..

Επιμήκυνση ρολογιού (Clock stretching)
--------------------------------------

Όταν η master συσκευή διαβάζει από τη slave, η slave τοποθετεί τα δεδομένα στον δίαυλο, αλλά είναι η master που ελέγχει το ρολόι. Τι συμβαίνει, εάν η slave δεν είναι έτοιμη να στείλει δεδομένα; Με slave συσκευές όπως σειριακές EEPROM δεν υπάρχει πρόβλημα, αλλά αν η slave συσκευή είναι ένας μικροεπεξεργαστής ή μικροελεγκτής, οι οποίοι έχουν να κάνουν και άλλες εργασίες, αυτό είναι ένα πρόβλημα. Ο μικροεπεξεργαστής που παίζει το ρόλο της slave συσκευής, πρέπει π.χ να σώσει την κατάσταση του μικροεπεξεργαστή, να πάει στην υπορουτίνα διακοπής, να βρεί πια διεύθυνση θέλει η master να διαβάσει, να πάρει τα δεδομένα και να τα τοποθετήσει στον καταχωρητή εκπομπής. Αυτό απαιτεί κάποιον χρόνο, κατά τον οποίο η master συσκευή θα συνεχίζει να στέλνει παλμούς και κατά συνέπεια να διαβάζει λανθασμένα δεδομένα.
Σε αυτήν την περίπτωση το πρωτόκολλο επιτρέπει η slave συσκευή να κρατάει το ρολόι σε κατάσταση λογικού 0 (low). Η master συσκευή από την άλλη πλευρά είναι υπεύθυνη, μετά από την απελευθέρωση της γραμμής ρολογιού, να ελέγξει εάν πράγματι πήγε στην υψηλή κατάσταση (high) προτού να συνεχίσει. Αυτός ο μηχανισμός λέγεται *επιμήκυνση του ρολογιού*. Για διαύλους με πολλές συσκευές, είναι σημαντικό να πάρουμε υπόψη την επιμήκυνση του ρολογιού, γιατί υπάρχει κίνδυνος η πιο αργή συσκευή να μειώσει την συνολική απόδοση του διαύλου.

Ένας γρήγορος τρόπος πρόσβασης στα δεδομένα
-------------------------------------------

Πολλές I2C συσκευές έχουν έναν εσωτερικό **καταχωρητή-δείκτη** ο οποίος δείχνει την θέση μνήμης από την οποία θα διαβάσουμε, ή στην οποία θα γράψουμε κατά την ακόλουθη ανάγνωση ή εγγραφή αντίστοιχα. Ο δείκτης αυτός αυξάνεται αυτόματα κατά 1 μετά από κάθε εγγραφή ή ανάγνωση. Στον δείκτη αυτόν έχουμε την δυνατότητα να γράψουμε την αρχική τιμή. Αυτό το χαρακτηριστικό δεν είναι μέρος του πρωτύπου I2C, αλλά είναι ένα πολύ χρήσιμο χαρακτηριστικό, όταν θέλουμε να γράψουμε ή να διαβάσουμε μεγάλο όγκο δεδομένων (π.χ σε I2C μνήμες RAM και ROM).

The I²C Software Protocol
-------------------------

### Εγγραφή σε μία slave συσκευή

Για να ξεκινήσει μία επικοινωνία, το πρώτο πράγμα που θα κάνει η master συσκευή είναι να εκπέμψει την ακολουθία έναρξης. Αυτό ειδοποιεί όλες τις slave συσκευές στο δίαυλο, ότι πρόκειται να ξεκινήσει μία εκπομπή και να ακούσουν για την περίπτωση που είναι γι’ αυτές. Στη συνέχεια η master συσκευή θα εκπέμψει την διεύθυνση της slave συσκευής με την οποία θέλει να επικοινωνήσει. Η slave συσκευή, που η διεύθυνσή της ταιριάζει με αυτήν που στάλθηκε θα συνεχίσει, ενώ όλες οι άλλες θα περάσουν σε αναμονή περιμένοντας την επόμενη επικοινωνία.  

Μετά την αποστολή της δ/νσης της slave συσκευής, η master στέλνει τη *διεύθυνση του καταχωρητή της slave* στον οποίο θέλει να γράψει. Τώρα η master μπορεί να στείλει το Byte ή τα Bytes δεδομένων. Η master μπορεί να συνεχίσει να στέλνει δεδομένα, τα οποία θα τοποθετηθούν στις επόμενες θέσεις, επειδή η slave συσκευή θα αυξάνει αυτόματα την διεύθυνση του *εσωτερικού καταχωρητή (καταχωρητή δείκτη-pointer register)* μετά την λήψη κάθε byte. Όταν η master συσκευή στείλει όλα τα δεδομένα, σταματάει την εκπομπή εκπέμποντας μια ακολουθία λήξης.
Συγκεκριμένα τα βήματα που ακολουθούνται έχουν ως εξής:  

Η master συσκευή:

1. Στέλνει την ακολουθία έναρξης
2. Στέλνει την διεύθυνση της slave συσκευής με το **R/W bit low** (άρτια διεύθυνση), δηλώνοντας έτσι ότι θέλει να κάνει εγγραφή δηλ. να στείλει δεδομένα στη slave.
3. Στέλνει την διεύθυνση του εσωτερικού καταχωρητή στον οποίο θέλει να γράψει
4. Στέλνει το byte δεδομένων
5. Στέλνει (προαιρετικά) οποιοδήποτε αριθμό επιπλέον byte
6. Στέλνει την ακολουθία λήξης

Εγγραφή σε Slave
Δηλ. για να γίνει πιο κατανοητή, η ακολουθία εγγραφής σε μία slave συσκευή από τη master, θα μπορούσε να κωδικοποιηθεί συμβολικά ώς εξής:

**Start|AddrSlave|W|ACK|AddrReg|ACK|Data1|ACK|Data2|ACK|.........DataN|ACK|Stop**

Στην παραπάνω ακολουθία:

**Start**: είναι η ακολουθία έναρξης που παράγεται από τη master συσκευή

**Stop:** είναι η ακολουθία λήξης και παράγεται από τη master συσκευή

**W**: είναι λογικό Low (λογικό μηδέν), και ειδοποιεί τη slave ότι η master συσκευή θέλει να κάνει εγγραφή

**AddrSlave:** Είναι η διεύθυνση του καταχωρητή (ή της θέσης μνήμης) της slave, στην οποία η master θέλει να κάνει εγγραφή

**AddrReg :**Είναι η διεύθυνση του καταχωρητή της συσκευής slave, στην οποία η master θέλει να κάνει εγγραφή

**Data1, Data2, ....DataN:** Είναι τα δεδομένα που αποστέλλονται για εγγραφή στους καταχωρητές της slave. To πρώτο θα γραφεί στη διεύθυνση **AddrReg,** και τα επόμενα διαδοχικά στις επόμενες διευθύνσεις.

**ACK**: Είναι το bit επιβεβαίωσης λήψης και είναι λογικό μηδέν. Εάν η slave αντί για ACK, που είναι λογικό μηδέν, στείλει πίσω NACK, που είναι λογικό ένα, ειδοποιεί την master ότι δεν μπορεί να λάβει. Τότε η master σταματά την επικοινωνία παράξοντας την ακολουθία λήξης **Stop**.

Σημειώνουμε ότι το σύμβολο **|** το χρησιμοποιούμε παραπάνω απλώς σαν διαχωριστό για την επεξήγηση και δεν αποστέλλεται

### Ανάγνωση από την slave συσκευή

Πριν να διαβάσουμε δεδομένα από μία slave συσκευή, πρέπει να την πληροφορήσουμε ποιον εσωτερικό καταχωρητή της θέλουνε να διαβάσουμε. *Έτσι μία ανάγνωση από την slave συσκευή στην πραγματικότητα ξεκινά με μία εγγραφή σ’ αυτήν.*

Έτσι η σειρά που ακολουθείται, για να διαβάσει μία master από μία slave, έχει ως εξής:

Η master συσκευή:

1. Στέλνει την *ακολουθία έναρξης (Start)*
2. Στέλνει την *διεύθυνση της slave συσκευής με το R/W bit **low*** (εγγραφή, άρτια διεύθυνση).
3. Στέλνει την *διεύθυνση του εσωτερικού καταχωρητή* από τον οποίο θέλει να διαβάσει

Με τα δύο προηγούμενα βήματα, γράφεται ο *καταχωρητής-δείκτης της slave συσκευής*, σύμφωνα με αυτά που αναφέραμε νωρίτερα, για γρήγορη πρόσβαση στα δεδομένα

1. Στέλνει πάλι την *ακολουθία έναρξης (επαναλαμβανόμενη έναρξη **rS**-**r**epeated **S**tart)*
2. Στέλνει πάλι την διεύθυνση της slave συσκευής *με το R/W bit **high** (περιττή διεύθυνση),* για να δηλώσει ότι επιθυμεί ανάγνωση
3. Διαβάζει τα δεδομένα (ένα ή περισσότερα byte). Μετά από την λήψη κάθε byte, η συσκευή που λαμβάνει ε*πιβεβαιώνει (**ACK**) τη λήψη*.
4. Στέλνει την *ακολουθία λήξης (Stop)*

Ανάγνωση από Slave 
Πάλι για να γίνει πιο κατανοητή, η ακολουθία ανάγνωσης (από τη master) από μία slave συσκευή, θα μπορούσε να κωδικοποιηθεί συμβολικά ως εξής:

**Start|AddrSlave|W|ACK|AddrReg|ACK|rStart|AddrSlave|R|ACK|Data1|ACK|Data2|ACK|.........DataN|ACK|Stop**

Στην παραπάνω ακολουθία:

**Start**: είναι η ακολουθία έναρξης, που παράγεται από τη master συσκευή

**rStart**: είναι ακριβώς ίδια με την ακολουθία έναρξης **Start** και πάλι παράγεται από τη master συσκευή

**Stop:** είναι η ακολουθία λήξης, και παράγεται από τη master συσκευή

**W**: είναι *λογικό Low (λογικό μηδέν)*, που δείχνει ότι η master συσκευή θέλει να κάνει εγγραφή στη slave

**AddrSlave:** Είναι η διεύθυνση της συσκευής slave, στην οποία η master θέλει να κάνει εγγραφή

**AddrReg:** Είναι η διεύθυνση του καταχωρητή της συσκευής slave, από την οποία η master θέλει να κάνει ή να ξεκινήσει την ανάγνωση

**Data1, Data2, ....DataN:** Είναι τα δεδομένα (Byte) που αποστέλλονται από τη slave στη master. Πρώτο στέλνεται αυτό που βρίσκεται στη διεύθυνση **AddrReg,** και τα επόμενα από τις επόμενες διευθύνσεις.

**ACK**: Είναι το bit επιβεβαίωσης λήψης και είναι λογικό μηδέν. Και η maste μπορεί να στείλει ΝACK για να ειδοποιήσει τη slave ότι δεν επιθυμεί επιπλέον δεδομένα.

Σημειώνουμε ότι το σύμβολο **|** το χρησιμοποιούμε παραπάνω απλώς σαν διαχωριστό για την επεξήγηση και δεν αποστέλλεται

Εφαρμογές
---------

Ο δίαυλος I²C είναι κατάλληλος για περιφερειακά, όπου η απλότητα και το χαμηλό κόστος κατασκευής είναι σημαντικότερα από την ταχύτητα. 
Συνηθισμένες εφαρμογές του διαύλου είναι:

* Ανάγνωση-εγγραφή *σειριακών* μνημών EEPROM
* Πρόσβαση σε χαμηλής ταχύτητας *μετατροπείς αναλογικού σήματος σε ψηφιακό (ADC ) ή ψηφιακού σε αναλογικό (DAC)*.
* Ανάγνωση αισθητήρων με σύνδεση I²C
* Ανάγνωση *ρολογιών πραγματικού χρόνου (Real Time Clocks**-RTCs**)*
* Ανάγνωση επιτηρητών Hardware και διαγνωστικών αισθητήρων, όπως π.χ θερμοστατών CPU και ταχύτητας ανεμιστήρων
* Ενεργοποίηση-Απενεργοποίηση τροφοδοσίας τμημάτων συστημάτων κ.α.

Στην αγορά υπάρχουν μικροελεγκτές που έχουν ενσωματωμένες θύρες I²C, αλλά ένα ιδιαίτερα ισχυρό χαρακτηριστικό του διαύλου I²C, είναι ότι ένας μικροελεγκτής μπορεί να εξομοιώσει τις θύρες I²C μόνο με γενικής χρήσης ακροδέκτες (general purpose Ι/Ο) και λογισμικό, χωρίς να χρειάζεται να έχει εξειδικευμένο hardware (software I2C δίαυλος).

Επίσημες Προδιαγραφές
---------------------

* Official I2C Specification Αρχειοθετήθηκε 2013-05-11 στο Wayback Machine. NXP
* List of assigned NXP / Philips Semiconductor I2C addresses (Aug-1999), NXP

Άλλες Πηγές
-----------

* Λεπτομερής Εισαγωγή, Αλφαβητάρι
* Αντιμετώπιση των Δυσκολιών Ανάπτυξης του I2C Χρησιμοποιώντας Πρωτοπόρα ΕργαλείαTackling
* Δικτυακά Σεμινάρια προχωρημένης Ανάλυσης του Διαύλου I²C
* I²C Υπόβαθρο Αρχειοθετήθηκε 2012-12-27 στο Wayback Machine.
* I²C Bus / Access Bus
* Χρησιμοποιώντας τον Δίαυλο I²C Bus με το Linux
* Πιστοποιημένες πραγματώσεις του Διαύλου I²C[*νεκρός σύνδεσμος*]
* OpenBSD iic(4) manual page[*νεκρός σύνδεσμος*]
* Lm-sensors, Linux package which supports sensors using the I²C bus, among others.
* massmind I²C page Source code, samples and technical information for using I²C with PC, PIC and SX microcontrollers.
* Σελίδα Πληροφοριών Σειριακών Διαύλων
* Τεχνική περίληψη του διαύλου I²C και συχνές ερωτήσεις
* The Bus Buffer Resource. For 2-wire buses such as I²C, SMBus, PMBus, IPMB & IPMI
* I²C Protocol
* I²C logic microchips from Texas Instruments
* Μία εμπορική Πραγματοποίηση του Διαύλου I²C γραμμένη σε VHDL
* OpenCores open source hardware implementation, in Verilog and VHDL
* Εισαγωγή στο δίαυλο I²C
* Εισαγωγή στα πρωτόκολλα SPI και I2C  Αρχειοθετήθηκε 2012-08-28 στο Wayback Machine.
* Κώδικας Αποκωδικοποίησης Πρωτοκόλου I2C
* Beginner's guide to using Arduino with I²C devices, including worked examples
* Επιπτώσεις μεταβολής των Pull-up αντιστάσεων στον δίαυλο I²C