Principe du I2C Claude Barbaud 10 janvier 2011 Principe du I2C: Le I2C (Inter Integrated Circuit) est un bus série synchrone multi-maître. Il permet de communiquer sur 3 fils[une horloge (SCL), une ligne de données (SDA) et un commun] avec un certain nombre de périphériques. Hardware: Essentiellement, toutes les sorties sont à collecteur ouvert ou à drain ouvert, et la logique est positive. Il est nécessaire de placer des résistances de rappel(pull-up) pour définir le niveau haut. Le nombre de composants qu'il est possible de relier est limité par la charge capacitive des lignes SDA et SCL : 400 pF . Un composant a une charge entre 10 et 20 pF. Les données sont transmises en série à 100Kbits/s en mode standard et jusqu'à 400Kbits/s en mode rapide. Principe du I2C Page 7-1 Protocole logiciel C'est un bus multi-maître: plusieurs processeurs peuvent le contrôler. Avec le compilateur CCS On doit placer la directive #use au début du fichier #use i2c(master, SDA = PIN_C4, SCL = PIN_C3) Au repos Les lignes SDA et SCL sont au niveau haut (1 logique). Condition de départ Un processeur signale son intention de parler par la condition START: Il place SDA = 0 pendant que SCL est au repos (=1) Le bus est alors occupé: les autres ne peuvent plus parler. Avec le PIC: i2c_start(); Condition d'arrêt Le processeur arrête de parler en replaçant la ligne SDA à 1 pendant que SCL est au repos ( = 1) Le bus est alors libre: les autres peuvent parler Avec le PIC: i2c_stop(); En activité Les changements sur SDA ont lieu pendant que SCL = 0. Principe du I2C Page 7-2 Format des transferts Les données sont transférées en bytes: 1. On envoie d'abord l'adresse du périphérique. Cette adresse est sur 7 bits [A6..A0] le 8ème bit est le R/W: 0 = Write, 1 = Read. Avec le PIC: i2c_write(adresse); Des parties d'adresse sont déterminées d'avance pour un type de périphérique. Les autres parties sont déterminées par matériel(état de broches) http://electro8051.free.fr/I2C/le_bus_I2C.pdf voir page 9 2. Si écriture: envoi de l'adresse interne si besoin, puis de la donnée Par exemple(mémoire): i2c_write(adresse externe, r/w = 0); i2c_write(adresse interne partie haute); i2c_write(adresse interne partie basse); i2c_write(donnée); 3. Si lecture: on doit écrire l'adresse, en mode write (adresse externe + adresse interne) puis envoyer une commande de lecture et enfin lire la donnée. Par exemple(mémoire) i2c_start(); i2c_write(adresse externe r/w = 0); i2c_write(adresse interne partie haute); i2c_write(adresse interne partie basse); i2c_start(); i2c_write(adresse externe r/w = 1); donnée = i2c_read(0); // 0 = pas d'acknowledge i2c_stop(); Principe du I2C Page 7-3 Acquittement (= acknowledge) Le récepteur de la donnée doit fournir un acquittement sur la broche SDA Cet acquittement complète la transmission. Il autorise l'émetteur à envoyer la donnée suivante. si l'esclave est le récepteur, l'acquittement est généré quand il est prêt à recevoir une nouvelle donnée. si le maître est le récepteur, il a le choix de donner un acquittement pour demander une nouvelle donnée [i2c_read();] ou de ne pas donner d'acquittement [i2c_read(0);], pour dire à l'esclave de se taire. L'esclave ne dit plus rien, et le maître reprend le contrôle du bus, par [i2c_stop(); ]. Cette possibilité est utile dans le cas de lecture d'une mémoire par blocs, ou d'interruption générée sur le processeur maître. Interfaces possibles sur I2C De nombreuses interfaces existent sur le protocole I2C. Par exemple: Port parallèle 8 bits bidirectionnels Mémoires Potentiomètre numérique Capteurs RTCC(Real Time Clock/Counter) Convertisseurs A/N et N/A Circuits Audio ( Egaliseur, Contrôle de volume, ... ) Drivers ( LED , LCD , ...) Exemple: 4 digit LED driver SAA1064 Principe du I2C Page 7-4