Convertisseur USB I2C

Transcription

Convertisseur USB I2C
Convertisseur USB I2C
Extrait du PoBot
http://www.pobot.org
Convertisseur USB I2C
- Programmation - Apprendre - Communications - Protocoles de communication -
Date de mise en ligne : jeudi 11 décembre 2008
Description :
un module de dialogue avec des capteurs sur bus I2C depuis une liaison série USB (PC)
PoBot
Copyright © PoBot
Page 1/5
Convertisseur USB I2C
Sommaire
• Installation du pilote
• Vérification du fonctionnement
• Mise en garde
• Communications I²C
Le module USB-I2C de Devantech est un convertisseur de protocole I2C pour un usage USB. Il permet de
communiquer avec des circuits situés sur un bus I2C par l'intermédiaire d'une liaison série (notre usage principal) ou
servir à récupérer des valeurs numériques pour 2 entrées analogiques.
Contrairement aux convertisseurs USB-RS232 qui permettent de construire une "vraie" liaison série de manière
transparente du point de vue de votre programme, il s'agit ici de transformer des octets envoyés au module connecté
sur un port USB en des trames I2C selon un protocole propre à ce module.
Convertisseur vu du connecteur
Convertisseur vu de la prise USB
Il y a donc derrière le connecteur USB un convertisseur série classique (FTDI) qui va fournir vos octets via l'UART
d'un microcontrôleur (en l'occurence un PIC Microchip 16F587) qui va lui même assurer la communication avec le bus
I2C et les circuits que vous aurez connecté sur les broches.
C'est donc une mini-carte à µC intégrant tout ce qu'on a d'habitude, mais sans le superflu. D'ailleurs les ingénieurs de
Devantech ont profité des seulement 5 broches de connexion pour rajouter une entrée/sortie numérique et deux
entrées analogiques (que nous avons déjà utilisé lors du test de l'ADXL311).
Copyright © PoBot
Page 2/5
Convertisseur USB I2C
Installation du pilote
Le convertisseur série FTDI utilise des pilotes de port série virtuel (ou VCP drivers en anglais) disponibles ici
[http://www.ftdichip.com/Drivers/VCP.htm] pour les différents Windows ou Mac. Pour Linux, ils sont également
disponibles mais vérifiez d'abord si votre distribution ne gère pas nativement la puce de conversion : c'est le cas du
noyau 3 pour la Ubuntu 11.10 et supérieures.
Vérification du fonctionnement
Pour éviter tout doute (est-ce que mon driver usb est correctement installé - c'est un simple FTDI), on va commencer
par faire allumer et éteindre la led située sur la carte. Vous n'avez donc pas besoin de matériel supplémentaire pour
faire ce test. Lorsque vous branchez le module, une led rouge s'éclaire indiquant la mise sous tension. On va
l'éteindre.
1) Connectez le module à votre ordinateur, installez le driver si nécessaire 2) Ouvrez un logiciel de communication
série (Hyperterminal, Terminal, Docklight...) 3) Paramétrez la communication : 19200 / 8 bits de data / pas de parité / 2
bits de stop (oui 2 !)
Vous êtes prêts à envoyer vos premiers octets (donnés ici en hexadécimal) :
0x5A 0x10 0x00 0x00
Le premier octet est le mode souhaité (ici, 5A = programmes spécifiques par opposition à I2C)
Le second octet est le programme souhaité (0x10 est justement la sélection des entrées/sorties)
Le troisième octet donne les valeurs : xxxx xxx0 (on se moque des 7 dernières, c'est le bit 0 qui gère la led
Le quatrième n'a pas de signification mais est obligatoire
Copyright © PoBot
Page 3/5
Convertisseur USB I2C
Pour la rallumer, très simple on passe le bit 0 du troisième octet à 1 :
0x5A 0x10 0x01 0x00
Mise en garde
Attention, c'est désormais officiel, le module USB-I2C de Devantech ne permet pas de communiquer avec tous les
circuits I2C.
Par exemple la led RGB "BlinkM" qui pourtant utilise le protocole I2C de manière standard n'est pas accessible : le
mode "multi caractères sans registres" n'est pas supporté par ce module (actuellement en version 6).
Merci aux étudiants de Polytech'Nice qui ont continué nos tests (cet article présentait auparavant nos différentes
tentatives de connexion) et ont obtenu une confirmation du créateur de la BlinkM lui-même, Tod E. Kurt.
Communications I²C
Les bases de l'I2C
Pour faire court, l'I2C est un protocole de communication utilisant deux fils (Atmel l'appelle d'ailleurs Two Wire
Interface pour faire plus "roots"... ou pas payer de droits sur le nom I²C ?) transportant les données (ligne 'data') à lire
en fonction d'une horloge partagée (ligne 'clock'). Philips l'a créé pour faire communiquer ses circuits à l'intérieur d'un
magnétoscope, donc son utilisation en robotique est fidèle à ses origines : moteurs, capteurs, circuit de contrôle. On le
trouve aussi dans les PC (Intel l'appelle SMBus pour System Management Bus, histoire de pas laisser penser qu'un
ordinateur est aussi bête qu'un magnétoscope).
Ce qui fait surtout la différence, pour nous qui connaissons surtout la liaison série en double sens réception/émission,
tient en deux points :
c'est un bus, donc plusieurs circuits connectés (chouette !)
pas d'égalité entre les circuits : il y a un maître et des esclaves (zut, va falloir gérer ça).
Forcément on va donc devoir gérer :
des adresses pour chacun des circuits
des temps de parole pour attendre les réponses des esclaves
Le bus I2C fonctionne sur des lignes à collecteur ouvert, on utilise des résistances de tirage pour donner un niveau
haut, la masse commune servant de niveau bas.
Selon la doc du module USB-I2C disponible (en anglais) sur le site Robot-Electronics
[http://robot-electronics.co.uk/acatalog/USB_I2C.html], tout est déjà prêt pour connecter sur les broches un circuit
gérant l'I2C sans plus d'électronique :
alimentation 5v (70 mA) fournie par la liaison USB
résistances de pull-up 4,7 kOhms déjà présentes sur la carte
Copyright © PoBot
Page 4/5
Convertisseur USB I2C
la carte gère les séquences start/restart/stop et les acknowledges
Principes du module
On apprend dans la documentation du module qu'il y a différents modes de communication I2C :
écriture/lecture d'un octet pour un équipement non enregistré
lecture de plusieurs octets sans utiliser de registre
écriture/lecture d'octets pour un équipement avec adresse d'1 octet
écriture/lecture d'octets pour un équipement avec adresse de 2 octets
Cette information est surprenante, car on avait bien intégré cette notion d'adresse mais pas de plusieurs octets. En
fait, il s'agit de l'adresse des registres internes de certains circuits (exemple typique, une mémoire). Quand aux
équipements "non-enregistré", il s'agit de l'assignation d'une adresse universellement associée à un circuit, mis en
place par Philips pour tous les circuits bénéficiant de l'appellation I²C. Ce n'est pas le cas de la BlinkM.
Les trames série à envoyer au module prennent donc la forme suivante :
un octet de commande indiquant le mode de communication
l'adresse I2C de l'équipement
0, 1 ou 2 octets selon la présence et le type de registre interne
0 ou 1 octet indiquant le nombre d'octets de données
les octets de données en cas d'écriture
Utilisation du module
SCL et SDA sont les noms des lignes d'horloge (CLock) et de données (DAta) du bus.
A suivre...
Copyright © PoBot
Page 5/5