Différences entre versions de « MicroPython-I2C »

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche
Ligne 197 : Ligne 197 :
  
 
{{translate}}
 
{{translate}}
Read into {{fname|buf}} from the slave specified by {{fname|addr}}. The number of bytes read will be the length of buf.  
+
Lit des données depuis l'esclave à l'adresse {{fname|addr}} et stocke les données dans la mémoire tampon {{fname|buf}}. Le nombre d'octets lus sur le bus correspond à la taille de {{fname|buf}}.  
  
If {{fname|stop}} is {{fname|True}} then a STOP condition is generated at the end of the transfer.
+
Si le paramètre {{fname|stop}} est {{fname|True}} alors la condition d'arrêt (STOP) est généré à la fin du transfert I2C.
  
The method returns {{fname|None}}.
+
La méthode retourne {{fname|None}}.
  
* '''addr''' l'adresse depuis laquelle les données seront réceptionnées.
+
* '''addr''' l'adresse de l'esclaver depuis lequel les données seront réceptionnées.
* '''buf'''
+
* '''buf''' la mémoire tampon (type {{fname|bytes}}) dans lequel les donnéees seront écrite. La taille de {{fname|buf}} détermine le nombre d'octets lu sur le bus.
* '''stop'''& xxx .
+
* '''stop''' indique s'il faut générer une condition d'arrêt sur le bus après réception des données.
  
 
==== I2C.writeto(...) ====
 
==== I2C.writeto(...) ====
 
  i2c.writeto(addr, buf, stop=True)
 
  i2c.writeto(addr, buf, stop=True)
  
