189浏览
查看: 189|回复: 0

[ESP8266/ESP32] FireBeetle I2S 接口测试 HT513

[复制链接]
本帖最后由 zoologist 于 2024-11-17 11:09 编辑

HT513 是一款国产的D类单声道I2S 功放芯片。特别之处在于它支持通过 I2C 接口控制输出音量,因此可以在保证输出效果的情况下极大简化软件设计。

首先设计一个HT513的功能板,电路图如下:‘

FireBeetle I2S 接口测试 HT513图3

PCB设计如下:
FireBeetle I2S 接口测试 HT513图4

焊接完成后,可以直接在面包板上使用。

这次测试DFRobotFireBeetle 通过 I2S 接口发送音频数据给 HT513, 最终通过喇叭将音频播放出来:

FireBeetle I2S 接口测试 HT513图1

  
HT513模块
  
FireBeetle
说明

说明
FireBeetle
HT513模块
GND
GND
数字电源
3V3
VCC33
SD#
N/A
接地关闭功放
GND
GND
SDA
IO21
I2C 数据
芯片错误
N/A
FAULT
SCL
IO22
I2C 时钟
模拟参考电压
N/A
BYPASS
MCK
IO0
I2S主时钟
功放负输出
N/A
LOUTN 接喇叭
BCLK
14
I2S串行时钟
GND
GND
DIN
18
I2S数据
功率电源
VCC
PVDD
LRCLK
15
帧时钟
功放正输出
N/A
LOUTP 接喇叭

测试使用 AudioTools 库(Arduino-audio-tools-1.0.0)。测试的代码是基于这个库自带的两个例程,一个是生成正弦波送至I2S接口(streams-generator-i2s),我们在这里测试评估 HT513音量调整的功能;另外一个是播放存储在 Flash 中的WAV文件(streams-memory_raw-i2)。在例子的寄存上增加对于 HT513初始化设定的代码。关键部分如下:
  1. #define HT513_ADDR_L 0x6c
  2. /**
  3.    @brief  ht513写寄存器
  4.    @param  addr 寄存器地址
  5.    @param  val 要写的值
  6.    @retval None
  7. */
  8. void HT513_WriteOneByte(uint8_t addr, uint8_t val)
  9. {
  10.   Wire.beginTransmission(HT513_ADDR_L);
  11.   Wire.write(addr);
  12.   Wire.write(val);
  13.   Wire.endTransmission(true);
  14. }
  15. /**
  16.    @brief  ht513读寄存器
  17.    @param  addr 寄存器地址
  18.    @retval 读取到的寄存器值
  19. */
  20. uint8_t HT513_ReadOneByte(uint8_t addr)
  21. {
  22.   uint8_t temp = 0;
  23.   Wire.beginTransmission(HT513_ADDR_L);
  24.   Wire.write(addr);
  25.   Wire.endTransmission(true);
  26.   Wire.requestFrom(HT513_ADDR_L, (uint8_t)1);
  27.   temp = Wire.read();
  28.   return temp;
  29. }
复制代码
Setup() 中加入下面的代码:

  1. Wire.begin(21,22);
  2.   //  设置 SD 为LOW
  3.   HT513_WriteOneByte(0x12,0b11110000);
  4.     // 设置数据格式为 I2S, 16Bits
  5.   HT513_WriteOneByte(0x13, 0b00110000);
  6.   // 调整音量
  7.   HT513_WriteOneByte(0x16, 0b10100000);
  8.     //  设置 SD 为LOW
  9.   HT513_WriteOneByte(0x12,0b11110100);
复制代码
其中的HT513_WriteOneByte(0x16,XX) 是调整音量的代码:

FireBeetle I2S 接口测试 HT513图2
换句话说,有了上面的代码就可以完整的发货出HT513的功能了。

