Est-il préférable de faire plusieurs petites demandes i2c ou une plus grande?

Ryan Detzel

Est-il préférable de faire plusieurs petites demandes i2c ou une plus grande?


J’ai quatre registres sur mon esclave (un arduino)

0x00 - device id
0x01 - button state (four buttons)
0x02 - led state (four buttons)
0x03 - led mode (how the leds react to button presses if at all)

Actuellement, pour obtenir une valeur de l’esclave, j’émets une écriture avec une adresse. Cette adresse est stockée dans un pointeur sur l’esclave, puis lorsque la prochaine lecture arrive, je renvoie les données dans le registre à cette adresse de pointeur.

Fondamentalement, à l’adresse 0x48

W 0x48 0x01
R 0x48        ; button state at 0x01
W 0x48 0x02
R 0x48        ; led state at 0x02

Et je le fais encore et encore pour vérifier les changements d’état. Je ne sais pas vraiment pourquoi je l’ai fait de cette façon, une fiche technique ou un article de blog me conduit dans cette direction, mais maintenant je le remets en question. Maintenant, je pense que je devrais simplement sauter les écritures et retourner toutes les valeurs de registre à chaque lecture. Ainsi, une lecture retournerait quatre octets dans cet exemple au lieu d’un.

Est-ce mieux? Cela semble moins sujet aux erreurs, mais je ne sais pas quels coûts sont associés au retour de plusieurs octets, etc.

dandavis

généralement, les lots sont plus efficaces jusqu’à ce qu’ils empêchent d’être trop gros.

Réponses


 linuxfan

Si vous comptez les octets qui vont et viennent:

W 0x48 0x01, R 0x48 (état du bouton + en arrière): 4 octets

W 0x48 0x02, R 0x48 (état + led à 0x02): 4 autres octets

… pour obtenir 2 octets, le bus utilise 8 octets. Donc, pour obtenir 4 octets, le bus en utilisera 16. Certainement, une seule lecture – 5 octets – est un meilleur choix!

Ryan Detzel

Je suppose que la seule fois où cela pourrait avoir un sens dans l’autre sens, c’est si vous ne voulez que certaines données parfois ou si j’ai plus de 32 octets à renvoyer.

linuxfan

@RyanDetzel oui, je pense que oui. Mais la partie sur « plus de 32 octets » n’est peut-être pas vraie. Les eeproms 24cXX peuvent être lues entièrement avec une seule lecture, par exemple. Bien sûr, il existe de nombreux scénarios différents, et en fait, ces eeproms vous permettent d’écrire le pointeur d’adresse, de la même manière que votre question d’origine.

 

#(une, #de, #ou, demandes, Est-il, Faire, grande, I2C, petites, plus, plusieurs, préférable

 

google

Laisser un commentaire

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