Write the bytes from {{fname|buf}} (objet de type {{fname|bytes}} to the slave specified by {{fname|addr}}.  
+
Ecrit les octets présents le paramètre {{fname|buf}} (objet de type {{fname|bytes}} vers l'esclave mentionné dans le paramètre {{fname|addr}}.  
  
If a '''NACK''' is received following the write of a byte from buf then the remaining bytes are not sent.  
+
Si un '''NACK''' est récu suite à l'écriture d'un octet de {{fname|buf}} alors le restant des octets n'est pas envoyé sur le bus.  
  
If {{fname|stop}} is {{fname|True}} then a STOP condition is generated at the end of the transfer, even if a '''NACK''' is received.  
+
Si {{fname|stop}} est {{fname|True}} alors la condition d'arrêt (STOP) est généré à la fin du transfert, même si un '''NACK''' est recu durant le transfert.  
  
The function returns the number of '''ACK'''s that were received.
+
La fonction retourne ne nombre de '''ACK''' réceptionné durant le transfert.
  
 
* '''addr''' l'adresse vers laquelle les données seront envoyées.
 
* '''addr''' l'adresse vers laquelle les données seront envoyées.
* '''buf'''  
+
* '''buf''' la mémoire tampon (type {{fname|bytes}}) depuis lequel les données seront lue. La taille de {{fname|buf}} détermine le nombre d'octets envoyé sur le bus.
* '''stop''' xxx .
+
* '''stop''' indique s'il faut générer une condition d'arrêt sur le bus après réception des données.
  
 
=== Opérations mémoire ===
 
=== Opérations mémoire ===

Version du 16 mars 2019 à 16:09


MCHobby investit du temps et de l'argent dans la réalisation de traduction et/ou documentation. C'est un travail long et fastidieux réalisé dans l'esprit Open-Source... donc gratuit et librement accessible.
SI vous aimez nos traductions et documentations ALORS aidez nous à en produire plus en achetant vos produits chez MCHobby.

Introduction

Voila, je me suis mis en tête de supporter quelques breakout I2C d'Adafruit sur la PyBoard. C'est un projet intéressant et captivant.

Cet article reprends différentes notes utilises à ce sujet.

Revoir la définition des finitions https://docs.micropython.org/en/latest/library/machine.I2C.html

Bus I2C en quelques mots

I2C est la contraction de "Inter Integrated Circuit".

Ce dernier permet d'établir des connexions asynchrones entre plusieurs composants intelligents pour partager des informations via un "bus commun".

Si ce bus est utilisé pour permettre à un microcontroleur (PyBoard,Arduino,Raspberry-Pi) de communiquer avec des senseurs (un réseau de senseur), il permet aussi à des microcontrôleurs de communiquer directement ensembles.

  • PyBoard dispose d'une class pour I2C, ce qui rend la mise en oeuvre très facile.
  • Principalement développé pour la Domotique et l'électronique domestique, ce bus est très populaire et donc utilisé par de nombreux composants. Les PC, lecteurs DVD, télévisions, etc disposent généralement d'un tel bus.
  • Le protocole I2C ne requière que 3 fils pour fonctionner et peut être implémenté sur n'importe quel microcontrôleur.
  • La longueur du bus est de l'ordre de 1 mètre... mais il est possible de l'étendre jusqu'à 30 mètres à l'aide d'un simple composant nommé "I2C extender".
  • Il dispose d'un mécanisme d'adressage à la fois simple et efficace permettant à plusieurs senseurs de fonctionner sur un seul bus.
  • Supporte plusieurs maître (Attention: dans ce cas il y a donc risque de collisions).

Quelques documents sur le net:

Les concepts associés au bus I2C

Il y a quelques concepts de base à maîtriser autour de l'I2C:

  • Le concept de "maître et esclave"
  • Le principe d'adressage (adresse unique pour chaque esclave).
  • Le concept de régulation de communication comme "Master Reader" et "Master Writer"

Nous avons rédigé une page d'explication autour du Bus I2C d'Arduino... mais un bus I2C reste avant tout un bus I2C, qu'il soit sur Arduino, PyBoard, Raspberry-Pi, ...

Nous ne saurions que trop vous recommander de parcourir cette page pour vous familiariser avec ces concepts.

Principes I2C

Tlogo-I2C.jpg

Comprendre les principes fondamentaux du bus I2C.

 

Les Bus I2C de la PyBoard

Pour Rappel, les signaux sont:

  • SDA - Signal DATA (donnée) du bus I2C.
  • SCL - Signal CLOCK (horloge) du bus I2C.

Pybv10-I2C-pinout.jpg

Tolérance 5V

Petit rappel, toutes les broches du PyBoard sont tolérantes à 5V sauf PA4 & PA5 (dixit PYBv10b.pdf)

Par conséquent, le bus SPI du skin X n'est pas tolérant à 5 Volts.

La classe I2C

I2C est un protocole de communication 2-fils permettant à des périphérique de communiquer ensembles.

Sur le plan physique, cela consiste en deux fils: SCL et SDA, la ligne d'horloge (SCL) et ligne de donnée (SDA).

Les objets I2C sont créés en étant rattaché spécifiquement sur un bus matériel (en précisant son ID) -OU- sur un bus émulé de façon logiciel (en précisant les 2 broches sda et scl de façon arbitraire).

Le bus peut être initialisé à la création de l'objet --ou-- initialisé plus tard:

Voici quelques exemples:

from machine import I2C

i2c = I2C(1)                         # créé sur le bus 1 de la Pyboard
i2c = I2C( sda=Pin(2), scl=Pin(4) )  # créé sur 2 broches arbitraire d'un l'ESP8266-EVB

# scanne les esclaves disponibles et retourne une list d'adresses 7-bits
i2c.scan()                      

# Ecrire 3 octets vers l'esclave à l'adresse 42 (adresse 7-bits)
i2c.writeto(42, b'123')         

# Lire 4 octets depuis l'esclave à l'adresse 42
i2c.readfrom(42, 4)

# Lire 3 octets à partir de l'adresse mémoire (registre) 8 
# de l'esclave (esclave à l'adresse 42).
i2c.readfrom_mem(42, 8, 3)    

# écrire 1 octet (\x10) à l'adresse mémoire (registre) 2
# de l'esclave (esclave à l'adresse 42)
i2c.writeto_mem(42, 2, b'\x10')

Afficher l'objet i2c vous permet d'avoir des informations à propos de sa configuration.

Constructeur

class machine.I2C(id=-1, *, scl, sda, freq=400000)

Crée et retourne un nouvel objet I2C en utilisant les paramètres suivants:

  • id identifie un périphérique en particulier. La valeur par défaut -1 sélectionne l'implémentation logiciel du bus I2C (BitBang I2C) sur deux broches SDA, SCL arbitraires (fonctionne généralement avec toutes les broches). Les autres valeurs utilisable pour id dépend de l'implémentation des ports sur la carte (dans ce cas, il n'est pas nécessaire de spécifier les paramètres scl et sda).
  • scl doit être un objet Pin spécifiant la broche à utiliser pour SCL (signal d'horloge I2C).
  • sda doit être un objet Pin spécifiant la broche à utiliser pour SDA (signal de donnée).
  • freq est un entier fixant la vitesse maximale du bus (400000 pour 400 KHz).

Sans paramètre additionnel, l'objet I2C est créé mais pas initialisé (il dispose des paramètres de la dernière initialisation du bus, s'il cela est applicable).

Si des paramètres complémentaires sont fourni alors le bus est initialisé. Voyez la méthode init pour les paramètres d'initialisation.

Les broches physique du bus I2C sont:

  • I2C(1) sur la partie X de la carte: (SCL, SDA) = (X9, X10) = (PB6, PB7)
  • I2C(2) sur la partie Y de la carte: (SCL, SDA) = (Y9, Y10) = (PB10, PB11)

Méthodes générales

i2c.deinit()

Désactive le bus I2C (WiPy).

i2c.init(...)

i2c.init(scl, sda, *, freq=400000)

Initialise le bus I2C avec les paramètres suivants:

  • scl : ligne du signal d'horloge SCL du bus I2C, un objet Pin
  • sda : ligne du signal de donnée SDA du bus I2C, un objet Pin
  • freq : la fréquence du signal d'horloge sur le bus I2C.

i2c.scan()

Scanne toutes les adresses du Bus I2C de 0x01 à 0x7f et retourne une liste Python des adresses offrant une réponse.

A noter que certains composant (comme le AM2315) n'offrent pas de réponse et ne sont donc pas détectable par cette méthode.

Hormis ce détail, il s'agit d'une méthode fiable car la plupart des composants répondent.

Méthodes Primitives

Les méthodes suivantes implémentes les primitives pour les opérations maîtres sur le bus I2C et peut être combiné avec n'importe quelle transaction I2C.

Ces fonctions sont mises à disposition si vous avez besoin de contrôler précisément le bus SINON voyez les méthodes standard d'accès au bus I2C (voir ci-dessous).

Ces méthodes ne sont disponibles que pour les bus I2C logiciels.

Le protocole I2C prévoit des conditions de départ (START) et d'arrêt (STOP) qui signal l'envoi d'une nouvelle trame de donnée sur le bus.

Ces conditions correspondent à des niveaux particuliers des signaux SDA et SCL.

Condition START:
correspond au passage du signal SDA du niveau HAUT vers BAS pendant que le signal SCL reste au niveau haut.

Condition STOP:
correspond au passage du signal SDA du niveau BAS vers HAUT pendant que le signal SCL reste au niveau haut.

i2c.start()

Génère une condition de démarrage/début de transaction (START) sur le bus.

Le signal SDA passe au niveau bas pendant que SCL est au niveau haut.

i2c.stop()

Génère une condition d'arrêt (STOP) sur le bus I2C.

Le signal SDA passe au niveau haut pendant que SCL est au niveau haut.

i2c.is_ready(...)

i2c.is_ready(addr)

Vérifie si un périphérique I2C répond sur l'adresse donnée. Uniquement valide pour le mode master.

i2c.meminto(...)

i2c.readinto(buf, nack=True)

Lit des octets depuis le bus, données stockées dans la mémoire tempon buff. Un ACK sera envoyé sur le bus à la réception de chaque octets (sauf le dernier). Lorsque le dernier octet est réceptionné, si nack iest True alors un NACK sera envoyé, sinon ACK sera envoyé (dans ce cas, l'esclave sait que d'autres octets seront lus lors d'un prochain appel).

i2c.write(...)

i2c.write( buf )

Envoi les octets disponibles dans buf sur le bus I2C. Vérifie qu'un ACK est reçu après chaque octet. Cesse la transmission des derniers octets si un NACK est réçu en réponse. La fonction retourne ne nombre d' ACK reçu.

Opérations standard du bus

Les méthodes suivantes implémente les opérations standard du Maître (Leader) du bus I2C. Cela concerne les opération de lecture (read) et d'écriture (write) à destination d'un périphérique Esclave (Suiveur).

I2C.readfrom(...)

i2c.readfrom(addr, nbytes, stop=True)

Lecture de nbytes octets depuis l'esclave identifié par son adresses addr. Si le paramètre stop est True alors la condition d'arrêt (STOP) est générée à la fin du transfert.

Retourne un objet bytes avec les données lue sur le bus.

  • addr est l'adresse du périphérique I2C.
  • nbytes le nombre d'octets à lire.
  • stop placer une condition d'arrêt en fin de transation.

I2C.readfrom_into(...)

i2c.readfrom_into(addr, buf, stop=True)

Modèle:Translate Lit des données depuis l'esclave à l'adresse addr et stocke les données dans la mémoire tampon buf. Le nombre d'octets lus sur le bus correspond à la taille de buf.

Si le paramètre stop est True alors la condition d'arrêt (STOP) est généré à la fin du transfert I2C.

La méthode retourne None.

  • addr l'adresse de l'esclaver depuis lequel les données seront réceptionnées.
  • buf la mémoire tampon (type bytes) dans lequel les donnéees seront écrite. La taille de buf détermine le nombre d'octets lu sur le bus.
  • stop indique s'il faut générer une condition d'arrêt sur le bus après réception des données.

I2C.writeto(...)

i2c.writeto(addr, buf, stop=True)

Ecrit les octets présents le paramètre buf (objet de type bytes vers l'esclave mentionné dans le paramètre addr.

Si un NACK est récu suite à l'écriture d'un octet de buf alors le restant des octets n'est pas envoyé sur le bus.

Si stop est True alors la condition d'arrêt (STOP) est généré à la fin du transfert, même si un NACK est recu durant le transfert.

La fonction retourne ne nombre de ACK réceptionné durant le transfert.

  • addr l'adresse vers laquelle les données seront envoyées.
  • buf la mémoire tampon (type bytes) depuis lequel les données seront lue. La taille de buf détermine le nombre d'octets envoyé sur le bus.
  • stop indique s'il faut générer une condition d'arrêt sur le bus après réception des données.

Opérations mémoire

Some I2C devices act as a memory device (or set of registers) that can be read from and written to. In this case there are two addresses associated with an I2C transaction: the slave address and the memory address. The following methods are convenience functions to communicate with such devices.

I2C.readfrom_mem(...)

I2C.readfrom_mem(addr, memaddr, nbytes, *, addrsize=8)

Read nbytes from the slave specified by addr starting from the memory address specified by memaddr.

The argument addrsize specifies the address size in bits.

Returns a bytes object with the data read.

I2C.readfrom_mem_into(...)

i2c.readfrom_mem_into(addr, memaddr, buf, *, addrsize=8)

Read into buf from the slave specified by addr starting from the memory address specified by memaddr.

The number of bytes read is the length of buf.

The argument addrsize specifies the address size in bits (on ESP8266 this argument is not recognised and the address size is always 8 bits).

The method returns None.

I2C.writeto_mem(...)

i2c.writeto_mem(addr, memaddr, buf, *, addrsize=8)

Write buf to the slave specified by addr starting from the memory address specified by memaddr.

The argument addrsize specifies the address size in bits (on ESP8266 this argument is not recognised and the address size is always 8 bits).

The method returns None.

Constantes

  • I2C.MASTER - pour l'initialisation du bus en mode master (maître).
  • I2C.SLAVE - pour l'initialisation du bus en mode slave (esclave).



Source: class I2C écrit par/written by Damien P.George et autres sources.

Traduit/composé par Meurisse D. pour MCHobby.be - Translated/assembled by Meurisse D. for MCHobby.be

Traduit avec l'autorisation de micropython.org - Translated with the authorisation of micropython.org

Toute référence, mention ou extrait de cette traduction doit être explicitement accompagné du texte suivant : «  Traduction par MCHobby (www.MCHobby.be) - Vente de kit et composants » avec un lien vers la source (donc cette page) et ce quelque soit le média utilisé.

L'utilisation commercial de la traduction (texte) et/ou réalisation, même partielle, pourrait être soumis à redevance. Dans tous les cas de figures, vous devez également obtenir l'accord du(des) détenteur initial des droits. Celui de MC Hobby s'arrêtant au travail de traduction proprement dit.