třída I2S – protokol sběrnice Inter-IC Sound¶
Třída I2S řídí sběrnici Inter-IC Sound (I2S) v režimu řadiče – MCU generuje bitové hodiny (SCK) a hodiny výběru slova (WS) a vyměňuje data vzorků po lince SD. Ovladač podporuje průběžné DMA na pozadí, takže strana Pythonu musí pouze udržovat naplněný interní buffer vzorků. Režimy periferie / pouze přijímač nejsou podporovány.
Dostupné na STM32 OpenMV kamerách, které mají zapojenou periferii I2S, a na OpenMV Cam RT1062. Není vystaveno na OpenMV Cam AE3 (port alif).
I2S(2) na STM32 OpenMV kamerách sdílí piny se SPI(2) – bitové hodiny na P2 (SCK), výběr slova na P3 (NSS) a linka sériových dat se řídí konvencí směru dat SPI: TX používá P0 (MOSI), RX používá P1 (MISO).
Příklad – výstup (TX). Vytvoření sběrnice TX pro řízení externího audio DAC při 44,1 kHz, 16bitové mono vzorky, se zálohovacím DMA bufferem o velikosti 16384 bajtů (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,
)
Příklad – vstup (RX). Vytvoření sběrnice RX, která zachytává z mikrofonu při 22,05 kHz, 32bitové stereo (levý + pravý prokládaný), se zálohovacím DMA bufferem o velikosti 16384 bajtů (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,
)
Přenosové metody lze používat ve třech stylech:
Blokující – write() a readinto() se vrátí až po dokončení operace:
num_written = audio_out.write(buf) # blocks until buf is drained
num_read = audio_in.readinto(buf) # blocks until buf is filled
Neblokující – nainstalujte callback pomocí irq() a přenosové metody se vrátí okamžitě. Callback běží z plánovače MicroPythonu, když DMA vyprázdní buffer TX nebo naplní buffer RX:
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 – I2S je stream a lze jej obalit pomocí 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)¶
Vytvoří objekt I2S s daným id:
ididentifikuje konkrétní sběrnici I2S; je specifické pro desku a port
Parametry pouze pro klíčová slova, které jsou podporovány na všech portech:
sckje objekt pinu pro linku sériových hodinwsje objekt pinu pro linku výběru slovasdje objekt pinu pro linku sériových datmckje objekt pinu pro linku hlavních hodin; frekvence hlavních hodin je vzorkovací frekvence * 256modeurčuje příjem nebo vysíláníbitsurčuje velikost vzorku (bity), 16 nebo 32formaturčuje formát kanálu, STEREO nebo MONOrateurčuje vzorkovací frekvenci zvuku (Hz); jedná se o frekvenci signáluwsibufurčuje délku interního bufferu (bajty)
Na všech portech běží DMA průběžně na pozadí a umožňuje uživatelským aplikacím provádět jiné operace, zatímco se data vzorků přenášejí mezi interním bufferem a periferní jednotkou I2S. Zvětšení velikosti interního bufferu může prodloužit dobu, po kterou mohou uživatelské aplikace provádět operace mimo I2S před podtečením (např. metoda
write) nebo přetečením (např. metodareadinto).Metody¶
- init(*, sck: Pin, ws: Pin, sd: Pin, mck: Pin | None = None, mode: int, bits: int, format: int, rate: int, ibuf: int) None¶
popisy argumentů viz Konstruktor
- readinto(buf: bytearray) int¶
Načte audio vzorky do bufferu určeného pomocí
buf.bufmusí podporovat protokol bufferu, například bytearray nebo array. Pořadí bajtů „buf“ je little-endian. Pro formát Stereo předchází vzorek levého kanálu vzorku pravého kanálu. Pro formát Mono se používají data vzorku levého kanálu. Vrací počet načtených bajtů
- write(buf: bytes) int¶
Zapíše audio vzorky obsažené v
buf.bufmusí podporovat protokol bufferu, například bytearray nebo array. Pořadí bajtů „buf“ je little-endian. Pro formát Stereo předchází vzorek levého kanálu vzorku pravého kanálu. Pro formát Mono se data vzorku zapisují do pravého i levého kanálu. Vrací počet zapsaných bajtů
- irq(handler: Callable[[I2S], None]) None¶
Nastaví callback.
handlerje volán, když jebufvyprázdněn (metodawrite) nebo se zaplní (metodareadinto). Nastavení callbacku změní metodywriteareadintona neblokující operaci.handlerje volán v kontextu plánovače MicroPythonu.
- static shift(*, buf: bytearray, bits: int, shift: int) None¶
bitový posun všech vzorků obsažených v
buf.bitsurčuje velikost vzorku v bitech.shifturčuje počet bitů, o které se má každý vzorek posunout. Kladná hodnota pro posun vlevo, záporná pro posun vpravo. Typicky se používá pro řízení hlasitosti. Každý bitový posun mění hlasitost vzorku o 6 dB.
Konstanty¶