Utilisant un PIC USB 18F2550,réaliser votre convertisseur USB<->I2C (master) d'un coût de revient modique, et qui peut être reprogrammé au besoin.
La base en est l'Application Note de Microchip numéro 956 (AN956) qui décrit une émulation série via l'USB avec ce PIC.
Concrètement, le PIC 18F2550, branché directement en USB sur un PC, est reconnu comme une émulation du port série, et se voit attribuer un numéro de port COM.
N'importe quel programme sur PC peut ensuite ouvrir ce port COM, et envoyer des informations au PIC, via l'USB. Cette utilisation de l'USB, qui est assez complexe, est donc rendue transparente pour le programme du PC.
Au niveau du PIC, je me suis appuyé sur le code fournit avec l'AN956, que j'ai très peu modifié, mais auquel j'ai ajouté la gestion de l'I2C.
Cette petite carte n'est pas parfaite, et souffre encore de problèmes que je ne suis pas arrivé à résoudre, et qui peuvent nécessiter un reset manuel. Il vaut donc mieux l'utiliser uniquement pour des tests, ou des applications que ne sont pas très lourdes.
Description de la carte :
La carte a été réalisée sur un morceau de plaque à pastilles. C'est à la portée de n'importe qui a un fer à souder !
(Mais je ferai peut-être une version Protel plus propre un jour ;)
On trouve sur la carte, comme composants :
- Un PIC 18F2550. On en trouve chez Farnel, sur le site de microchip, ou même en sample si vous êtes patients.
- Un support DIP 28 broches pour le PIC.
- Une prise USB "B" femelle.
- De la barrette sécable mâle pour réaliser 2 autres connecteurs (un de 4 pour l'I2C, et un de 5 pour la reprogrammation).
- Un quartz 4MHz.
- Des résistances : 6 de 1K, une de 1.5K (ou séparées en 1k + 470 comme j'ai fait) et une de 10K.
- Des condos : 3 de 100nF, 2 de 33pF.
- Un bouton poussoir pour le reset.
- 4 leds 3mm.
- La plaque à pastilles elle-même.
Il y a juste un fil rouge qui se balade, j'ai pas pu faire autrement ...
Voici des photos de la cartes en macro :
Le programme est donc une modification de l'AN956 de Microchip.
Il est écrit en C et utilise C18, le compilateur de Microchip. Vous trouverez ce compilateur, ainsi que MPLAB (l'éditeur et ASM) sur le site de Microchip. Il y a une version gratuite, c'est celle que j'utilise. Attention, il n'y a qu'une version Windows.
Pour programmer le PIC, vous pouvez utiliser le programmateur de PIC Fribotte (voir la bdtech), ou utiliser un ICD2 de Microchip (plus cher !).
Vous trouverez tout dans ce .zip, dont voici une petite description :
- MCHPFSUSB/00956b_USB.pdf : Description de l'AN956
- MCHPFSUSB/39632b_PIC.pdf : Documentation du PIC 18F2550
- MCHPFSUSB\fw\Cdc : Le projet C18/MPLAB
- MCHPFSUSB\fw\Cdc\inf\win2k_winxp : Vous trouverez ici le "driver" de l'USB, cad plus précisément le numéro de périphérique USB, le driver étant déjà présent dans les OS.
- MCHPFSUSB\fw\Cdc\user\user.c : Le fichier dans lequel j'ai implémenté l'I2C.
Si vous voulez passez à 400Khz, inversez simplement les commentaires sur les lignes :
SSPADD= 0x63; // Assuming 40MHz speed - 100KHz
//SSPADD= 0x18; // Assuming 40MHz speed - 400KHz
SSPSTAT = 0b10000000; // 100Khz
//SSPSTAT = 0b00000000; // 400Khz
Mode d'emploi de la car
te
Carte USB<->I2C avec PIC 18F2550
Introduction :
Cette carte est utilisée pour envoyer et recevoir des trames I2C via un connecteur USB.Le PIC 18F2550 (connu comme le PIC USB) en compose la majeure partie.
Il est configuré en master I2C, et par là même va pouvoir envoyer des messages ou demander des retours aux esclaves.
Connecté au PC, il est vu comme une émulation de la liaison série, rendant son utilisation simple pour les programmes sur le PC.
Les drivers sont directement inclus dans Linux et windows, mais il faut un petit fichier .ini pour ce dernier qui lui indique le "numéro USB" du périphérique.
La carte s'alimente directement au 5V de l'USB.
La communication USB se base sur l'AN956 de Microchip.
Branchement :
- La carte présente un port USB B femelle, qui doit être relié à l'ordinateur. Au 1er branchement, il faut fournir le fichier .ini nécessaire.- La carte présente aussi un connecteur mâle doté de 5 picots. Ce dernier est utilisé pour la re-programmation du PIC. Dans l'ordre, en partant du bouton reset on a : Reset du pic, +5V, masse, RB7, et RB6.
- Le connecteur mâle 4 picots est le connecteur I2C. Dans l'ordre, en partant du plus éloigné du connecteur USB, on a : la clock I2C, la masse, le signal I2C, et le +5V.
La carte fournit du 5V I2C directement via l'USB, et est donc limitée par ce courant. Attention aussi de ne pas mettre en court-circuit.
Bouton reset :
La carte a un bouton reset, qui est très utile pour relancer la connexion USB & le PIC. Ne pas hésiter à appuyer dessus pour tout relancer.Signification des leds :
En prenant la carte avec le port USB en bas à droite, on peut séparer les leds en 2 groupes, les deux du bas et les deux du haut.Celles du bas sont gérées par la couche USB du PIC, et clignotent alternativement quand l'USB est branché et reconnu par le PC.
Celles du haut vont tout d'abord clignoter rapidement après un reset.
Ensuite celle le plus en haut va s'allumer si la dernière trame I2C n'a pas reçu de réponse de l'esclave (NAK).
L'autre s'allume pendant l'envoi d'une trame I2C, ce qui peut être très rapide et pas forcément visible.
Protocole :
Quand la carte se connecte à l'ordinateur, via l'USB, elle apparaît comme un nouveau port com. On peut regarder dans le gestionnaire de périphérique quel est son numéro.Ensuite, il faut ouvrir le port com par n'importe quel logiciel ou programme, et envoyer ou recevoir les données dessus.
Le protocole nécessite l'envois de 2 octets pour chaque octet envoyé sur l'I2C.
- Le premier octet décrit le type de l'octet à envoyer dans la trame I2C. Trois valeurs sont possibles, pour le start, pour les données, et pour le stop (cf ci-dessous)
- Le 2eme octet est ce qui est envoyé sur l'I2C.
Tableau des valeurs du 1er octet du protocole :
Valeur ascii | Valeur décimale | Description |
'a' | 97 | Le 2ème octet correspond à la trame d'adresse de l'I2C, soit l'adresse I2C *2 + le bit de poids faible à 0 si le maître envoit de l'information, et à 1 s'il en demande. Un start est généré avant l'envoi de l'adresse. |
'b' | 98 | Le 2ème octet correspond à un octet à envoyer (si le maître envois de l'information) ou que le maître doit demander un octet. |
'c' | 99 | Idem que 'b', mais suivit d'un stop I2C. |
'a' est obligatoire au début, et 'c' à la fin. Entre le deux, il peut y avoir 0, 1, ou plusieurs 'b'.
Dans le cas ou le maître demande un retour de l'esclave, il doit d'abord le spécifier sur l'octet qui suit 'a', qui doit être impair (sinon, il doit être pair).
Ensuite, il va envoyer 0, 1, ou plusieurs 'b' suivit d'un octet dont il ne tiendra pas compte, et suivit enfin par un 'c' et un nouvel octet non pris en compte.
Si le slave I2C répond, le programme lira ensuite dans le buffer de la liaison série autant d'octets qu'il n'y a eu de 'b' et de 'c' dans le message.
Un seul et même envoi sur la liaison série doit se limiter à 64 octets, et donc 32 octets sur le bus I2C.
Il y aura une pause d'une ou deux ms entre 2 envois, apparemment dues au protocole USB.
Exemple d'envoi :
On émet sur la liaison série, directement en décimal :'a', 68, 'b', 230, 'b', 124, 'c', 125
Sur la trame I2C, on aura donc, un start I2C, une adresse 68 (le maître envoit sur l'esclave), les octets 230, 124 et 125, suivit d'un stop.
Exemple de réception :
On émet sur la liaison série :'a', 69, 'b', 0, 'c', 5
Sur la trame I 2C, on aura donc, un start I2C, une adresse 68 et le maître reçoit des données de l'esclave, ensuite il y a 2 octets que l'esclave envoit au maître (disons par exemple 34 et 37), suivit d'un NAK et un stop du maître.
On peut lire sur la liaison série, et on y trouvera 34 et 37.
Bug connus :
- Reset quand on branche une carte I2C. On ne sait pas d'où vient le problème, et il n'est pas corrigé par l'ajout d'une grosse capa.- Blocage de la carte : dans certaine condition, le PIC se bloque. Les leds ne clignotent plus. Le plus simple est alors de faire un reset.
Aucun commentaire:
Enregistrer un commentaire