Dans mon post précédent, j’ai ajouté un bus I2C sur mon routeur MR3020. Ce bus est prévu pour fonctionner en 3.3v. Le chipset du MR3020 n’est probablement pas compatible avec des signaux 5v. Étant donné que je souhaite relier en I2C un arduino en 5V avec mon MR3020, il faut convertir les signaux 3.3v en 5v et réciproquement, la communication i2c étant bidirectionnelle.
Il existe plusieurs méthodes:
- la première, proposée par NXP est basée sur des BSS138, des petits mosfets rapides.
- La deuxième est basée sur un chipset spécialisé le PCA9306.
La première méthode est assez simple, il suffit d’utiliser 1 BSS138 par ligne de signal et 4 résistances de pullup. Le principe est décrit dans cette note.
La réalisation peut se faire sur un morceau de perfboard malgré le fait que les BSS138 soient des CMS. Mon circuit n’est pas très propre, mais il fonctionne 😉
Il n’y a plus qu’à câbler les lignes L1 et L2 côté 3.3v sur les lignes SCL et SDA sur MR3020 et les lignes L1 et L2 côté 5V sur l’Arduino ou autre composant i2c 5v.
On peut retrouver ce circuit chez adafruit pour environ 4$ avec 4 lignes de signal.
Passons maintenant au circuit à base de PCA9306. C’est le circuit que j’ai décidé d’utiliser sur le MR3020 pour la bonne raison que j’avais commandé des BSS138 et des PCA9306 donc je préfère utiliser le circuit spécialisé pour la conversion de niveaux sur bus i2c.
La lecture du datasheet nous indique le schéma pour mettre en oeuvre le convertisseur.
Un petit tour chez Sparkfun nous confirme le schéma d’utilisation de ce composant.
Attention toutefois, je n’ai pas le même « form factor » que le PCA9306 de sparkfun et la masse n’est pas au même endroit comme le confirme le datasheet. Suivant le boîtier, la masse est en 1 ou 4…
Le circuit est réalisé sur une perfboard. J’ai mal coupé la perfboard et elle s’est cassée… quel c… mais bon le circuit marche quand même !
Pour souder le PCA9306, il faut un peu de patience et de bons yeux. Voilà une petite vidéo résumant la mise en place du PCA9306 sur une perfboard.
Comme la dernière fois, nous allons tester l’I2C mais cette fois avec un composant i2c 5V, une horloge DS1307.
On câble 5v, GND, SDA, SLC
On lance « i2cdetect » sur le MR3020.
Parfait, le convertisseur fonctionne, notre DS1307 est en 0x68.
La suite avec le branchement de l’arduino 😉