luokka I2S – Inter-IC Sound -väyläprotokolla

I2S -luokka ohjaa Inter-IC Sound (I2S) -väylää ohjaintilassa – MCU tuottaa bittikellon (SCK) ja sananvalintakellon (WS) sekä vaihtaa näytedataa SD -linjalla. Ajuri tukee jatkuvaa DMA-siirtoa taustalla, joten Python-puolen täytyy vain pitää sisäinen näytepuskuri täytettynä. Oheislaite- ja pelkän vastaanottimen tiloja ei tueta.

Saatavilla STM32-pohjaisissa OpenMV-kameroissa, joissa on kytketty I2S-oheislaite, sekä OpenMV Cam RT1062:ssa. Ei käytettävissä OpenMV Cam AE3:ssa (alif-portti).

I2S(2) STM32-pohjaisissa OpenMV-kameroissa jakaa nastansa SPI(2) -väylän kanssa – bittikello nastassa P2 (SCK), sananvalinta nastassa P3 (NSS), ja sarjadatalinja noudattaa SPI:n datansuuntakäytäntöä: TX käyttää nastaa P0 (MOSI), RX käyttää nastaa P1 (MISO).

Esimerkki – ulostulo (TX). Muodosta TX-väylä ohjaamaan ulkoista ääni-DAC:ia 44,1 kHz:n, 16-bittisillä mononäytteillä ja 16384 tavun (16 KiB) DMA-tukipuskurilla:

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

Esimerkki – sisääntulo (RX). Muodosta RX-väylä, joka kaappaa mikrofonista 22,05 kHz:n, 32-bittisellä stereolla (vasen + oikea lomitettuna) ja 16384 tavun (16 KiB) DMA-tukipuskurilla:

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

Siirtometodeja voidaan käyttää kolmella tavalla:

Estäväwrite() ja readinto() palaavat vasta, kun operaatio on valmis:

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

Estämätön – asenna takaisinkutsu metodilla irq(), jolloin siirtometodit palaavat välittömästi. Takaisinkutsu suoritetaan MicroPython-ajastimesta, kun DMA tyhjentää TX-puskurin tai täyttää RX-puskurin:

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 on virta (stream) ja se voidaan kääriä asyncio.StreamReader / asyncio.StreamWriter -olioihin:

swriter = asyncio.StreamWriter(audio_out)
swriter.write(buf)
await swriter.drain()

sreader = asyncio.StreamReader(audio_in)
num_read = await sreader.readinto(buf)

Konstruktori

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)

Muodosta annetun id:n mukainen I2S-olio:

  • id yksilöi tietyn I2S-väylän; se on kortti- ja porttikohtainen

Vain avainsanoina annettavat parametrit, joita tuetaan kaikissa porteissa:

  • sck on nasta-olio sarjakellolinjalle

  • ws on nasta-olio sananvalintalinjalle

  • sd on nasta-olio sarjadatalinjalle

  • mck on nasta-olio pääkellolinjalle; pääkellon taajuus on näytteenottotaajuus * 256

  • mode määrittää vastaanoton tai lähetyksen

  • bits määrittää näytteen koon (bittiä), 16 tai 32

  • format määrittää kanavamuodon, STEREO tai MONO

  • rate määrittää äänen näytteenottotaajuuden (Hz); tämä on ws -signaalin taajuus

  • ibuf määrittää sisäisen puskurin pituuden (tavua)

Kaikissa porteissa DMA toimii jatkuvasti taustalla ja antaa käyttäjäsovellusten suorittaa muita operaatioita samalla, kun näytedataa siirretään sisäisen puskurin ja I2S-oheislaiteyksikön välillä. Sisäisen puskurin koon kasvattaminen voi pidentää aikaa, jonka käyttäjäsovellukset voivat suorittaa muita kuin I2S-operaatioita ennen alivuotoa (esim. write -metodi) tai ylivuotoa (esim. readinto -metodi).

Metodit

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

katso argumenttien kuvaukset konstruktorista

deinit() None

Poista I2S-väylän alustus

readinto(buf: bytearray) int

Lue ääninäytteet puskuriin, joka on määritetty argumentilla buf. buf -puskurin on tuettava puskuriprotokollaa, kuten bytearray tai array. ”buf” -tavujärjestys on little-endian. Stereomuodossa vasemman kanavan näyte edeltää oikean kanavan näytettä. Monomuodossa käytetään vasemman kanavan näytedataa. Palauttaa luettujen tavujen määrän

write(buf: bytes) int

Kirjoita buf -puskurin sisältämät ääninäytteet. buf -puskurin on tuettava puskuriprotokollaa, kuten bytearray tai array. ”buf” -tavujärjestys on little-endian. Stereomuodossa vasemman kanavan näyte edeltää oikean kanavan näytettä. Monomuodossa näytedata kirjoitetaan sekä oikeaan että vasempaan kanavaan. Palauttaa kirjoitettujen tavujen määrän

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

Aseta takaisinkutsu. handler -funktiota kutsutaan, kun buf tyhjenee (write -metodi) tai täyttyy (readinto -metodi). Takaisinkutsun asettaminen muuttaa write - ja readinto -metodit estämättömiksi. handler -funktiota kutsutaan MicroPython-ajastimen kontekstissa.

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

buf -puskurin kaikkien näytteiden bittisiirto. bits määrittää näytteen koon bitteinä. shift määrittää, montako bittiä kutakin näytettä siirretään. Positiivinen vasemmalle siirtoon, negatiivinen oikealle siirtoon. Käytetään tyypillisesti äänenvoimakkuuden säätöön. Jokainen bittisiirto muuttaa näytteen voimakkuutta 6 dB.

Vakiot

RX: int

I2S-väylän mode -arvon alustamiseen vastaanottoon

TX: int

I2S-väylän mode -arvon alustamiseen lähetykseen

STEREO: int

I2S-väylän format -arvon alustamiseen stereoksi

MONO: int

I2S-väylän format -arvon alustamiseen monoksi