最终完整的代码streams-generator-i2sHT513.ino如下:

  1. #include <Wire.h>
  2. #include "AudioTools.h"
  3. AudioInfo info(44100, 1, 16);
  4. SineWaveGenerator<int16_t> sineWave(32000);                // subclass of SoundGenerator with max amplitude of 32000
  5. GeneratedSoundStream<int16_t> sound(sineWave);             // Stream generated from sine wave
  6. I2SStream out;
  7. StreamCopy copier(out, sound);                             // copies sound into i2s
  8. #define HT513_ADDR_L 0x6c
  9. /**
  10.    @brief  ht513写寄存器
  11.    @param  addr 寄存器地址
  12.    @param  val 要写的值
  13.    @retval None
  14. */
  15. void HT513_WriteOneByte(uint8_t addr, uint8_t val)
  16. {
  17.   Wire.beginTransmission(HT513_ADDR_L);
  18.   Wire.write(addr);
  19.   Wire.write(val);
  20.   int ack = Wire.endTransmission(true);
  21.   Serial.print("Ack ");
  22.   Serial.println(ack, HEX);
  23. }
  24. /**
  25.    @brief  ht513读寄存器
  26.    @param  addr 寄存器地址
  27.    @retval 读取到的寄存器值
  28. */
  29. uint8_t HT513_ReadOneByte(uint8_t addr)
  30. {
  31.   uint8_t temp = 0;
  32.   Wire.beginTransmission(HT513_ADDR_L);
  33.   Wire.write(addr);
  34.   Wire.endTransmission(false);
  35.   uint8_t bytesReceived = 0;
  36.   bytesReceived = Wire.requestFrom(HT513_ADDR_L, (uint8_t)1, true);
  37.   if (bytesReceived == 1) {
  38.     temp = Wire.read();
  39.   }
  40.   else {
  41.     Serial.println("Read Error ");
  42.   }
  43.   return temp;
  44. }
  45. // Arduino Setup
  46. void setup(void) {
  47.     Wire.begin(21,22);
  48.   // Open Serial
  49.   Serial.begin(115200);
  50.   while (!Serial);
  51.   AudioLogger::instance().begin(Serial, AudioLogger::Info);
  52.   // start I2S
  53.   Serial.println("starting I2S...");
  54.   auto config = out.defaultConfig(TX_MODE);
  55.   config.copyFrom(info);
  56.   out.begin(config);
  57.   // Setup sine wave
  58.   sineWave.begin(info, N_B4);
  59.   Serial.println("started...");
  60.   int nDevices;
  61.   byte error, address;
  62.   Serial.println("Scanning...");
  63.   nDevices = 0;
  64.   for( address = 1; address < 127; address++ ) {
  65.     Wire.beginTransmission(address);
  66.     error = Wire.endTransmission();
  67.     if (error == 0) {
  68.       Serial.print("I2C device found at address 0x");
  69.       if (address<16) {
  70.         Serial.print("0");
  71.       }
  72.       Serial.println(address,HEX);
  73.       nDevices++;
  74.     }
  75.     else if (error==4) {
  76.       Serial.print("Unknow error at address 0x");
  77.       if (address<16) {
  78.         Serial.print("0");
  79.       }
  80.       Serial.println(address,HEX);
  81.     }   
  82.   }
  83.   if (nDevices == 0) {
  84.     Serial.println("No I2C devices found\n");
  85.   }
  86.   else {
  87.     Serial.println("done\n");
  88.   }
  89.   
  90.   //  设置 SD 为LOW
  91.   HT513_WriteOneByte(0x12, 0b11110000);
  92.   // 设置数据格式为 I2S, 16Bits
  93.   HT513_WriteOneByte(0x13, 0b00110000);
  94.   // 调整音量
  95.   HT513_WriteOneByte(0x16, 0b01111111);
  96.   
  97.   //  设置 SD 为HIGH
  98.   HT513_WriteOneByte(0x12, 0b11110100);
  99.   uint8_t Value = HT513_ReadOneByte(0x12);
  100.   Serial.println("++++++++++++++++");
  101.   Serial.println(Value, HEX);
  102. }
  103. // Arduino loop - copy sound to out
  104. void loop() {
  105.   copier.copy();
  106. }
复制代码

特别注意: HT513 工作时需要 MCLK 信号,因此需要修改库文件 AudioConfig.h

#define PWM_FREQENCY 30000
#define PIN_PWM_START 12
#define PIN_I2S_BCK 14
#define PIN_I2S_WS 15
#define PIN_I2S_DATA_IN 32
#define PIN_I2S_DATA_OUT 18
#define PIN_I2S_MCK 0
#define I2S_USE_APLL true
// Default Setting: The mute pin can be switched actovated by setting it to a gpio (e.g 23). Or you could drive the LED by assigning LED_BUILTIN
#define PIN_I2S_MUTE -1
#define SOFT_MUTE_VALUE 0
#define PIN_CS SS
#define PIN_ADC1 34

本文提到的HT513 测试板电路图和 PCB:



本文使用的测试代码:




工作的视频可以在下面看到:



















您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail