מחלקה I2S – פרוטוקול אפיק הקול Inter-IC Sound¶
המחלקה I2S מנהלת אפיק Inter-IC Sound (I2S) במצב בקר – ה-MCU מייצר את שעון הביטים (SCK) ואת שעון בחירת המילה (WS) ומחליף נתוני דגימה בקו SD. מנהל ההתקן תומך ב-DMA רציף ברקע כך שצד Python צריך רק לדאוג להזין את חוצץ הדגימות הפנימי. מצבי התקן היקפי / קליטה בלבד אינם נתמכים.
זמין במצלמות STM32 OpenMV שמחווטות התקן היקפי I2S וב-OpenMV Cam RT1062. אינו נחשף ב-OpenMV Cam AE3 (פורט alif).
I2S(2) במצלמות STM32 OpenMV חולק את הפינים שלו עם SPI(2) – שעון הביטים על P2 (SCK), בחירת המילה על P3 (NSS), וקו הנתונים הסדרתי עוקב אחר מוסכמת כיוון הנתונים של SPI: TX משתמש ב-P0 (MOSI), RX משתמש ב-P1 (MISO).
דוגמה – פלט (TX). בנו אפיק TX להנעת DAC שמע חיצוני בקצב 44.1 kHz, דגימות מונו של 16 ביט, עם חוצץ גיבוי DMA בגודל 16384 בתים (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,
)
דוגמה – קלט (RX). בנו אפיק RX שלוכד ממיקרופון בקצב 22.05 kHz, סטריאו של 32 ביט (שמאל + ימין משולבים), עם חוצץ גיבוי DMA בגודל 16384 בתים (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,
)
ניתן להשתמש בשיטות ההעברה בשלושה אופנים:
חוסם – write() ו-readinto() חוזרים רק לאחר שהפעולה הושלמה:
num_written = audio_out.write(buf) # blocks until buf is drained
num_read = audio_in.readinto(buf) # blocks until buf is filled
לא חוסם – התקינו פונקציית callback באמצעות irq() ושיטות ההעברה חוזרות מיד. פונקציית ה-callback רצה מתזמן MicroPython כאשר ה-DMA מרוקן את חוצץ ה-TX או ממלא את חוצץ ה-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
asyncio – I2S הוא stream וניתן לעטוף אותו באמצעות 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)
בנאי¶
- 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)¶
בנו אובייקט I2S בעל ה-id הנתון:
idמזהה אפיק I2S מסוים; הוא ספציפי ללוח ולפורט
פרמטרים שהם מילת מפתח בלבד ונתמכים בכל הפורטים:
sckהוא אובייקט פין עבור קו השעון הסדרתיwsהוא אובייקט פין עבור קו בחירת המילהsdהוא אובייקט פין עבור קו הנתונים הסדרתיmckהוא אובייקט פין עבור קו שעון המאסטר; תדר שעון המאסטר הוא קצב הדגימה * 256modeמציין קליטה או שידורbitsמציין את גודל הדגימה (ביטים), 16 או 32formatמציין את פורמט הערוץ, STEREO או MONOrateמציין את קצב דגימת השמע (Hz); זהו התדר של אות ה-wsibufמציין את אורך החוצץ הפנימי (בתים)
בכל הפורטים, ה-DMA רץ ברציפות ברקע ומאפשר ליישומי המשתמש לבצע פעולות אחרות בזמן שנתוני הדגימה מועברים בין החוצץ הפנימי ויחידת ההתקן ההיקפי של I2S. הגדלת גודל החוצץ הפנימי יכולה להגדיל את הזמן שבו יישומי המשתמש יכולים לבצע פעולות שאינן I2S לפני תת-זרימה (למשל שיטת
write) או גלישה (למשל שיטתreadinto).שיטות¶
- init(*, sck: Pin, ws: Pin, sd: Pin, mck: Pin | None = None, mode: int, bits: int, format: int, rate: int, ibuf: int) None¶
ראו את הבנאי לתיאורי הארגומנטים
- readinto(buf: bytearray) int¶
קוראים דגימות שמע אל החוצץ שמצוין על ידי
buf.bufחייב לתמוך בפרוטוקול החוצץ, כגון bytearray או array. סדר הבתים של ”buf“ הוא little-endian. עבור פורמט סטריאו, דגימת הערוץ השמאלי קודמת לדגימת הערוץ הימני. עבור פורמט מונו, נעשה שימוש בנתוני הדגימה של הערוץ השמאלי. מחזיר את מספר הבתים שנקראו
- write(buf: bytes) int¶
כותבים דגימות שמע הכלולות ב-
buf.bufחייב לתמוך בפרוטוקול החוצץ, כגון bytearray או array. סדר הבתים של ”buf“ הוא little-endian. עבור פורמט סטריאו, דגימת הערוץ השמאלי קודמת לדגימת הערוץ הימני. עבור פורמט מונו, נתוני הדגימה נכתבים גם לערוץ הימני וגם לשמאלי. מחזיר את מספר הבתים שנכתבו
קבועים¶