Accueil > Electronique > FPGA > Contrôleur I2C
Contrôleur I2C
samedi 23 juin 2007, par
Introduction
La description qui suit est un contrôleur de bus I2C élémentaire. Il ne gère pas le mode multi-maître, toutefois le « clock streching » est pris en charge.
La fréquence de transmission est défini grâce à un décompteur externe à la description.
Découpage
Le contrôleur est découpé en plusieurs séquenceurs dont la liste exhaustive est la suivante :
le séquenceur de requête,
le détecteur d’événements de bus,
le séquenceur de bus,
le contrôleur de bus et
une bascule RSC.
Chaque unité sera décrite dans les détails ci-dessous.
Le séquenceur de requête
Cette description prend en charge le séquencement des actions sur le bus, à savoir :
la condition de “Start†(start_req),
la condition de “Repeat Start†(repeat_start_req),
la condition de “Stop†(stop_req) et
la génération de l’horloge lors de la transmission des données (byte_req).
Le bloc a besoin de connaître :
l’état du bus (busy) et
l’état de l’action (complete).
Et il fournit :
la demande d’exécution de la condition de “Start†(process_start),
la demande d’exécution de la condition de “Repeat Start†(process_repeat_start),
la demande d’exécution de la condition de “Stop†(process_stop),
la demande d’exécution du signal d’horloge et
l’état d’activité des actions de bus.
Le détecteur d’événements de bus
Cette description permet de détecter une condition de “Start†ou “Repeat Start†, une condition de “Stop†, le front montant du signal d’horloge ou le front descendant du signal d’horloge.
Ces informations sont importantes pour le séquencement de certains unités.
Le séquenceur de bus
Cette description permet de générer :
la condition de “Start†,
la condition de “Repeat Start†,
la condition de “Stop†,
le signal d’horloge nécessaire aux échanges de données.
Lors de la génération d’horloge, le bloc nécessite l’état du signal “SCL†afin de traiter le cas du “clock strech†.
En effet, lorsque le séquenceur impose un niveau haut sur l’horloge, il attend que le signal passe effectivement à un avant de lancer un processus extérieur de temporisation.
Le contrôleur de bus
Cette description permet de :
détecter la direction du transfert,
indiquer l’instant où doit se produire l’acquittement et
fournir l’état du bus.
Le bloc utilise les signaux “start†et “stop†pour indiquer l’état du bus. Le signal interne “first†associé au compteur interne et au signal “sda†permet de détecter la direction du transfert. Le compteur est aussi utilisé pour détecter l’instant où les acquittements doivent se produire.
La bascule RS
La bascule RS est synchrone à une horloge. De plus, l’entrée de mise à un (S) est prioritaire.
Voici la description VHDL de la bascule :
Le contrôleur de bus I2C
Le contrôleur de bus I2C est composé de toutes les descriptions ci-dessus auxquels on ajoute un multiplexeur pour la génération du signal SDA en sortie, un premier registre à décalage pour l’émission et un second pour la réception ainsi que deux blocs de synchronisation pour les signaux SDA et SCL en entrée.
Le contrôleur nécessite un compteur extérieur afin de définir la fréquence de SCL.