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