class I2C – protocolo série de dois fios¶
I2C é um protocolo de dois fios para comunicação entre dispositivos. Ao nível físico, é constituído por duas linhas, SCL (relógio) e SDA (dados). O OpenMV Cam não fornece resistências de pull-up integradas em nenhuma das linhas – são necessárias resistências de pull-up externas em SCL e SDA para o bus funcionar.
Os objetos I2C estão associados a um bus específico e podem ser inicializados no momento da construção ou posteriormente através de init().
Exemplo:
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
Imprimir o objeto I2C mostra a sua configuração.
Os métodos básicos são send() e 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
Para receber no local, crie primeiro um bytearray
data = bytearray(3) # create a buffer
i2c.recv(data) # receive 3 bytes, writing them into data
Pode especificar um timeout (em ms):
i2c.send(b"123", timeout=2000) # timeout after 2 seconds
Um controlador deve especificar o endereço do destinatário:
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
Um controlador também dispõe destes métodos:
# 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)
Construtores¶
- class pyb.I2C(bus: int | str, *args, **kwargs)¶
Constrói um objeto I2C no
busindicado (um índice inteiro de periférico, por ex.2paraI2C2). Sem parâmetros adicionais, o objeto é criado mas não inicializado (mantém as definições anteriores do bus, se existirem); se forem fornecidos argumentos adicionais, o bus é inicializado. Consulteinit()para os parâmetros disponíveis.I2C(2)está ligado aos mesmos pinos do conector em todos os OpenMV Cam que expõempyb.I2C(M4 / M7 / H7 / H7 Plus / Pure Thermal):Sinal
Pino do conector
Notas
SCLP4SDAP5I2C(4)está adicionalmente disponível no OpenMV Cam M7, H7, H7 Plus e Pure Thermal comSCLno pino do conectorP7eSDAno pino do conectorP8.O OpenMV Cam N6 não expõe
pyb.I2C; utilizemachine.I2Cem alternativa.Métodos¶
- init(mode: int, *, addr: int = 0x12, baudrate: int = 400000, gencall: bool = False, dma: bool = False) None¶
Inicializa o bus I2C com os parâmetros indicados:
modedeve serI2C.CONTROLLERouI2C.PERIPHERAL.addré o endereço de 7 bits (apenas relevante para um periférico).baudrateé a frequência de relógio SCL (apenas relevante para um controlador).gencallindica se o modo general-call deve ser suportado.dmaindica se é permitido o uso de DMA para as transferências I2C (note que as transferências DMA têm temporização mais precisa, mas atualmente não tratam corretamente os erros de bus).
A frequência de relógio real pode ser inferior à frequência pedida. Isto depende do hardware da plataforma. A frequência real pode ser determinada imprimindo o objeto I2C.
- is_ready(addr: int) bool¶
Verifica se um dispositivo I2C responde ao endereço indicado. Válido apenas em modo controlador.
- mem_read(data: int | bytearray, addr: int, memaddr: int, *, timeout: int = 5000, addr_size: int = 8) bytes¶
Lê da memória de um dispositivo I2C:
datapode ser um inteiro (número de bytes a ler) ou um buffer para leraddré o endereço do dispositivo I2Cmemaddré a localização de memória dentro do dispositivo I2Ctimeouté o timeout em milissegundos para aguardar a leituraaddr_sizeseleciona a largura de memaddr: 8 ou 16 bits
Devolve os dados lidos. Válido apenas em modo controlador.
- mem_write(data: int | bytes | bytearray, addr: int, memaddr: int, *, timeout: int = 5000, addr_size: int = 8) None¶
Escreve na memória de um dispositivo I2C:
datapode ser um inteiro ou um buffer a partir do qual escrever.addré o endereço do dispositivo I2C.memaddré a localização de memória dentro do dispositivo I2C.timeouté o timeout em milissegundos para aguardar a escrita.addr_sizeseleciona a largura dememaddr: 8 ou 16 bits.
Válido apenas em modo controlador.
- recv(recv: int | bytearray, addr: int = 0x00, *, timeout: int = 5000) bytes¶
Recebe dados no bus:
recvpode ser um inteiro, que é o número de bytes a receber, ou um buffer mutável, que será preenchido com os bytes recebidosaddré o endereço do qual receber (apenas necessário em modo controlador)timeouté o timeout em milissegundos para aguardar a receção
Valor de retorno: se
recvfor um inteiro, devolve um novo buffer com os bytes recebidos; caso contrário, devolve o mesmo buffer passado emrecv.
- send(send: int | bytes | bytearray, addr: int = 0x00, *, timeout: int = 5000) None¶
Envia dados no bus:
sendsão os dados a enviar (um inteiro a enviar, ou um objeto buffer).addré o endereço para o qual enviar (apenas necessário em modo controlador).timeouté o timeout em milissegundos para aguardar o envio.
Constantes¶