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
idegy 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
scka soros órajel vonal láb objektumaa
wsa szóválasztó vonal láb objektumaaz
sda soros adatvonal láb objektumaaz
mcka fő órajel vonal láb objektuma; a fő órajel frekvenciája a mintavételezési ráta * 256a
modea vételt vagy az adást adja mega
bitsa mintaméretet (bit) adja meg, 16 vagy 32a
formata csatornaformátumot adja meg, STEREO vagy MONOa
rateaz audio mintavételezési rátát (Hz) adja meg; ez awsjel frekvenciájaaz
ibufa 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
writemetódus) vagy túlcsordulás (pl. areadintometó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
- readinto(buf: bytearray) int¶
Audio minták beolvasása a
bufáltal megadott pufferbe. Abuf-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. Abuf-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
handlerakkor hívódik meg, amikor abufkiürül (writemetódus) vagy megtelik (readintometódus). A visszahívás beállítása awriteésreadintometódusokat nem blokkoló működésre váltja. Ahandlera 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. Abitsa mintaméretet adja meg bitben. Ashiftaz 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¶