lundi 14 septembre 2015

interface I2C

Dans cet article je présente le protocole i2C. qui est un bus de communication entre circuits intégrés. Ce type d'interface sérielle est utilisés avec de nombreux capteurs et aussi par certaines mémoires sérielles.

Inter-Integrated Circuit

I2C est l'abréviation pour Inter-Integrated Circuit. Il s'agit d'un protocole de communication sériel et synchrone utilisé pour la communication entre des circuits intégrés. Comme le SPI il s'agit d'un protocole bus, c'est à dire que plusieurs dispositifs peuvent-être connectés sur les même lignes de communication. Contrairement au protocole SPI il peut y avoir plusieurs maître sur le bus, c'est un bus Multi-maîtres, multi-esclaves. Il n'utilise que 2 fils pour la communication SDA et SCL par contre le débit est plus lent que pour un bus SPI. De plus la communication est semi-duplex, c'est à dire que la transmission et la réception se font en alternance.

Puisque les lignes de communication SDA et SCL peuvent-être contrôlées par plus d'un dispositifs il faut qu'elles soient configurées en drain ouvert. Il y a donc une résistance pull-up sur chaque ligne.

Seul un dispositif maître peut initier une communication. Mais puisqu'il peut y avoir plusieurs maître sur le bus, avant de débuter une transaction un maître doit vérifier l'état du bus. Évidemment s'il n'y a qu'un seul maître cette vérification peut être omise.

Dans cet introduction on ne verra que l'utilisation la plus simple soit un MCU utilisant une mémoire EEPROM et deux sondes de température branchés sur le même bus I2C.

Disons que ce dispositif sert à lire deux températures et à enregistrer les données dans la mémoire EEPROM. Les lignes A0-A2 sont branchées soit à Vdd ou Vss pour sélectionner l'adresse du périphérique. Ainsi l'EEPROM est à l'adresse 0 (b000), la sonde 1 à l'adresse 2 (b010) et la sonde 2 à l'adresse 4 (b100). Il s'agit des 3 bits les moins significatifs de l'adresse car en fait l'adresse est de 7 bits. Cette adresse constitue les 7 bits les plus significatifs du premier octet envoyé par le mettre sur le bus. Le bit le moins significatif (b0) indique si le maître veut transmettre (0) ou recevoir (1). Par exemple pour une mémoire EEPROM Microchip 24LC512 il y a 3 broches de sélections pour les 3 bits les moins significatifs de l'adresse pour une plage hexadécimal qui va de 0x50..0x57. Cette adresse étant décalée vers la gauche de 1 bit on a en fait 0xA0,0xA2,0xA4,0xA6,0xA8,0xAA,0xAC,0xAE.

Adressage

Puisqu'il y a plusieurs dispositifs sur le même bus et qu'il n'y a pas de ligne Slave Select il faut une autre méthode pour distinguer les différents périphériques. Le protocole I2C utilise un adressage via le canal de données. Le maître procède de la manière suivante pour communiquer avec un périphérique esclave.

  1. Envoie du START bit.
  2. Envoie de l'octet d'adresse avec le bit 0
  3. Le bit 0 est à écriture(0)/lecture(1)
  4. Si un dispositif sur le bus reconnait l'adresse il répond par un ACK bit.
  5. Si le maître reçoit un ACK bit il peut continuer à transmettre ou recevoir en utilisant la ligne SCL pour cadencer les bits.
  6. Une transmission se termine par un STOP bit.

Lorsque le bus est inactif les 2 lignes sont à 1. Pour signaler un START le maître garde la ligne SCL à 1 et fait passer la ligne SDA de 1 à 0. Pour un STOP c'est l'opposé, la ligne SCL toujours à 1 et la ligne SDA passe de 0 à 1. Toutes les autres transitions de la ligne SDA se font lorsque la ligne SCL est à 0.

Le maître contrôle la ligne SCL et après l'envoie de chaque octet il doit envoyer un cycle supplémentaire sur la ligne SCL pour lire le bit ACK envoyé par l'esclave. Notez que ce bit ACK n'est envoyer pendant la phase d'adressage qu'après le bit WRITE/READ. Le maître doit lire le bit ACK pour s'assurer que l'octet a bien été reçu. On a donc 9 périodes du signal clock par octet envoyé. Lorsque le maître est en mode réception c'est lui qui doit envoyer un bit ACK pour chaque octet reçu. Cependant il ne doit pas envoyer de ACK pour le dernier octet reçu. Dans ce cas l'esclave cesse la transmission et attend le stop bit. Les octets sont transmis en commençant par le bit le plus significatif.

