MCP23017

Facebooktwitterredditpinterestlinkedinmail

Le MCP23017 de Microchip est une extension d’entrées / sorties (GPIO) 16 bits sur bus I2C. Il existe des variantes qui combinent 8 ou 16 bits, sur ports I2C ou SPI.

Description

Brochage d'un MCP23017

Brochage d’un MCP23017

Le schéma ci-contre donne le brochage d’un MCP23017. Le MCP23S17 est le même, mais avec un port SPI en lieu et place du port I2C. 4 broches diffèrent sur le MCP23S17 :

  • Broche 11: CS
  • Broche 12: SCK
  • Broche 13: SI
  • Broche 14: SO

Les broches 15 à 17 définissent l’adresse du MCP23017, ce qui permet d’en relier jusqu’à 8 sur un même bus I2C, pour un maximum de 128 broches d’entrées / sorties par bus I2C.

L’alimentation (Vdd) est comprise  entre 1,8 v et 5,5 v. Ce qui le rend compatible avec les micro-contrôleurs et micro-processeurs 3,3 v et 5 v.

Les 16 entrées / sorties sont utilisables individuellement ou par ports de 8 bits.

Chacun des deux ports dispose d’une sortie d’interruption (INTA et INTB) qui permet d’en propager le déclenchement sur le système hôte.

La famille du MCP23017 est constituée de plusieurs membres :

Modèle Nb de bits Interface Vitesse bus
MCP23008 8 I2C 1,7 Mbps
MCP23009 8 I2C 3,4 Mbps
MCP23016 16 I2C 400 kbps
MCP23017 16 I2C 1,7 Mbps
MCP23018 16 I2C 3,4 Mbps
MCP23S08 8 SPI 10 Mbps
MCP23S09 8 SPI 10 Mbps
MCP23S17 16 SPI 10 Mbps
MCP23S18 16 SPI 10 Mbps

Note: Le MCP23016 est déprécié par le fabricant.

Utilisation

Configuration de l’adresse

L’adresse du MCP23017 est constituée de 4 bits imposés (0100), 3 bits utilisateur (voir tableau suivant), et un bit de lecture / écriture (0 en écriture et 1 en lecture). La gestion du bit de lecture / écriture se fait au niveau du protocole série, et doit généralement être ignoré par l’application utilisatrice. L’adresse peut donc varier de 0x20 à 0x27 (ou de 0x40 à 0x4F si vous devez gérer vous-même le bit d’écriture), ce qui permet d’adresser jusqu’à 8 MCP23017 sur un port I2C.

Les trois bits d’adresse utilisateur correspondent aux broches 15 à 17 d’un MCP23017, qui doivent êtres toutes connectées. Dans le tableau suivant, ceux indiqués à 1 sont reliés à l’alimentation (Vdd), et ceux indiqués à 0 sont reliés à la masse (Vss).

A2 A1 A0 Adresse
0 0 0 0x20
0 0 1 0x21
0 1 0 0x22
0 1 1 0x23
1 0 0 0x24
1 0 1 0x25
1 1 0 0x26
1 1 1 0x27

Référence des registres

