klasa I2S – protokol Inter-IC Sound sabirnice¶
Klasa I2S upravlja Inter-IC Sound (I2S) sabirnicom u kontrolerskom načinu rada – MCU generira taktni signal bita (SCK) i taktni signal odabira riječi (WS) te razmjenjuje uzorke podataka na liniji SD. Upravljački program podržava kontinuirani DMA u pozadini, tako da Python strana samo treba održavati napunjenim interni međuspremnik uzoraka. Periferni način rada / način rada samo za primanje nisu podržani.
Dostupno na STM32 OpenMV kamerama koje povezuju I2S periferiju te na OpenMV Cam RT1062. Nije izloženo na OpenMV Cam AE3 (alif port).
I2S(2) na STM32 OpenMV kamerama dijeli svoje pinove s SPI(2) – taktni signal bita na P2 (SCK), odabir riječi na P3 (NSS), a serijska linija podataka slijedi konvenciju smjera SPI podataka: TX koristi P0 (MOSI), RX koristi P1 (MISO).
Primjer – izlaz (TX). Konstruirajte TX sabirnicu za upravljanje vanjskim audio DAC-om pri 44,1 kHz, 16-bitni mono uzorci, s DMA pozadinskim međuspremnikom od 16384 bajta (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,
)
Primjer – ulaz (RX). Konstruirajte RX sabirnicu koja hvata signal s mikrofona pri 22,05 kHz, 32-bitni stereo (lijevi + desni isprepleteni), s DMA pozadinskim međuspremnikom od 16384 bajta (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,
)
Metode prijenosa mogu se koristiti u tri stila:
Blokirajuće – write() i readinto() vraćaju vrijednost tek nakon što se operacija dovrši:
num_written = audio_out.write(buf) # blocks until buf is drained
num_read = audio_in.readinto(buf) # blocks until buf is filled
Neblokirajuće – instalirajte povratni poziv pomoću irq(), a metode prijenosa vraćaju vrijednost odmah. Povratni poziv izvršava se iz MicroPython rasporeda kada DMA isprazni TX međuspremnik ili napuni RX međuspremnik:
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 tok i može se umotati u 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)¶
Konstruira I2S objekt zadanog id-a:
ididentificira određenu I2S sabirnicu; ovisi o ploči i portu
Parametri samo s ključnom riječi koji su podržani na svim portovima:
sckje pin objekt za liniju serijskog taktawsje pin objekt za liniju odabira riječisdje pin objekt za liniju serijskih podatakamckje pin objekt za liniju glavnog takta; frekvencija glavnog takta je brzina uzorkovanja * 256modeodređuje primanje ili odašiljanjebitsodređuje veličinu uzorka (bitovi), 16 ili 32formatodređuje format kanala, STEREO ili MONOrateodređuje brzinu uzorkovanja zvuka (Hz); to je frekvencija signalawsibufodređuje duljinu internog međuspremnika (bajtovi)
Na svim portovima DMA radi kontinuirano u pozadini i omogućuje korisničkim aplikacijama izvođenje drugih operacija dok se uzorci podataka prenose između internog međuspremnika i I2S periferne jedinice. Povećanje veličine internog međuspremnika može produljiti vrijeme tijekom kojeg korisničke aplikacije mogu izvoditi operacije koje nisu vezane uz I2S prije podljeva (npr. metoda
write) ili preljeva (npr. metodareadinto).Metode¶
- init(*, sck: Pin, ws: Pin, sd: Pin, mck: Pin | None = None, mode: int, bits: int, format: int, rate: int, ibuf: int) None¶
opise argumenata potražite u odjeljku Konstruktor
- readinto(buf: bytearray) int¶
Čita audio uzorke u međuspremnik određen s
buf.bufmora podržavati protokol međuspremnika, kao što su bytearray ili array. Redoslijed bajtova „buf” je little-endian. Za Stereo format, uzorak lijevog kanala prethodi uzorku desnog kanala. Za Mono format koriste se podaci uzorka lijevog kanala. Vraća broj pročitanih bajtova
- write(buf: bytes) int¶
Zapisuje audio uzorke sadržane u
buf.bufmora podržavati protokol međuspremnika, kao što su bytearray ili array. Redoslijed bajtova „buf” je little-endian. Za Stereo format, uzorak lijevog kanala prethodi uzorku desnog kanala. Za Mono format podaci uzorka zapisuju se i u desni i u lijevi kanal. Vraća broj zapisanih bajtova
- irq(handler: Callable[[I2S], None]) None¶
Postavlja povratni poziv.
handlerse poziva kada sebufisprazni (metodawrite) ili napuni (metodareadinto). Postavljanje povratnog poziva mijenja metodewriteireadintou neblokirajući način rada.handlerse poziva u kontekstu MicroPython rasporeda.
- static shift(*, buf: bytearray, bits: int, shift: int) None¶
bitovni posmak svih uzoraka sadržanih u
buf.bitsodređuje veličinu uzorka u bitovima.shiftodređuje broj bitova za posmak svakog uzorka. Pozitivno za posmak ulijevo, negativno za posmak udesno. Obično se koristi za kontrolu glasnoće. Svaki bitovni posmak mijenja glasnoću uzorka za 6dB.
Konstante¶