classe I2C – un protocole série à deux fils¶
I2C est un protocole à deux fils pour communiquer entre appareils. Au niveau physique, il se compose de deux lignes, SCL (horloge) et SDA (données). L’OpenMV Cam ne fournit pas de résistances de tirage embarquées sur l’une ou l’autre ligne – des résistances de tirage externes sont requises à la fois sur SCL et SDA pour que le bus fonctionne.
Les objets I2C sont attachés à un bus spécifique et peuvent être initialisés au moment de la construction ou plus tard via init().
Exemple
from pyb import I2C
i2c = I2C(2) # create on bus 2 (uninitialised)
i2c = I2C(2, I2C.CONTROLLER) # create and init as a controller
i2c.init(I2C.CONTROLLER, baudrate=20000) # init as a controller
i2c.init(I2C.PERIPHERAL, addr=0x42) # init as a peripheral with the given address
i2c.deinit() # turn off the peripheral
L’affichage de l’objet I2C montre sa configuration.
Les méthodes de base sont send() et recv()
i2c.send("abc") # send 3 bytes
i2c.send(0x42) # send a single byte, given by the number
data = i2c.recv(3) # receive 3 bytes
Pour recevoir sur place, créez d’abord un bytearray
data = bytearray(3) # create a buffer
i2c.recv(data) # receive 3 bytes, writing them into data
Vous pouvez spécifier un délai d’expiration (en ms)
i2c.send(b"123", timeout=2000) # timeout after 2 seconds
Un contrôleur doit spécifier l’adresse du destinataire
i2c.init(I2C.CONTROLLER)
i2c.send("123", 0x42) # send 3 bytes to peripheral with address 0x42
i2c.send(b"456", addr=0x42) # keyword for address
Un contrôleur dispose également de ces méthodes
# Check if peripheral 0x42 is ready.
i2c.is_ready(0x42)
# Scan the bus and return a list of responding addresses.
i2c.scan()
# Read 3 bytes from peripheral 0x42 starting at memaddr 2.
i2c.mem_read(3, 0x42, 2)
# Write 3 bytes to peripheral 0x42 at memaddr 2.
i2c.mem_write("abc", 0x42, 2, timeout=1000)
Constructeurs¶
- class pyb.I2C(bus: int | str, *args, **kwargs)¶
Construit un objet I2C sur le
busdonné (un index entier de périphérique, par exemple2pourI2C2). Sans paramètres supplémentaires, l’objet est créé mais non initialisé (il conserve les réglages de bus précédents, le cas échéant) ; si des arguments supplémentaires sont fournis, le bus est initialisé. Voirinit()pour les paramètres disponibles.I2C(2)est câblé aux mêmes broches d’embase sur chaque OpenMV Cam qui exposepyb.I2C(M4 / M7 / H7 / H7 Plus / Pure Thermal) :Signal
Broche d’embase
Notes
SCLP4SDAP5I2C(4)est en outre disponible sur les OpenMV Cam M7, H7, H7 Plus et Pure Thermal, avecSCLsur la broche d’embaseP7etSDAsur la broche d’embaseP8.L’OpenMV Cam N6 n’expose pas
pyb.I2C; utilisez plutôtmachine.I2C.Méthodes¶
- init(mode: int, *, addr: int = 0x12, baudrate: int = 400000, gencall: bool = False, dma: bool = False) None¶
Initialise le bus I2C avec les paramètres donnés :
modedoit valoir soitI2C.CONTROLLERsoitI2C.PERIPHERAL.addrest l’adresse 7 bits (n’a de sens que pour un périphérique).baudrateest la fréquence d’horloge SCL (n’a de sens que pour un contrôleur).gencallindique s’il faut prendre en charge le mode d’appel général.dmaindique s’il faut autoriser l’utilisation du DMA pour les transferts I2C (notez que les transferts DMA ont un timing plus précis mais ne gèrent actuellement pas correctement les erreurs de bus).
La fréquence d’horloge réelle peut être inférieure à la fréquence demandée. Cela dépend du matériel de la plateforme. La fréquence réelle peut être déterminée en affichant l’objet I2C.
- is_ready(addr: int) bool¶
Vérifie si un appareil I2C répond à l’adresse donnée. Valide uniquement en mode contrôleur.
- mem_read(data: int | bytearray, addr: int, memaddr: int, *, timeout: int = 5000, addr_size: int = 8) bytes¶
Lit depuis la mémoire d’un appareil I2C :
datapeut être un entier (nombre d’octets à lire) ou un tampon dans lequel lireaddrest l’adresse de l’appareil I2Cmemaddrest l’emplacement mémoire dans l’appareil I2Ctimeoutest le délai d’expiration en millisecondes à attendre pour la lectureaddr_sizesélectionne la largeur de memaddr : 8 ou 16 bits
Renvoie les données lues. Ceci n’est valide qu’en mode contrôleur.
- mem_write(data: int | bytes | bytearray, addr: int, memaddr: int, *, timeout: int = 5000, addr_size: int = 8) None¶
Écrit dans la mémoire d’un appareil I2C :
datapeut être un entier ou un tampon depuis lequel écrire.addrest l’adresse de l’appareil I2C.memaddrest l’emplacement mémoire dans l’appareil I2C.timeoutest le délai d’expiration en millisecondes à attendre pour l’écriture.addr_sizesélectionne la largeur dememaddr: 8 ou 16 bits.
Valide uniquement en mode contrôleur.
- recv(recv: int | bytearray, addr: int = 0x00, *, timeout: int = 5000) bytes¶
Reçoit des données sur le bus :
recvpeut être un entier, qui est le nombre d’octets à recevoir, ou un tampon mutable, qui sera rempli avec les octets reçusaddrest l’adresse depuis laquelle recevoir (requise uniquement en mode contrôleur)timeoutest le délai d’expiration en millisecondes à attendre pour la réception
Valeur de retour : si
recvest un entier, alors un nouveau tampon contenant les octets reçus, sinon le même tampon que celui passé àrecv.
- send(send: int | bytes | bytearray, addr: int = 0x00, *, timeout: int = 5000) None¶
Envoie des données sur le bus :
sendest la donnée à envoyer (un entier à envoyer, ou un objet tampon).addrest l’adresse à laquelle envoyer (requise uniquement en mode contrôleur).timeoutest le délai d’expiration en millisecondes à attendre pour l’envoi.
Constantes¶