Chaque commande envoyée au MCP23017 prend la forme d’une adresse de registre suivie de 8 bits de paramètres. Chaque registre est doublé. Un exemplaire commande le port GPIO A (sur fond blanc, et l’autre commande le port GPIO B (sur fond bleu).

Le tableau suivant correspond à la configuration par défaut, où le paramètre BANK du registre IOCON vaut 0. Vous trouverez la version de ce tableau en configuration IOCON/BANK = 1 pages 9 à 11 de la datasheet.

Registre Adresse Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Déf
IODIRA 0x00 IO7 IO6 IO5 IO4 IO3 IO2 IO1 IO0 0xFF
IODIRB 0x01 IO7 IO6 IO5 IO4 IO3 IO2 IO1 IO0 0xFF
IPOLA 0x02 IP7 IP6 IP5 IP4 IP3 IP2 IP1 IP0 0x00
IPOLB 0x03 IP7 IP6 IP5 IP4 IP3 IP2 IP1 IP0 0x00
GPINTENA 0x04 GPINT7 GPINT6 GPINT5 GPINT4 GPINT3 GPINT2 GPINT1 GPINT0 0x00
GPINTENB 0x05 GPINT7 GPINT6 GPINT5 GPINT4 GPINT3 GPINT2 GPINT1 GPINT0 0x00
DEFVALA 0x06 DEF7 DEF6 DEF5 DEF4 DEF3 DEF2 DEF1 DEF0 0x00
DEFVALB 0x07 DEF7 DEF6 DEF5 DEF4 DEF3 DEF2 DEF1 DEF0 0x00
INTCONA 0x08 IOC7 IOC6 IOC5 IOC4 IOC3 IOC2 IOC1 IOC0 0x00
INTCONB 0x09 IOC7 IOC6 IOC5 IOC4 IOC3 IOC2 IOC1 IOC0 0x00
IOCON 0x0A BANK MIRROR SEQOP DISSLW HAEN ODR INTPOL 0x00
IOCON 0x0B BANK MIRROR SEQOP DISSLW HAEN ODR INTPOL 0x00
GPPUA 0x0C PU7 PU6 PU5 PU4 PU3 PU2 PU1 PU0 0x00
GPPUB 0x0D PU7 PU6 PU5 PU4 PU3 PU2 PU1 PU0 0x00
INTFA 0x0E INT7 INT6 INT5 INT4 INT3 INT2 INT1 INT0 0x00
INTFB 0x0F INT7 INT6 INT5 INT4 INT3 INT2 INT1 INT0 0x00
INTCAPA 0x10 ICP7 ICP6 ICP5 ICP4 ICP3 ICP2 ICP1 ICP0 0x00
INTCAPB 0x11 ICP7 ICP6 ICP5 ICP4 ICP3 ICP2 ICP1 ICP0 0x00
GPIOA 0x12 GP7 GP6 GP5 GP4 GP3 GP2 GP1 GP0 0x00
GPIOB 0x13 GP7 GP6 GP5 GP4 GP3 GP2 GP1 GP0 0x00
OLATA 0x14 OL7 OL6 OL5 OL4 OL3 OL2 OL1 OL0 0x00
OLATB 0x15 OL7 OL6 OL5 OL4 OL3 OL2 OL1 OL0 0x00

IODIRp : Registre de direction. Contrôle la direction des entrées / sorties du port GPIO p. Quand un bit (IOb) est à 1, la broche correspondante (b) du GPIO p est en entrée. Quand un bit (IOb) est à 0, la broche correspondante (b) du GPIO p est en sortie. Tous les bits sont accessibles en lecture et écriture. Tous les bits sont à 1 au démarrage (0xFF).

IPOLp : Registre de polarité en entrée. Contrôle la polarité des entrées du port GPIO p. Quand un bit (IPb) est à 1, le registre correspondant (b) reflétera l’inverse de l’état logique appliqué à la broche b du GPIO p. Quand un bit (IPb) est à 0, le registre correspondant (b) reflétera l’état logique appliqué à la broche b du GPIO p. Tous les bits sont accessibles en lecture et écriture. Tous les bits sont à 0 au démarrage (0x00).

GPINTENp : Registre d’interruption sur changement. Contrôle la fonction d’interruption sur changement de chaque broche du port GPIO p. Quand un bit (GPINTb) est à 1, l’interruption sur changement est activée pour la broche correspondante (b) du GPIO p. Les registres DEFVALp et INTCONp doivent aussi être paramétrés, dans ce cas. Tous les bits sont accessibles en lecture et écriture. Tous les bits sont à 0 au démarrage (0x00).

DEFVALp : Registre de valeur initiale du comparateur d’interruption sur changement. S’il est activé (via GPINTENp et INTCONp), la présence d’un état logique inverse à celui fourni sur la broche correspondante du GPIO déclenchera une interruption sur changement. Tous les bits sont accessibles en lecture et écriture. Tous les bits sont à 0 au démarrage (0x00).

INTCONp : Registre de contrôle d’interruption. Contrôle le comparateur d’interruption sur changement. Quand un bit (IOCb) est à 1, l’état logique de la broche correspondante (b) du GPIO p est comparée au bit associé du registre DEFVALp. Quand un bit (IOCb) est à 0, l’état logique de la broche correspondante (b) du GPIO p est comparée à sa valeur précédente. Tous les bits sont accessibles en lecture et écriture. Tous les bits sont à 0 au démarrage (0x00).

IOCON : Registre de configuration. Contrôle la configuration du MCP23017 :

BANK : Ce bit change la table d’adressage du registre de commandes. Lorsque le bit BANK est mis à 1, les registres sont groupés par port GPIO. Les registres du port A sont dans la plage d’adresses 0x00 à 0x0A et les registres du port B sont dans la plage d’adresses 0x10 à 0x1A. Lorsque le bit BANK est mis à 0, les registres sont groupés par fonctionnalité. Par exemple, IODIRA sera à l’adresse 0x00 et IODIRB à l’adresse suivante (0x01). Gardez bien à l’esprit que mettre à jour ce bit va modifier toute la table des registres, et il faut éviter de le modifier lors de traitements par lots.

MIRROR : Ce bit contrôle la façon dont les broches INTA et INTB fonctionnent l’une par rapport à l’autre. Quand MIRROR vaut 1, un OU logique sera appliqué sur les deux broches. Le déclenchement d’une interruption sur l’un des ports GPIO sera répercuté sur les deux broches INTp. Quand MIRROR vaut 0, chaque broche d’interruption est indépendante. Une interruption sur le GPIOp ne sera répercutée que sur INTp.

SEQOP : Bit d’opérations séquentielles. Ce bit contrôle l’auto-incrément du pointeur d’adresse. Quand SEQOP vaut 1, l’auto-incrément du pointeur d’adresse est désactivé. Quand SEQOP vaut 0, le pointeur d’adresse s’incrémente a chaque octet envoyé à travers le port série.

DISSLW : NDT: Ce paramètre n’est pas clair à mes yeux et je préfère ne pas le traduire. Voir la page 17 de la datasheet pour plus d’informations.

HAEN : Gestion d’adresse matérielle. Ce bit contrôle si les 3 broches d’adresse matérielle sont utilisées. Ne fonctionne que sur un MCP23S17. Dans tous les cas, les broches correspondantes doivent êtres reliées. Lorsque HAEN vaut 1, Les 3 broches d’adresse A0 à A2 participent à l’adresse du MCP23S17. Lorsque HAEN vaut 0, les 3 broches d’adresse A0 à A2 seront ignorées et vaudront 0.

ODR : Contrôle de collecteur ouvert. Quand ODR vaut 1, les broches INTp sont à collecteur ouvert, la valeur de INTPOL sera ignorée. Quand ODR vaut 0, les broches INTp disposeront d’une résistance de rappel ou de tirage interne, selon la valeur de INTPOL.

INTPOL : Contrôle de polarité d’interruption. Quand INTPOL vaut 1, les broches INTp disposeront d’une résistance de tirage (pull-up) interne. Quand INTPOL vaut 0, les broches INTp disposeront d’une résistance de rappel (pull-down) interne.

Le bit 0 du registre IOCON n’est pas utilisé et apparaîtra toujours comme valant 0. Les autres bits sont accessibles en lecture et écriture. Tous les bits sont à 0 au démarrage (0x00).

GPPUp : Registre de contrôle des résistances de tirage (pull-up). Quand un bit (PUb) est à 1, la broche correspondante (b) du GPIO p dispose d’une résistance de tirage (pull-up) interne de 100 kΩ. Quand un bit (PUb) est à 0, la broche correspondante (b) du GPIO p ne dispose pas d’une résistance de tirage (pull-up) interne. Tous les bits sont accessibles en lecture et écriture. Tous les bits sont à 0 au démarrage (0x00).

INTFp : Registre des interruptions. Ce registre reflète les interruptions de chaque broche pour lesquelles elles ont été activées par le registre GPINTEN. Un bit (INTb) à 1 signifie que la broche (b) correspondante du port GPIO p a déclenché une interruption. Un bit (INTb) à 0 signifie que la broche (b) correspondante du port GPIO p n’a pas déclenché d’interruption (ou n’est pas paramétrée pour en déclencher). Tous les bits sont accessibles en lecture seule. Toute écriture sera ignorée. Tous les bits sont à 0 au démarrage (0x00).

INTCAPp : Registre de capture des interruptions. Ce registre en lecture seule capture l’état du port GPIO p au déclenchement d’une interruption. Il conserve son état jusqu’à la lecture de INTCAP ou de GPIO. Tous les bits sont accessibles en lecture seule. Son état au démarrage est inconnu.

GPIOp : Le registre GPIOp reflète les états logiques du port GPIO p. Toute écriture dans ce registre est appliquée au registre OLATp. Tous les bits sont accessibles en lecture et écriture. Tous les bits sont à 0 au démarrage (0x00).

OLATp : Le registre OLATp donne accès aux bascules de sortie. Une lecture reflétera l’état des bascules, et non le port lui-même. Une écriture dans ce registre modifiera les bascules, qui à leur tour modifieront les broches configurées en sortie. Tous les bits sont accessibles en lecture et écriture. Tous les bits sont à 0 au démarrage (0x00).

Applications


Voici quelques exemples d’application du MCP23017 :

  • Création ou extension de ports GPIO
  • Pilotage de composants parallèle (afficheur à LEDs, LCD, etc)
  • Pilotage de relais
  • Gestion de claviers matriciels
  • Gestion de capteurs binaires (ILS / REED, PIR, niveau de liquide, etc)

Liens

Facebooktwitterredditpinterestlinkedinmail

4 commentaires

    1. Bonjour, j’ai commencé à rédiger un second article sur la mise en œuvre du MCP23017 avec un RaspberryPi. Mais j’ai énormément de travail ces derniers temps, et l’ai un peu mis de côté. Je ne me suis pas encore trop penché sur la gestion des interruptions, mais puisque le sujet intéresse du monde, je vous promets de le faire !

  1. Bonjour,

    Felecitation pour votre site.

    J’essaye de mettre en oeuvre plusieurs mcp23017 sur le meme bus. De facon a avoir 32 entrees et 32 sorties.

    Ils sont raccordé a un raspberry pi.

    Les sorties sont gérées parfaitement, les entrees j’ai un peu plus de mal surtout pour gerer les interruptions.

    Je n’ai pas bien compris a quoi sert le registre DEFVALp ainsi que le registre INTCONp.

    Pourriez vous m’expliquer?

     

    Merci

    jc

     

    1. Bonjour, je n’ai pas encore travaillé sur la gestion d’interruptions de ce composant. Je vais donc répondre très théoriquement. Le registre INTCON contrôle le mode de comparaison du gestionnaire d’interruption. Un bit à 0 signifie qu’une interruption devra être levée lorsque la broche correspondante du GPIO changera d’état. Il se compare à lui même. Une valeur de 1 signifie qu’une interruption devra être levée lorsque la broche correspondante du GPIO aura un état différent de ce qui est indiqué dans le registre DEFVAL. Il se compare à DEFVAL. Les interruptions sont gérées par un registre comparateur dont la valeur initiale est paramétrée par le registre DEFVAL.

      Par exemple, si le premier bit vaut 0 dans INTCON, une interruption devra être levée à chaque changement d’état (aussi bien 0 que 1). Le registre DEFVAL est ignoré pour ce bit. Si le bit vaut 1 dans INTCON et 0 dans DEFVAL, seuls les passages de 0 à 1 doivent déclencher une interruption. Le retour à 0 ne doit pas en déclencher.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *