I2S osztály – Inter-IC Sound buszprotokoll

Az I2S osztály egy Inter-IC Sound (I2S) buszt vezérel kontroller módban – az MCU generálja a bitórajelet (SCK) és a szóválasztó órajelet (WS), valamint mintaadatokat cserél az SD vonalon. A meghajtó támogatja a folyamatos háttér-DMA-t, így a Python oldalnak csak a belső mintapuffer feltöltéséről kell gondoskodnia. A periféria- / csak-vevő módok nem támogatottak.

Elérhető azokon az STM32 OpenMV kamerákon, amelyek I2S perifériát kötnek be, valamint az OpenMV Cam RT1062 modellen. Az OpenMV Cam AE3 (alif port) nem teszi elérhetővé.

Az I2S(2) az STM32 OpenMV kamerákon megosztja a lábait az SPI(2)-vel – a bitórajel a P2 lábon (SCK), a szóválasztás a P3 lábon (NSS), a soros adatvonal pedig az SPI adatiránykonvencióját követi: a TX a P0 lábat (MOSI), az RX a P1 lábat (MISO) használja.

Példa – kimenet (TX). Hozz létre egy TX buszt egy külső audio DAC meghajtásához 44,1 kHz-en, 16 bites mono mintákkal, 16384 bájtos (16 KiB) DMA háttérpufferrel:

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,
)

Példa – bemenet (RX). Hozz létre egy RX buszt, amely egy mikrofonról rögzít 22,05 kHz-en, 32 bites sztereóban (bal + jobb egymásba fűzve), 16384 bájtos (16 KiB) DMA háttérpufferrel:

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,
)

Az átviteli metódusok háromféle stílusban használhatók:

Blokkoló – a write() és a readinto() csak akkor tér vissza, amikor a művelet befejeződött:

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

Nem blokkoló – telepíts egy visszahívást az irq() metódussal, és az átviteli metódusok azonnal visszatérnek. A visszahívás a MicroPython ütemezőből fut le, amikor a DMA kiüríti a TX puffert vagy feltölti az RX puffert:

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

asyncio – az I2S egy adatfolyam, amelyet az asyncio.StreamReader / asyncio.StreamWriter becsomagolhat:

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)

Hozz létre egy I2S objektumot az adott azonosítóval:

  • az id egy adott I2S buszt azonosít; kártyától és porttól függő

Minden porton támogatott, csak kulcsszóként megadható paraméterek:

  • az sck a soros órajel vonal láb objektuma

  • a ws a szóválasztó vonal láb objektuma

  • az sd a soros adatvonal láb objektuma

  • az mck a fő órajel vonal láb objektuma; a fő órajel frekvenciája a mintavételezési ráta * 256

  • a mode a vételt vagy az adást adja meg

  • a bits a mintaméretet (bit) adja meg, 16 vagy 32

  • a format a csatornaformátumot adja meg, STEREO vagy MONO

  • a rate az audio mintavételezési rátát (Hz) adja meg; ez a ws jel frekvenciája

  • az ibuf a belső puffer hosszát (bájt) adja meg

Minden porton a DMA folyamatosan fut a háttérben, és lehetővé teszi, hogy a felhasználói alkalmazások más műveleteket végezzenek, miközben a mintaadatok a belső puffer és az I2S perifériaegység között áthaladnak. A belső puffer méretének növelése megnövelheti azt az időt, ameddig a felhasználói alkalmazások nem I2S műveleteket végezhetnek alulcsordulás (pl. a write metódus) vagy túlcsordulás (pl. a readinto metódus) bekövetkezte előtt.

Metódusok

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

az argumentumok leírását lásd a Konstruktornál

deinit() None

Az I2S busz deinicializálása

readinto(buf: bytearray) int

Audio minták beolvasása a buf által megadott pufferbe. A buf-nak támogatnia kell a pufferprotokollt, például bytearray vagy array. A „buf” bájtsorrendje little-endian. Sztereó formátum esetén a bal csatorna mintája megelőzi a jobb csatorna mintáját. Mono formátum esetén a bal csatorna mintaadatait használja. Visszaadja a beolvasott bájtok számát

write(buf: bytes) int

A buf-ban található audio minták kiírása. A buf-nak támogatnia kell a pufferprotokollt, például bytearray vagy array. A „buf” bájtsorrendje little-endian. Sztereó formátum esetén a bal csatorna mintája megelőzi a jobb csatorna mintáját. Mono formátum esetén a mintaadatokat a jobb és a bal csatornára is kiírja. Visszaadja a kiírt bájtok számát

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

Visszahívás beállítása. A handler akkor hívódik meg, amikor a buf kiürül (write metódus) vagy megtelik (readinto metódus). A visszahívás beállítása a write és readinto metódusokat nem blokkoló működésre váltja. A handler a MicroPython ütemező kontextusában fut le.

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

a buf-ban található összes minta bitenkénti eltolása. A bits a mintaméretet adja meg bitben. A shift az egyes minták eltolásának bitszámát adja meg. Pozitív érték balra, negatív érték jobbra tolja. Tipikusan hangerő-szabályozásra használt. Minden egyes bites eltolás 6 dB-lel változtatja meg a minta hangerejét.

Konstansok

RX: int

az I2S busz mode paraméterének vételre inicializálásához

TX: int

az I2S busz mode paraméterének adásra inicializálásához

STEREO: int

az I2S busz format paraméterének sztereóra inicializálásához

MONO: int

az I2S busz format paraméterének monóra inicializálásához