Pb de communication I2C

Bonjour ,
j’essaie depuis qq temps d’écrire un driver python pour un LCD de type ST7588TI.
c’est un LCD qui communique en I2C.
Je parviens à communiquer avec lui en utilisant la lib SMBUS3 et bien sûr la notice constructeur qui référencie toutes les commandes et qu’on peut trouver ici :

https://support.newhavendisplay.com/hc/en-us/article_attachments/4414855949335

le pb c’est qu’au bout d’un moment j’obtiens une erreur 121 [remote error]. ça ne survient pas toujours au même moment.
Pourtant

i2cdetect -y 1

renvoie toujours la même adresse 0x3F ce qui signifie bien que l’écran est détecté comme un device I2C.

par exemple, une fonction pour effacer l’écran pixel par pixel :

from smbus3 import SMBus
...
def clean_display(self,i0):
 wrdata = [self.SEND_COMMAND,self.SET_H00]
 self.bus.i2c_wr(self.address,wrdata)
 wrdata = [self.SEND_COMMAND,0x07] #Enter the read/modify/write mode
 self.bus.i2c_wr(self.address,wrdata)
 for i in range(1320):
     wrdata = [self.SEND_DATA,0x00]
     self.bus.i2c_wr(self.address,wrdata)
 wrdata = [self.SEND_COMMAND,0x06]#END
 self.bus.i2c_wr(self.address,wrdata)

qui est censée exécuter le protocole de la doc :

il s’arrête au bout d’un moment avant d’avoir initialisé la RAM complètement à 0 :

hier j’ai pu faire fonctionner intégralement le script. Aujourd’hui le même script plante au milieu avec une erreur 121.
Est ce que ça peut être dû au fait de lancer le script avec SSH ?

Bonjour,

Non il y a peu de chance que cela provienne de SSH. Par contre si c’est instable, c’est potentiellement un problème de connectique ou d’alimentation.
Bien vérifier la qualité de l’alimentation, eventuellement la mesurer avec un vlotmètre et regarder si elle est stable surtout lorsque la commande est lancée. Aussi verifier si les toutes les masses sont bien reliées et qu’il n’y a pas de problème de connectique. On voit qu’il y a des soudures, les vérifier également. Cela peut venir également de la longueur du câble ou des interférences.

A+

Merci jelopo pour ton retour.
Tu as raison, je viens de vérifier en me connectant via le port HDMI et ça ne change rien.
Effectivement c’est très instable comme liaison, mais j’ai testé plusieurs configurations différentes de câbles (moins longs, plus épais) et ça influe très peu sur le comportement. Surtout c’est très aléatoire. Le même script plante à des endroits différents variables si on le lance plusieurs fois.
Je peux faire tourner correctement le script en gérant les exceptions à l’écriture. Je ne vois pas d’autres solutions (j’ai lu qq part qu’il fallait ajouter un délai après l’ouverture du port SMBUS, mais ça ne change rien).

Donc, pour que ça fonctionne il faut remplacer la commande de base SMSBUS3 :

self.bus.i2c_wr(self.address,wrdata)

par:

self.i2c_write(self.address,wrdata)

et définir la méthode :

def i2c_write(self, devadrr,regdata):
  for attempt in range(10):
     try:
       self.bus.ic_wr(devadrr,regdata)
       return True
     except IOError:
       pass
       return None

j’espère que ça pourra être utile à d’autres confrontés aux pbs récurrents de l’erreur :

[Errno 121] Remote I/O error

en I2c

Affichage d’un carré :

Bonjour,

C’est une bonne nouvelle pour votre contournement et bravo pour sa mise en place.

Si besoin d’aller plus loin, j’ai trouvé ce post en anglais qui présentes d’autre approches pour ce type d’erreur

Bonnes bidouilles.
A+

merci. je vais y jeter un oeil.
Je fais aussi un github pour le driver sur lequel je travaille. Je le ferai savoir qd j’aurai terminé.

j’ai lu le lien. Le pb c’est que les conseils apportés ne sont pas corrects. Par exemple, il est écrit de supprimer les résistances de pull-up et ça n’est pas une bonne idée vu que dans mon cas l’écran nécessite d’avoir des pull-ups sur les voies SDA et SCL. Si on les supprime, il ne fonctionne pas. Pour ce qui est des câbles, j’ai jamais réussi à améliorer quoi que ce soit en essayant de les raccourcir.