Getting IOError: [Errno 121] Remote I/O error with I2C python (raspberry)

Hello,

Je sais que le problème a déjà traité maintes fois, mais je n’arrive pas la résoudre…

J’ai un script python sur Raspberry qui communique avec une carte en I2C et j’ai toujours cette Errno 121 Remote I/O error…

Dans le terminal j’ai essayé la commande sudo i2cdetect -y 1 et ma carte est bien détecté sur 0x60
J’ai essayé en retirant les pull up de ma carte mais le problème reste le même…

Mon fichier I2C_Keyboard.py

import smbus
import threading
import time

I2CAddress = 0x60
Request = 0x03
HardwareReferenceRequest = [0x05, 0x03, 0x01, 0x00, 0x00]

class I2C_Commmunication(threading.Thread):
    def _init_(self)
       threading.Thread._init(self)
       self.terminated = False

    def run(self):
       I2C = smbus.SMBus(1)
       time.sleep(1)

       while 1:
          try:
              I2C.write_i2c_block_data(I2CAddress, Request, HardwareReferenceRequest)
              print("I2C OK")
          except:
             print("I2C failed")

          time.sleep(0.1)

    def stop(self):
       self.Terminated = True

Le fichier Startup.py

from I2C_Keyboard import I2C_Communication
I2C_CommunicationThread = I2C_Communication()
I2C_CommunicationThread.setName("I2C_Communication")
I2C_CommunicationThread.start()

while True:
   time.sleep(1)

Le script envoie une trame tous les 100ms sinon ma carte reboot (c’est son fonctionnement). Je fais ça via un thread du coup.

Si quelqu’un a une idée :pray:

Bonjour,

Souvent, il semblerait que ce soir une erreur assez générique et qu’il faille vérifier/modifier/tester la partie matérielle, encore et encore.
Problème de connexion, longueur de fils, résistances de pullup, niveau de tension ou encore au pire du circuit I2C.

Je suppose que vous avez déjà exploité ces pistes ?

Bonnes recherches.

A+

Bonjour,

Merci pour le retour.
Je viens de réduire la longueur de fil, j’ai un peu moins de 15cm.
Les pullup de ma carte sont retirées, il y a juste celle du raspberry.
J’ai checké la fréquence, elle était à 62KHz, j’ai fouillé et trouvé qu’avec une histoire de clock interne il y a avait un facteur 1.6 là dessus, j’ai donc configuré à 160KHz, et là j’ai bien 100KHz.
Les signaux sont bien à 3V3.

Résultat identique…

Je ne comprends pas. Je vais essayer de raccourcir encore les fils…

I got it!

J’ai analysé la trame que j’envoyais, je n’avais pas de ack de l’esclave, je n’avais pas la bonne adresse de communication…:persevere: merci les doc.
Merci pour votre aide en tout cas!

Bonjour,

Bravo, c’est pas du dépannage basique :+1: .
Vous avez du matériel spécialisé pour faire ce genre d’analyse ?
Pouvez vous nous dire en qqs mots avec quoi et comment on procède ?
Merci.

A+

Hello,

Yes, je suis ingénieur électronicien, pas le choix pour analyser physiquement ce qu’il se passe sur les lignes, faut un oscilloscope 2 voies, minimum 1MHz pour analyser à 100KHz le bus I2C, 4MHz pour du 400KHz.

En tout cas c’est bon à savoir qu’un problème dans l’adressage retournera ce type d’erreur.