K210(SiPEED MaixBit)MicroPython使用参考(十、MAX98357A的I2S驱动)

11 篇文章 8 订阅

1.MAX98357A是美信(已被ADI收购)出品的数字脉冲编码调制(PCM)输入D类功率放大器,可提供AB类音频性能,同时具有D类的效率。器件在I2S模式下可提供最大15dB的增益。原理框图和时序图分别如下:

 

 此器件还有SD和GAIN两个引脚,功能及配置方法如下:

2.以下是完整的驱动代码,K210(SiPEED MaixBit)的34,35,33引脚分别接MAX98357A的DIN,BCLK,LRC脚。volume( )用来设置音量大小,取值范围为0到100。MAX98357A在4-8Ω负载下最大可以提供3W的输出功率,由于其为I2S格式,需设置为I2S.STANDARD_MODE(即PHILIPS格式)。

from fpioa_manager import fm
from Maix import I2S, GPIO
import audio

# register i2s(i2s0) pin
fm.register(34, fm.fpioa.I2S0_OUT_D1, force=True)
fm.register(35, fm.fpioa.I2S0_SCLK, force=True)
fm.register(33, fm.fpioa.I2S0_WS, force=True)

# init i2s(i2s0)
wav_dev = I2S(I2S.DEVICE_0)

# init audio
player = audio.Audio(path="/sd/test.wav")
player.volume(30)

# read audio info
wav_info = player.play_process(wav_dev)
print("wav file head information: ", wav_info)

# config i2s according to audio info
wav_dev.channel_config(wav_dev.CHANNEL_1, I2S.TRANSMITTER, resolution=I2S.RESOLUTION_32_BIT,
                       cycles=I2S.SCLK_CYCLES_32, align_mode=I2S.STANDARD_MODE)
wav_dev.set_sample_rate(wav_info[1])

# loop to play audio
while True:
    ret = player.play()
    if ret == None:
        print("format error")
        break
    elif ret == 0:
        print("end")
        break
player.finish()

3.需要注意的是,K210必须使用带语音功能的固件,即文件名含有“speech”字样,例如:https://cn.dl.sipeed.com/fileList/MAIX/MaixPy/release/master/maixpy_v0.6.2_83_gf0280db50/maixpy_v0.6.2_83_gf0280db50_minimum_speech_with_ide_support.bin所播放的wav文件,可以是自行录制的,录制方法:K210(SiPEED MaixBit)MicroPython使用参考(五、录音到SD卡)_SDAU2005的博客-CSDN博客_k210 sd卡也可在此下载:k210的音频测试文件,wav格式-Python文档类资源-CSDN文库,其中test.wav是左声道、右声道、立体声测试文件,music.wav是音乐音频测试文件,文件头信息分别如下:

4.目前市面上主要有两种MAX98357A模块在售卖,如下图所示,两者功能、使用方法一致,仅外形颜色尺寸存在差异。实际上,MAX98357A是少有的具有功放的I2S语音DAC,且效率很高,体积也小,特别适用于便携式设备,个人认为值得强烈推荐,目前的问题是价格略高,期待国产替代。

5.Maixduino版本的K210音频输出DAC芯片为PT8211,与此引脚、功能兼容的有TM8211,故而,MaixBit也可接载TM8211,不过需要设置align_mode=I2S.RIGHT_JUSTIFYING_MODE,实际上align_mode=I2S.LEFT_JUSTIFYING_MODE也可工作。不外接功放时RCH、LCH引脚分别接喇叭的正负极,声音很小,但能听见。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是C8T6和K210之间通过串口通信的基本示例代码: C8T6代码: ```c #include <SoftwareSerial.h> SoftwareSerial mySerial(2, 3); // RX, TX void setup() { Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } mySerial.begin(9600); } void loop() { if (mySerial.available()) { Serial.write(mySerial.read()); } if (Serial.available()) { mySerial.write(Serial.read()); } } ``` K210代码: ```c #include <stdio.h> #include <unistd.h> #include "fpioa.h" #include "gpiohs.h" #include "sysctl.h" #include "uarths.h" #define UART_BUF_LEN 1024 uint8_t uart_buf[UART_BUF_LEN]; int main(void) { /* 初始化 UART */ uarths_init(); /* 设置 GPIOHS 端口 */ fpioa_set_function(5, FUNC_UARTHS_RX); fpioa_set_function(6, FUNC_UARTHS_TX); /* 初始化 GPIOHS */ gpiohs_set_drive_mode(6, GPIO_DM_OUTPUT); gpiohs_set_pin(6, GPIO_PV_HIGH); /* 循环读取串口数据 */ while (1) { /* 读取串口数据 */ size_t len = uarths_read(uart_buf, UART_BUF_LEN); /* 将读取到的数据回传 */ if (len > 0) { uarths_send_data(uart_buf, len); } } return 0; } ``` 在此示例中,C8T6使用SoftwareSerial库来创建一个虚拟串口,将数据从真实串口转发到虚拟串口,再从虚拟串口将数据转发回真实串口。K210使用uarths库来初始化UART,并通过fpioa库将GPIOHS端口与UART端口相连。在循环中,K210从UART读取数据,并将数据回传。注意,需要将C8T6的RX引脚K210的TX引脚相连,C8T6的TX引脚K210的RX引脚相连。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SDAU2005

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值