电路图
根据电路图可以知道数据线、位时钟线、声道选择线分别连到了主控芯片的IO31、32、30,后面根据这三个IO通过I2S协议进行音频数据的输出。
代码
from fpioa_manager import *
from maix import I2S, GPIO
import audio
# 注册I2S0使用的引脚
fm.register(31, fm.fpioa.I2S0_OUT_D1, force=True)
fm.register(32, fm.fpioa.I2S0_SCLK, force=True)
fm.register(30, fm.fpioa.I2S0_WS, force=True)
# 初始化I2S设备(使用I2S0)
wav_dev = I2S(I2S.DEVICE_0)
# 创建音频播放器对象,指定要播放的音频文件
player = audio.Audio(path="nomal.wav")
player.volume(80) # 设置音量为80(范围0~100)
# 播放音频并读取音频文件头信息
wav_info = player.play_process(wav_dev)
print("wav file head information: ", wav_info)
# 根据音频文件的信息配置I2S通道参数
wav_dev.channel_config(
wav_dev.CHANNEL_1, # 使用通道1
I2S.TRANSMITTER, # 发送模式(作为发送端)
resolution=I2S.RESOLUTION_16_BIT, # 分辨率设置为16位
cycles=I2S.SCLK_CYCLES_32, # SCLK每帧32个周期
align_mode=I2S.RIGHT_JUSTIFYING_MODE # 对齐方式为右对齐
)
# 设置I2S采样率,从音频文件头中获取
wav_dev.set_sample_rate(wav_info[1])
# 循环播放音频数据
while True:
ret = player.play() # 开始播放音频块
if ret == None:
print("format error") # 如果返回None表示音频格式错误
break
elif ret == 0:
print("end") # 返回0表示播放结束
break
# 关闭音频播放器资源
player.finish()
I2S(device, mode, ...)
用于创建一个 I2S 设备对象,通过它可以配置和控制 I2S 接口,通常用于连接音频 DAC、ADC 或音频编解码芯片。
| int | 指定使用的 I2S 设备编号,通常是 |
| int | 工作模式,默认是 |
audio.Audio(path=None, is_file=True)
用于音频播放的核心类,主要用于加载和播放 .wav
格式的音频文件。它是 MaixPy 提供的高级音频接口,封装了对 I2S 接口的操作,简化了音频播放流程。
| str | 要播放的音频文件路径,如: |
| bool | 是否是文件,默认为 |
play_process(i2s_dev)
是 MaixPy 中 audio.Audio()
类的一个重要方法,它用于 初始化音频播放流程 ,并返回音频文件的元信息(如采样率、位深等)。
|
| 已经初始化好的 I2S 设备对象 |
channel_config(channel, mode, resolution, cycles, align_mode)
是 MaixPy 中 I2S
类的一个核心方法,用于 配置 I2S 接口的音频通道参数。
| int | 使用哪个通道: |
| int | 工作模式: |
| int | 分辨率(每个采样点的位数): |
| int | 一帧有多少个 SCLK 周期: |
| int | 数据对齐方式: |
set_sample_rate(sample_rate)
I2S
类的一个方法,用于 设置 I2S 接口的音频采样率。
| int | 音频采样率,单位为 Hz(赫兹),例如:8000, 16000, 44100 等 |
play()
audio.Audio()
类的一个方法,用于 播放音频文件中的数据块(chunk) 。它不是一次性播放整个音频文件,而是以流式方式分段读取和播放 .wav
文件的内容。
返回值含义
| 播放完成(已到达文件末尾) |
| 出错(如文件格式错误、I2S 初始化失败等) |
| 成功播放一个音频块,继续调用 |
finish()
用于 结束音频播放并释放相关资源 。它通常在音频播放完成后调用,确保音频文件正确关闭、缓冲区释放、I2S 接口停止工作。
使用
运行前将需要使用的.waw格式传入SD卡,然后使用canMV IDE运行代码