Cours:TPS 2103 tp mcp23017 : Différence entre versions
(→Identification des adresses i2c) |
(→Les registres du mcp23017) |
||
Ligne 72 : | Ligne 72 : | ||
! Adresse !! Nom du registre !! Valeur par défaut !! description | ! Adresse !! Nom du registre !! Valeur par défaut !! description | ||
|- | |- | ||
− | | 0x00 || IODIRA || 0b11111111 || broche en entrée (1) ou sortie (0) | + | | 0x00 || IODIRA || 0b11111111 || PORTA : broche en entrée (1) ou sortie (0) |
|- | |- | ||
− | | | + | | 0x01 || IODIRB || 0b11111111 || PORTB : idem |
+ | |||
|- | |- | ||
− | | | + | | 0x02 || IPOLA || 0b00000000 || PORTA : si à 1, inverse la valeur des entrées |
|- | |- | ||
− | | | + | | 0x03 || IPOLB || 0b00000000 || PORTB : idem |
+ | |||
|- | |- | ||
− | | | + | | 0x04 || GPINTENA || 0b00000000 || PORTA : si à 1, un changement d'état de l'entrée active la sortie d'interruption |
|- | |- | ||
− | | | + | | 0x05 || GPINTENB || 0b00000000 || PORTB : idem |
+ | |||
|- | |- | ||
− | | | + | | 0x06 || DEFVALA || 0b00000000 || PORTA : |
|- | |- | ||
− | | | + | | 0x07 || DEFVALB || 0b00000000 || PORTB : |
+ | |||
+ | |- | ||
+ | | 0x08 || INTCONA || 0b00000000 || PORTA : | ||
+ | |- | ||
+ | | 0x09 || INTCONB || 0b00000000 || PORTB : | ||
+ | |||
+ | |- | ||
+ | | 0x0A || IOCON || 0b00000000 || | ||
+ | |- | ||
+ | | 0x0B || IOCON || 0b00000000 || | ||
+ | |||
+ | |- | ||
+ | | 0x0C || GPPUA || 0b00000000 || PORTA : activer(1) ou désactiver(0) la résistance de pull-up (100k) | ||
+ | |- | ||
+ | | 0x0D || GPPUB || 0b00000000 || PORTB : idem | ||
+ | |||
+ | |- | ||
+ | | 0x0E || INTFA || 0b00000000 || PORTA : indique (bit à 1) quelle(s) broches ont générées l'interruption | ||
+ | |- | ||
+ | | 0x0F || INTFB || 0b00000000 || PORTB : | ||
+ | |||
+ | |- | ||
+ | | 0x10 || INTCAPA || 0b00000000 || PORTA : mémorise la valeur du PORT au moment de l'interruption | ||
+ | |- | ||
+ | | 0x11 || INTCAPB || 0b00000000 || PORTB : idem | ||
+ | |||
+ | |- | ||
+ | | 0x12 || GPIOA || 0b00000000 || PORTA : modifier/lire l'état des broches | ||
+ | |- | ||
+ | | 0x13 || GPIOB || 0b00000000 || PORTB : idem | ||
+ | |||
+ | |- | ||
+ | | 0x14 || OLATA || 0b00000000 || PORTA : OUTPUT LATCH REGISTER | ||
+ | |- | ||
+ | | 0x15 || OLATB || 0b00000000 || PORTB : | ||
+ | |||
+ | |||
|} | |} |
Version du 23 mars 2022 à 15:18
GPIO expander
Lorsque le nombre d'entrées/sorties nécessaire dépasse la quantité disponible sur le µcontrôleur utilisé, il est possible d'utiliser un périphérique/composant pour en ajouter.
On parle de GPIO (General Purpose Input Output / Entrée-Sortie à usage générique) expander
Le mcp23017 que nous allons utiliser (cf datasheet plus haut), possède une liaison i2c (Inter Integrated Circuit Bus), aussi nommé TWI (Two Wire Interface).
Pour rappel, le bus i2c est une liaison série, synchrone, half-duplex, qui nécessite 2 fils SDA (données) et SCL (l'horloge), en plus de la masse.
Identification des adresses i2c
Le principe de connexion sur le bus i2c est représenté sur la figure ci-dessous.
Les résistances de pull-up sont indispensables, elles imposent la tension représentant le niveau logique 1.
Pour votre culture, d'un point de vue logique, nous avons :
- un niveau logique 0 dominant
- un niveau logique 1 récessif
c'est à dire que si plusieurs composants veulent imposer des niveaux logiques différents sur les lignes SDA et SCL, le niveau logique 0 l'emporte.
L'adresse des composants i2c est codée sur 7 bits, donc 2^7 adresses possibles. En pratique certaines adresses sont réservées, se référer par ex à la page wikipedia pour plus de détails : https://fr.wikipedia.org/wiki/I2C
Nous utiliserons ce "shiledI2c", au format d'une carte arduino, qui comporte 2 composants I2c (mcp23017 et mcp3424).
Le bus i2c est présent sur le connecteur rouge. Il suffit de relier la carte que nous programmons avec une nappe sur ce connecteur pour l'utiliser.
Attention, le cavalier bleu permet de choisir la tension d'alimentation (3,3V ou 5V). Par ex:
- arduino uno : 5v
- raspberry pi : 3.3V
Il est au format d’une carte Arduino UNO, on peut l’utiliser avec une carte Arduino sous 5 V ou avec une carte Raspberry Pi sous 3,3V. Il faut placer le cavalier bleu suivant la carte que l’on utilise. Ici le cavalier est en position Arduino. Les 16 ports d’extension sont sur les connecteurs en haut de la carte sur la photo (17..2). Les switchs de marque Omron A6FR permettent de régler l’adresse du GPIO expander MCP23017. Pour relier ce Shield avec la carte du SAé 1 on utilise une nappe connectée sur chaque connecteur rouge de chaque carte. Les connecteurs sont munis de détrompeur.
Trouver dans la datasheet les différentes adresses possibles du composant MCP23017 et compléter le document réponse
Les GPIOs du MCP23017 sont séparés en 2 (PORTA / PORTB) comportant chacun 8 broches. Combien de MCP23017 peut-on utiliser sur le même bus i2c, et donc combien d'entrées/sorties au maximum peut-on ajouter de cette façon ?
Utiliser le programme I2cScanner pour lister les adresses des 2 composants reliés sur le bus I2c
En déduire
- Les valeurs des bits A2/A1/A0 pour le mcp23017
- l'adresse du CAN i2c (MCP3424)
https://playground.arduino.cc/Main/I2cScanner/
Les registres du mcp23017
Comme la plupart des composants i2c, nous devons lire/écrire des valeurs dans des registres, principe vu dans le td i2c registres.
Attention : les registres des targets i2c ne sont pas réinitialisées lorsque le µcontrôleur redémarre. Pour les réinitialiser vous devez couper l'alimentation du/des composants. (par ex en débranchant le cordon usb)
La correspondance adresses<=>registre est modifiable selon 2 configurations pour le mcp23017 (cf datasheet page 12). On utilisera le mode par défaut :
Adresse | Nom du registre | Valeur par défaut | description |
---|---|---|---|
0x00 | IODIRA | 0b11111111 | PORTA : broche en entrée (1) ou sortie (0) |
0x01 | IODIRB | 0b11111111 | PORTB : idem |
0x02 | IPOLA | 0b00000000 | PORTA : si à 1, inverse la valeur des entrées |
0x03 | IPOLB | 0b00000000 | PORTB : idem |
0x04 | GPINTENA | 0b00000000 | PORTA : si à 1, un changement d'état de l'entrée active la sortie d'interruption |
0x05 | GPINTENB | 0b00000000 | PORTB : idem |
0x06 | DEFVALA | 0b00000000 | PORTA : |
0x07 | DEFVALB | 0b00000000 | PORTB : |
0x08 | INTCONA | 0b00000000 | PORTA : |
0x09 | INTCONB | 0b00000000 | PORTB : |
0x0A | IOCON | 0b00000000 | |
0x0B | IOCON | 0b00000000 | |
0x0C | GPPUA | 0b00000000 | PORTA : activer(1) ou désactiver(0) la résistance de pull-up (100k) |
0x0D | GPPUB | 0b00000000 | PORTB : idem |
0x0E | INTFA | 0b00000000 | PORTA : indique (bit à 1) quelle(s) broches ont générées l'interruption |
0x0F | INTFB | 0b00000000 | PORTB : |
0x10 | INTCAPA | 0b00000000 | PORTA : mémorise la valeur du PORT au moment de l'interruption |
0x11 | INTCAPB | 0b00000000 | PORTB : idem |
0x12 | GPIOA | 0b00000000 | PORTA : modifier/lire l'état des broches |
0x13 | GPIOB | 0b00000000 | PORTB : idem |
0x14 | OLATA | 0b00000000 | PORTA : OUTPUT LATCH REGISTER |
0x15 | OLATB | 0b00000000 | PORTB :
|