I²C

Από τη Βικιπαίδεια, την ελεύθερη εγκυκλοπαίδεια
Μετάβαση σε: πλοήγηση, αναζήτηση

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

Χρησιμοποιεί μόνο δύο καλώδια, τα οποία είναι αμφίδρομης κατεύθυνσης: Τα SCL και SDA. Η γραμμή SCL είναι η γραμμή ρολογιού, ενώ η SDA είναι η γραμμή δεδομένων. Οι γραμμές αυτές συνδέονται σε όλες τις συσκευές στον δίαυλο I²C. Προφανώς εκτός από τα παραπάνω καλώδια, απαιτείται και ένα τρίτο καλώδιο, το οποίο είναι η γείωση (GND) ή 0 V. Επίσης μπορεί να υπάρχει και ένα τέταρτο καλώδιο το οποίo είναι η γραμμή τροφοδοσίας, με την οποία τροφοδοτούνται με ισχύ οι διάφορες συσκευές που υπάρχουν στο δίκτυο. Τυπικές τάσεις που χρησιμοποιούνται στο δίαυλο είναι είναι τα +5V ή 3,3V, αν και επιτρέπονται συστήματα με διαφορετικές τάσεις (συνήθως στην περιοχή από 1,2V-5,5V).
Ο μέγιστος αριθμός κόμβων, που μπορούν να συνδεθούν στον δίαυλο, περιορίζεται από τον αριθμό των διαθέσιμων διευθύνσεων (θα επεξηγηθεί παρακάτω), αλλά και από τη συνολική χωρητικότητα του διαύλου, η οποία π.χ. για τον standard mode δεν πρέπει να υπερβαίνει τα 400pF, το οποίο και περιορίζει τις πρακτικές αποστάσεις επικοινωνίας.
Παρακάτω γίνεται η σύγκριση διαφόρων πραγματοποιήσεων του διαύλου (πηγή). Στην πράξη μπορούμε π.χ. να πετύχουμε μεγαλύτερα μήκη διαύλου μειώνοντας την ταχύτητα.

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

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

Λογικές στάθμες των γραμμών SCL και SDA[Επεξεργασία | επεξεργασία κώδικα]

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

Κύριοι και υποτελείς (Masters and Slaves)[Επεξεργασία | επεξεργασία κώδικα]

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

Το φυσικό πρωτόκολλο του διαύλου I²C[Επεξεργασία | επεξεργασία κώδικα]

Όταν μία Master συσκευή επιθυμεί να επικοινωνήσει με μία Slave συσκευή, ξεκινά στέλνοντας στον δίαυλο μία ακολουθία έναρξης (start sequence). Η ακολουθία έναρξης, είναι μία από τις δύο ειδικές ακολουθίες που ορίζονται στο δίαυλο I²C, ή άλλη είναι η ακολουθία λήξης (stop sequence). Οι ακολουθίες έναρξης και λήξης διαφέρουν στο ότι είναι οι μοναδικές θέσεις στις οποίες επιτρέπεται να αλλάζει η γραμμή δεδομένων (SDA), ενόσω η γραμμή ρολογιού είναι σε κατάσταση λογικού 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

Διευθυνσιοδότηση συσκευών του I²C διαύλου[Επεξεργασία | επεξεργασία κώδικα]

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

Αποστολή Διεύθυνσης 7 bit


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

Δεσμευμένες Διευθύνσεις[Επεξεργασία | επεξεργασία κώδικα]

Δύο ομάδες των 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 συχνότητα ρολογιού για τον δίαυλο I²C είναι 100KHz. Το πρότυπο όμως καθορίζει και μεγαλύτερες ταχύτητες ρολογιού: Τον Fast mode με ταχύτητες ρολογιού μέχρι 400KHz και τον High Speed mode με ταχύτητες ρολογιού μέχρι και 3,4 MHz. Πρόσφατα όμως έχει προδιαγραφεί ένας επιπλέον τρόπος ο fast mode plus

Επιμήκυνση ρολογιού (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 συσκευής, η master στέλνει τη διεύθυνση του καταχωρητή της slave στον οποίο θέλει να γράψει. Τώρα η master μπορεί να στείλει το Byte ή τα Bytes δεδομένων. Η master μπορεί να συνεχίσει να στέλνει δεδομένα, τα οποία θα τοποθετηθούν στις επόμενες θέσεις, επειδή η slave συσκευή θα αυξάνει αυτόματα την διεύθυνση του εσωτερικού καταχωρητή μετά την λήψη κάθε byte. Όταν η master συσκευή στείλει όλα τα δεδομένα, σταματάει την εκπομπή εκπέμποντας μια ακολουθία λήξης. Συγκεκριμένα τα βήματα που ακολουθούνται έχουν ως εξής:
Η master συσκευή:

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

Ανάγνωση από την slave συσκευή[Επεξεργασία | επεξεργασία κώδικα]

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

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

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

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

Εφαρμογές[Επεξεργασία | επεξεργασία κώδικα]

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

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

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

Επίσημες Προδιαγραφές[Επεξεργασία | επεξεργασία κώδικα]

Άλλες Πηγές[Επεξεργασία | επεξεργασία κώδικα]