Το λήμμα παραθέτει τις πηγές του αόριστα, χωρίς παραπομπές. |
Ο δίαυλος I²C είναι ένας σειριακός δίαυλος που δημιουργήθηκε από τη Philips (τώρα NXP) και χρησιμοποιείται για την σύνδεση περιφερειακών μικρής ταχύτητας σε μητρικές πλακέτες (motherboards), ενσωματωμένα συστήματα (embedded systems), κινητά τηλέφωνα ή άλλες ηλεκτρονικές συσκευές. Ο δίαυλος 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 και δίαυλος δεν θα δουλεύει.
Επειδή στον δίαυλο 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 αντίστοιχα.
Οι συσκευές στον δίαυλο I²C είναι είτε Κύριοι (Masters), είτε Υποτελείς (Slave). Η Master συσκευή είναι αυτή που ελέγχει και οδηγεί τη γραμμή ρολογιού SCL (παράγει τους παλμούς ρολογιού). Οι Slave συσκευές είναι αυτές που ανταποκρίνονται στις συσκευές Master. Μία συσκευή Slave δεν μπορεί να ξεκινήσει μία μεταφορά πάνω στο δίαυλο, μόνο μία συσκευή Master μπορεί. Σε έναν δίαυλο μπορεί να είναι συνδεμένες πολλές Master και πολλές Slave συσκευές. Και οι Master και οι Slave συσκευές μπορούν να μεταφέρουν δεδομένα στον δίαυλο, αλλά μόνο οι Master συσκευές ελέγχουν την μεταφορά.
Όταν μία 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 συσκευή πρέπει να τερματίσει την αποστολή δεδομένων, εκπέμποντας μία ακολουθία λήξης.
Σε όλες τις 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 Α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 |
Υπάρχουν διάφορα πρότυπα του διαύλου, τα οποία μπορούν να λειτουργήσουν σε διάφορες ταχύτητες. Τα πρότυπα αυτά είναι:
Όταν η master συσκευή διαβάζει από τη slave, η slave τοποθετεί τα δεδομένα στον δίαυλο, αλλά είναι η master που ελέγχει το ρολόι. Τι συμβαίνει, εάν η slave δεν είναι έτοιμη να στείλει δεδομένα; Με slave συσκευές όπως σειριακές EEPROM δεν υπάρχει πρόβλημα, αλλά αν η slave συσκευή είναι ένας μικροεπεξεργαστής ή μικροελεγκτής, οι οποίοι έχουν να κάνουν και άλλες εργασίες, αυτό είναι ένα πρόβλημα. Ο μικροεπεξεργαστής που παίζει το ρόλο της slave συσκευής, πρέπει π.χ να σώσει την κατάσταση του μικροεπεξεργαστή, να πάει στην υπορουτίνα διακοπής, να βρεί πια διεύθυνση θέλει η master να διαβάσει, να πάρει τα δεδομένα και να τα τοποθετήσει στον καταχωρητή εκπομπής. Αυτό απαιτεί κάποιον χρόνο, κατά τον οποίο η master συσκευή θα συνεχίζει να στέλνει παλμούς και κατά συνέπεια να διαβάζει λανθασμένα δεδομένα. Σε αυτήν την περίπτωση το πρωτόκολλο επιτρέπει η slave συσκευή να κρατάει το ρολόι σε κατάσταση λογικού 0 (low). Η master συσκευή από την άλλη πλευρά είναι υπεύθυνη, μετά από την απελευθέρωση της γραμμής ρολογιού, να ελέγξει εάν πράγματι πήγε στην υψηλή κατάσταση (high) προτού να συνεχίσει. Αυτός ο μηχανισμός λέγεται επιμήκυνση του ρολογιού. Για διαύλους με πολλές συσκευές, είναι σημαντικό να πάρουμε υπόψη την επιμήκυνση του ρολογιού, γιατί υπάρχει κίνδυνος η πιο αργή συσκευή να μειώσει την συνολική απόδοση του διαύλου.
Πολλές I2C συσκευές έχουν έναν εσωτερικό καταχωρητή-δείκτη ο οποίος δείχνει την θέση μνήμης από την οποία θα διαβάσουμε, ή στην οποία θα γράψουμε κατά την ακόλουθη ανάγνωση ή εγγραφή αντίστοιχα. Ο δείκτης αυτός αυξάνεται αυτόματα κατά 1 μετά από κάθε εγγραφή ή ανάγνωση. Στον δείκτη αυτόν έχουμε την δυνατότητα να γράψουμε την αρχική τιμή. Αυτό το χαρακτηριστικό δεν είναι μέρος του πρωτύπου I2C, αλλά είναι ένα πολύ χρήσιμο χαρακτηριστικό, όταν θέλουμε να γράψουμε ή να διαβάσουμε μεγάλο όγκο δεδομένων (π.χ σε I2C μνήμες RAM και ROM).
Για να ξεκινήσει μία επικοινωνία, το πρώτο πράγμα που θα κάνει η master συσκευή είναι να εκπέμψει την ακολουθία έναρξης. Αυτό ειδοποιεί όλες τις slave συσκευές στο δίαυλο, ότι πρόκειται να ξεκινήσει μία εκπομπή και να ακούσουν για την περίπτωση που είναι γι’ αυτές. Στη συνέχεια η master συσκευή θα εκπέμψει την διεύθυνση της slave συσκευής με την οποία θέλει να επικοινωνήσει. Η slave συσκευή, που η διεύθυνσή της ταιριάζει με αυτήν που στάλθηκε θα συνεχίσει, ενώ όλες οι άλλες θα περάσουν σε αναμονή περιμένοντας την επόμενη επικοινωνία.
Μετά την αποστολή της δ/νσης της slave συσκευής, η master στέλνει τη διεύθυνση του καταχωρητή της slave στον οποίο θέλει να γράψει. Τώρα η master μπορεί να στείλει το Byte ή τα Bytes δεδομένων. Η master μπορεί να συνεχίσει να στέλνει δεδομένα, τα οποία θα τοποθετηθούν στις επόμενες θέσεις, επειδή η slave συσκευή θα αυξάνει αυτόματα την διεύθυνση του εσωτερικού καταχωρητή (καταχωρητή δείκτη-pointer register) μετά την λήψη κάθε byte. Όταν η master συσκευή στείλει όλα τα δεδομένα, σταματάει την εκπομπή εκπέμποντας μια ακολουθία λήξης.
Συγκεκριμένα τα βήματα που ακολουθούνται έχουν ως εξής:
Η master συσκευή:
Δηλ. για να γίνει πιο κατανοητή, η ακολουθία εγγραφής σε μία 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 συσκευή στην πραγματικότητα ξεκινά με μία εγγραφή σ’ αυτήν.
Έτσι η σειρά που ακολουθείται, για να διαβάσει μία master από μία slave, έχει ως εξής:
Η master συσκευή:
Με τα δύο προηγούμενα βήματα, γράφεται ο καταχωρητής-δείκτης της 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 είναι κατάλληλος για περιφερειακά, όπου η απλότητα και το χαμηλό κόστος κατασκευής είναι σημαντικότερα από την ταχύτητα. Συνηθισμένες εφαρμογές του διαύλου είναι:
Στην αγορά υπάρχουν μικροελεγκτές που έχουν ενσωματωμένες θύρες I²C, αλλά ένα ιδιαίτερα ισχυρό χαρακτηριστικό του διαύλου I²C, είναι ότι ένας μικροελεγκτής μπορεί να εξομοιώσει τις θύρες I²C μόνο με γενικής χρήσης ακροδέκτες (general purpose Ι/Ο) και λογισμικό, χωρίς να χρειάζεται να έχει εξειδικευμένο hardware (software I2C δίαυλος).