Conversion de signaux i2c 3.3v <-> 5v

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.

 

NXP app 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 😉

 

i2c level shifter with BSS138

 

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.

Logic level converter

 

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.

PCA9306 pinout

 

La lecture du datasheet nous indique le schéma pour mettre en oeuvre le convertisseur.

Schéma d’utilisation du PCA9306

Un petit tour chez Sparkfun nous confirme le schéma d’utilisation de ce composant.

Breakout board
Schéma Sparkfun

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…

 

Pinning

 

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.

http://www.youtube.com/watch?v=l-XXfzLL508

 

PCA9306

 

Convertisseur

 

Comme la dernière fois, nous allons tester l’I2C mais cette fois avec un composant i2c 5V, une horloge DS1307.

DS1307

 

On câble 5v, GND, SDA, SLC

Tests en cours

 

On lance « i2cdetect » sur le MR3020.

i2c-detect

 

Parfait, le convertisseur fonctionne, notre DS1307 est en 0x68.

 

La suite avec le branchement de l’arduino 😉

Une réponse sur “Conversion de signaux i2c 3.3v <-> 5v”

  1. Cool! Pour le « do it » bravo c’est bien documenter et clair. Juste une suggestion pour le « hack it » et ceux qui veulent récup! Les BSS138 sont marqués J1 (des fois J.1) en CMS et sont récupérable assez facilement sur les tv ou pas mal de petits appareils à démonter absolument quand ça marche plus… Bon, c’est sure, c’est déjà pas facile à souder….
    May the DIY be with you!

Laisser un commentaire

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

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

En savoir plus sur Notes d'un bricoleur

Abonnez-vous pour poursuivre la lecture et avoir accès à l’ensemble des archives.

Poursuivre la lecture