extrait du feuillet de spécification du 24LC512

Dans le cas des dispositifs Microchip utilisés dans le montage ci-haut l'octet d'adressage se compose de 4 bits fixes et de 3 bits programmables par les broches.

extrait du feuillet de spécifications du 24LC512

Pour connaître l'adresse I2C de chaque dispositif il faut consulter le feuille de spécification. Ce n'est pas tous les dispositifs qui offre une plage de 8 adresses. Par exemple certains petits affichages OLED graphique utilisant un controlleur SSD1306 ne permettent que 2 adresses 0x3C ou 0x3D (0x78,0x7A décalée vers la gauche).

Puisqu'un ACK doit-être envoyé à chaque octet transmis le MCU doit reconfiguré la ligne SDA en conséquence. Par exemple lorsqu'il transmet il doit configuré la broche qui sert de SDA en mode entrée pour recevoir le ACK et la remettre en mode sortie autrement. Lorsqu'il reçoit c'est le contraire il doit garder cette broche configurée en entrée et la mettre en sortie pour transmette le ACK.

Mette en application une interface I2C en logiciel es plus complexe que pour une interface SPI à cause du changement continuel de direction de la ligne SDA. Pour un exemple concret d'utilisation vous pouvez consulter le projet sonnette d'entrée sur ce blog.

Conclusion

Le seul avantage de l'interface I2C par rapport au SPI est le nombre réduit de broches requises sur le MCU. Autrement la vitesse de communication est plus lente et la mise en oeuvre plus complexe au niveau logiciel s'il n'y a pas de périphérique I2C intégré au MCU. Les périphériques I2C intégrés au MCU sont plus rares que les périphériques SPI. Donc plus souvent qu'autrement on doit le faire en bit bang.

vendredi 11 septembre 2015

interface SPI

Dans cet article j'explique ce qu'est une interface SPI sans faire référence à un MCU en particulier. Il s'agit simplement de comprendre le fonctionnement de ce protocole de communication.

Serial Peripheral Interface

voici un schéma représentant cette interface.

Il s'agit donc d'un protocole de communication sériel. C'est à dire que les bits d'information circulent à la queue leu leu sur 1 seul fil. Cependant contrairement au protocole RS-232 il y a un signal clock sur un autre fil qui sert à synchroniser l'information.

Description des signaux

  • SCLK, Serial CLOCK est un signal de synchronisation qui détermine la position des bits.
  • MOSI est l'acronyme de Master Output Slave Input. Ce fil sert à transmettre les bits d'information du maître vers l'esclave.
  • MISO est l'acronyme de Master Input Slave Output. Ce fil sert à transmettre les bits d'information de l'esclave vers le maître.
  • SS est l'acronyme de Slave Select. Sur un bus SPI il peut y avoir plusieurs périphériques esclaves. Ce signal permet de sélectionner lequel est actif pour la communication. Notez la présence d'une barre au dessus du SS sur le schéma. Cette barre signifie que ce signal est actif lorsque le voltage est à zéro. Donc on sélectionne un esclave en mettant sa ligne SS à zéro. Les signaux de sorties d'un esclave non sélectionné sont en haute impédance et il ignore les signaux SCLK et MOSI.

A l'interne

A l'interne une interface SPI possède un seul registre à décalage1 pour la transmission et la réception.

Le maître comme son nom l'indique contrôle la communication. Les étapes de la communication sont les suivantes:
  1. Mettre à zéro la ligne SS de l'esclave.
  2. Envoie d'un octet de commande. En inscrivant l'octet dans le registre à décalage.
  3. Lecture de l'octet reçu de l'esclave
  4. Envoie des arguments de la commande
  5. Lorsque l'échange est terminé remettre la ligne SS à Vdd.

Le bit le plus significatif est envoyé en premier. Si vous regardez le schéma du transfert de donnée vous voyez que le maître comme l'esclave n'ont besoin que d'un seul registre à décalage pour recevoir et transmettre. La transmission et la réception se font en simultané. A chaque cycle du signal SCLK les registres de chacun sont décalés vers la gauche et reçoivent un bit d'information dans le bit de droite qui vient d'être libéré par le décalage vers la gauche.

Pour un octet, après 8 périodes du signal SCLK les registres de décalage du maître et de l'esclave contiennent un nouvel octet reçu de l'autre partie. Si besoin est le maître qui est habituellement un MCU peut lire le registre pour récupérer cet octet avant de l'écraser avec le prochain octet à transmettre.

