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