klasa I2S – protokol Inter-IC Sound sabirnice

Klasa I2S upravlja Inter-IC Sound (I2S) sabirnicom u kontrolerskom načinu rada – MCU generira taktni signal bita (SCK) i taktni signal odabira riječi (WS) te razmjenjuje uzorke podataka na liniji SD. Upravljački program podržava kontinuirani DMA u pozadini, tako da Python strana samo treba održavati napunjenim interni međuspremnik uzoraka. Periferni način rada / način rada samo za primanje nisu podržani.

Dostupno na STM32 OpenMV kamerama koje povezuju I2S periferiju te na OpenMV Cam RT1062. Nije izloženo na OpenMV Cam AE3 (alif port).

I2S(2) na STM32 OpenMV kamerama dijeli svoje pinove s SPI(2) – taktni signal bita na P2 (SCK), odabir riječi na P3 (NSS), a serijska linija podataka slijedi konvenciju smjera SPI podataka: TX koristi P0 (MOSI), RX koristi P1 (MISO).

Primjer – izlaz (TX). Konstruirajte TX sabirnicu za upravljanje vanjskim audio DAC-om pri 44,1 kHz, 16-bitni mono uzorci, s DMA pozadinskim međuspremnikom od 16384 bajta (16 KiB):

from machine import I2S, Pin

audio_out = I2S(
    2,
    sck=Pin("P2"), ws=Pin("P3"), sd=Pin("P0"),
    mode=I2S.TX,
    bits=16,
    format=I2S.MONO,
    rate=44100,
    ibuf=16384,
)

Primjer – ulaz (RX). Konstruirajte RX sabirnicu koja hvata signal s mikrofona pri 22,05 kHz, 32-bitni stereo (lijevi + desni isprepleteni), s DMA pozadinskim međuspremnikom od 16384 bajta (16 KiB):

from machine import I2S, Pin

audio_in = I2S(
    2,
    sck=Pin("P2"), ws=Pin("P3"), sd=Pin("P1"),
    mode=I2S.RX,
    bits=32,
    format=I2S.STEREO,
    rate=22050,
    ibuf=16384,
)

Metode prijenosa mogu se koristiti u tri stila:

Blokirajućewrite() i readinto() vraćaju vrijednost tek nakon što se operacija dovrši:

num_written = audio_out.write(buf)   # blocks until buf is drained
num_read = audio_in.readinto(buf)    # blocks until buf is filled

Neblokirajuće – instalirajte povratni poziv pomoću irq(), a metode prijenosa vraćaju vrijednost odmah. Povratni poziv izvršava se iz MicroPython rasporeda kada DMA isprazni TX međuspremnik ili napuni RX međuspremnik:

audio_out.irq(i2s_callback)
num_written = audio_out.write(buf)   # returns immediately

audio_in.irq(i2s_callback)
num_read = audio_in.readinto(buf)    # returns immediately

asyncioI2S je tok i može se umotati u asyncio.StreamReader / asyncio.StreamWriter

swriter = asyncio.StreamWriter(audio_out)
swriter.write(buf)
await swriter.drain()

sreader = asyncio.StreamReader(audio_in)
num_read = await sreader.readinto(buf)

Konstruktor

class machine.I2S(id: int, *, sck: Pin, ws: Pin, sd: Pin, mck: Pin | None = None, mode: int, bits: int, format: int, rate: int, ibuf: int)

Konstruira I2S objekt zadanog id-a:

  • id identificira određenu I2S sabirnicu; ovisi o ploči i portu

Parametri samo s ključnom riječi koji su podržani na svim portovima:

  • sck je pin objekt za liniju serijskog takta

  • ws je pin objekt za liniju odabira riječi

  • sd je pin objekt za liniju serijskih podataka

  • mck je pin objekt za liniju glavnog takta; frekvencija glavnog takta je brzina uzorkovanja * 256

  • mode određuje primanje ili odašiljanje

  • bits određuje veličinu uzorka (bitovi), 16 ili 32

  • format određuje format kanala, STEREO ili MONO

  • rate određuje brzinu uzorkovanja zvuka (Hz); to je frekvencija signala ws

  • ibuf određuje duljinu internog međuspremnika (bajtovi)

Na svim portovima DMA radi kontinuirano u pozadini i omogućuje korisničkim aplikacijama izvođenje drugih operacija dok se uzorci podataka prenose između internog međuspremnika i I2S periferne jedinice. Povećanje veličine internog međuspremnika može produljiti vrijeme tijekom kojeg korisničke aplikacije mogu izvoditi operacije koje nisu vezane uz I2S prije podljeva (npr. metoda write) ili preljeva (npr. metoda readinto).

Metode

init(*, sck: Pin, ws: Pin, sd: Pin, mck: Pin | None = None, mode: int, bits: int, format: int, rate: int, ibuf: int) None

opise argumenata potražite u odjeljku Konstruktor

deinit() None

Deinicijalizira I2S sabirnicu

readinto(buf: bytearray) int

Čita audio uzorke u međuspremnik određen s buf. buf mora podržavati protokol međuspremnika, kao što su bytearray ili array. Redoslijed bajtova „buf” je little-endian. Za Stereo format, uzorak lijevog kanala prethodi uzorku desnog kanala. Za Mono format koriste se podaci uzorka lijevog kanala. Vraća broj pročitanih bajtova

write(buf: bytes) int

Zapisuje audio uzorke sadržane u buf. buf mora podržavati protokol međuspremnika, kao što su bytearray ili array. Redoslijed bajtova „buf” je little-endian. Za Stereo format, uzorak lijevog kanala prethodi uzorku desnog kanala. Za Mono format podaci uzorka zapisuju se i u desni i u lijevi kanal. Vraća broj zapisanih bajtova

irq(handler: Callable[[I2S], None]) None

Postavlja povratni poziv. handler se poziva kada se buf isprazni (metoda write) ili napuni (metoda readinto). Postavljanje povratnog poziva mijenja metode write i readinto u neblokirajući način rada. handler se poziva u kontekstu MicroPython rasporeda.

static shift(*, buf: bytearray, bits: int, shift: int) None

bitovni posmak svih uzoraka sadržanih u buf. bits određuje veličinu uzorka u bitovima. shift određuje broj bitova za posmak svakog uzorka. Pozitivno za posmak ulijevo, negativno za posmak udesno. Obično se koristi za kontrolu glasnoće. Svaki bitovni posmak mijenja glasnoću uzorka za 6dB.

Konstante

RX: int

za inicijalizaciju mode I2S sabirnice na primanje

TX: int

za inicijalizaciju mode I2S sabirnice na odašiljanje

STEREO: int

za inicijalizaciju format I2S sabirnice na stereo

MONO: int

za inicijalizaciju format I2S sabirnice na mono