Phase et polarité

Avant d'utiliser une interface SPI sur MCU ont doit déterminer les paramètres suivants:

  • Est-ce que le MCU est le maître ou l'esclave?
  • Quel est la fréquence du signal SCLK?
  • Quel est la phase du signal SCLK, paramètre CPHA
  • Quel est la polarité du signal SCLK, paramètre CPOL

Dans la majorité des cas le MCU sera le maître et la fréquence de SCLCK dépend des capacités du MCU, du périphérique SPI et de l'application.

La phase CPHA et la polarité CPOL de SCLK dépend du périphérique SPI utilisé. Ces paramètres sont configurés par l'état d'un bit dans un registre de configuration de l'interface SPI sur le MCU. Puisqu'il y a 2 bits il y a 4 combinaisons possibles:

MODECPOLCPHAdécalageéchantillonnage
000Tr desc.Tr mont.
101Tr mont.Tr desc.
210Tr mont.Tr desc.
311Tr desc.Tr mont.

CPOL détermine simplement à quel niveau logique doit-être la ligne SCLK lorsque l'interface est au repos. Lorsque ce bit est à zéro ça signifie que la ligne SCLK est à zéro au repos sinon elle est à 1.

CPHA détermine sur quelle transition le registre est décaler, i.e. envoie du bit sur la ligne. L'autre transition et utilisée pour échantillonner le bit sur la ligne de réception.

Le tableau ci-haut indique l'influence de ces 2 paramètres sur le moment du décalage et de l'échantillonnage.

exemple de périphérique SPI

Microchip vend des mémoires à interface SPI. Nous allons prendre pour notre exemple un 23LC512 qui est une mémoire RAM sérielle de 64Ko.

La procédure de communication est celle indiquée ci-haut. Supposons qu'on veut écrire un octet dans la RAM. Le diagramme suivant indique le timing sur l'entrée SPI du 23LC512.

Sur ce diagramme le signal SI correspond au signal MOSI de l'interface SPI. On voit donc que le 23LC512 échantillonne la ligne MOSI sur la transition montante. On voit aussi que le signal SCK est à zéro lorsque l'interface est inactive. Donc Sur le MCU on va configurer CPOL=0 et CPHA=0 c'est à dire le mode 0 selon la table ci-haut.

Si on regarde le diagramme du timing de la ligne SO (MISO du SPI) du 23LC512 on a ceci.

Les chiffres sur ces diagrammes réfère à une ligne de la table AC CHARACTERISTICS. La 12 de cette table nous dit que le signal sur la ligne SO est valide au maximum 25nsec (nanosecondes) après la transition descendante de SCK. Donc le maître peu lire en toute confiance cette ligne sur la transition montante à condition que le temps entre la transition descendante et la transition montante de SCK soit d'au moins 25nsec. Ce qui correspond à une fréquence maximale pour le signal SCLK de l'interface SPI de 20Mhz2.

Conclusion

Pour utiliser une interface SPI sur un MCU le plus important est de comprendre la relation entre CPOL et CPHA et de connaître les paramètres des signaux du périphérique utilisé. Le protocole SPI est utilisé entre autre par des mémoires sérielles RAM, EEPROM et FLASH. Aussi par certains affichages LCD ainsi que pour les carte SD. Vos profiterez donc d'une bonne connaissance de ce protocole dans vos projets MCU.


Notes

  1. Un registre à décalage permet de sérialiser un bloc de bits. Il peut s'agit d'un octet ou d'un mot plus long. Le mot est inscris dans le registre ensuite un signal clock permet de décaler les bits dans le registre un bit à la fois vers une sortie unique (1 bit). Dans le cas du protocole RS-232 les bits sont sérialisés en sortant le bit de poids faible en premier. Pour le protocole SPI c'est le bit de poids fort qui est sortie en premier. Un registre à décalage peut aussi faire l'inverse. Sois recevoir un train de bits sur une entrée et par le même principe de décalage recouvrer le mot complet dans le registre. En anglais on parle de SerDes c'est à dire Serialiser/Deserialiser. Dans le protocole SPI c'est le même registre qui accompli les 2 fonctions.
  2. On suppose que le signal SCLK est une onde carrée et que Thigh=Tlow donc pour Tlow=Thigh=25nsec on a une période pour SCLK de 50nsec donc 20Mhz. C'est bien selon les spécifications du 23LC512 la fréquence maximale pour SCK.