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

asyncioI2S 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:

  • id identifikuje 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:

  • sck je objekt pinu pro linku sériových hodin

  • ws je objekt pinu pro linku výběru slova

  • sd je objekt pinu pro linku sériových dat

  • mck je objekt pinu pro linku hlavních hodin; frekvence hlavních hodin je vzorkovací frekvence * 256

  • mode určuje příjem nebo vysílání

  • bits určuje velikost vzorku (bity), 16 nebo 32

  • format určuje formát kanálu, STEREO nebo MONO

  • rate určuje vzorkovací frekvenci zvuku (Hz); jedná se o frekvenci signálu ws

  • ibuf urč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ř. metoda readinto).

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

deinit() None

Deinicializuje sběrnici I2S

readinto(buf: bytearray) int

Načte audio vzorky do bufferu určeného pomocí buf. buf musí 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. buf musí 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. handler je volán, když je buf vyprázdněn (metoda write) nebo se zaplní (metoda readinto). Nastavení callbacku změní metody write a readinto na neblokující operaci. handler je 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. bits určuje velikost vzorku v bitech. shift urč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

RX: int

pro inicializaci mode sběrnice I2S na příjem

TX: int

pro inicializaci mode sběrnice I2S na vysílání

STEREO: int

pro inicializaci format sběrnice I2S na stereo

MONO: int

pro inicializaci format sběrnice I2S na mono