2 -- LuaTools需要PROJECT和VERSION这两个信息
7 本demo当前仅支持ec618系列和ec718系列
10 1. 本demo需要2022.12.21及之后的源码所编译的LuatOS固件
11 2. 本demo若使用外置TTS资源的LuatOS固件, 就必须有外挂的SPI Flash, 起码1M字节, 后面有刷写说明
13 4. 本demo需要音频扩展板, 780E只有I2S输出, 需要codec和PA才能驱动喇叭
14 5. 内置TTS资源的LuatOS最低版本是V1104,且去掉了很多库, 尤其是UI方面的库
16 ## 使用本demo前,如果是外置TTS资源的LuatOS固件, 必须先刷tts.binpkg进行SPI Flash的刷写
18 618系列:https://gitee.com/openLuat/luatos-soc-2022/attach_files
19 718系列:https://gitee.com/openLuat/luatos-soc-2023/attach_files
20 2. 在LuaTools主界面, 用"下载固件"按钮进行下载.
22 4. 下载前选日志模式 4G USB, luatools版本号2.1.85或以上
24 ## SPI Flash布局, 以1M字节为例,供参考:
26 -----------------------------------
28 -----------------------------------
30 -----------------------------------
32 -----------------------------------
35 1. 初始化sfud, 本demo使用SPI0 + GPIO8
42 以780E开发板为例, 需要1.5版本或以上,团购版本均为1.5或以上.
45 https://wiki.luatos.com/chips/air780e/board.html
47 xx脚指开发板pinout图上的顺序编号, 非GPIO编号
52 CLK -- 14脚, GPIO11/SPI0_CLK/LCD_CLK, 时钟. 如果是1.4版本的开发板, 接05脚的GPIO11/UART2_TXD
53 MOSI -- 13脚, GPIO09/SPI0_MOSI/LCD_OUT,主控数据输出
54 MISO -- 11脚, GPIO10/SPI0_MISO/LCD_RS,主控数据输入. 如果是1.4版本的开发板, 接06脚的GPIO10/UART2_RXD
55 CS -- 10脚, GPIO08/SPI0_CS/LCD_CS,片选.
57 注意: 12脚是跳过的, 接线完毕后请检查好再通电!!
61 _G
.sys
= require("sys")
62 _G
.sysplus
= require("sysplus")
65 -- Air780E的AT固件默认会为开机键防抖, 导致部分用户刷机很麻烦
66 if rtos
.bsp() == "EC618" and pm
and pm
.PWK_MODE
then
67 pm
.power(pm
.PWK_MODE
, false)
70 function audio_setup()
71 local bsp
= rtos
.bsp()
72 if bsp
== "EC618" then
73 --Air780E开发板配套+音频扩展板. ES7149
74 --由于音频扩展板的PA是长供电的,有塔塔声音是正常的,做产品的话有额外的参考设计
75 i2s
.setup(0, 0, 0, 0, 0, i2s
.MODE_I2S
)
78 -- i2s.setup(0, 0, 0, 0, 0, i2s.MODE_MSB)
81 -- if audio.setBus then
82 -- audio.setBus(0, audio.BUS_SOFT_DAC)
84 audio
.config(0, 25, 1, 3, 100)
85 elseif bsp
== "EC718P" then
87 pm
.power(pm
.LDO_CTL
, false) --开发板上ES8311由LDO_CTL控制上下电
89 pm
.power(pm
.LDO_CTL
, true) --开发板上ES8311由LDO_CTL控制上下电
91 local multimedia_id
= 0
95 local i2s_sample_rate
= 16000
96 local i2s_bits_per_sample
= 16
97 local i2s_channel_format
= i2s
.MONO_R
98 local i2s_communication_format
= i2s
.MODE_LSB
99 local i2s_channel_bits
= 16
102 local pa_on_level
= 1
104 local power_pin
= 255
105 local power_on_level
= 1
106 local power_delay
= 3
107 local power_time_delay
= 100
112 i2c
.setup(i2c_id
,i2c
.FAST
)
113 i2s
.setup(i2s_id
, i2s_mode
, i2s_sample_rate
, i2s_bits_per_sample
, i2s_channel_format
, i2s_communication_format
,i2s_channel_bits
)
115 audio
.config(multimedia_id
, pa_pin
, pa_on_level
, power_delay
, pa_delay
, power_pin
, power_on_level
, power_time_delay
)
116 audio
.setBus(multimedia_id
, audio
.BUS_I2S
,{chip
= "es8311",i2cid
= i2c_id
, i2sid
= i2s_id
}) --通道0的硬件输出通道设置为I2S
118 audio
.vol(multimedia_id
, voice_vol
)
119 audio
.micVol(multimedia_id
, mic_vol
)
120 --带TM8211的云喇叭开发板参考下面的配置
122 local multimedia_id = 0
125 local i2s_sample_rate = 0
126 local i2s_bits_per_sample = 16
127 local i2s_channel_format = i2s.STEREO
128 local i2s_communication_format = i2s.MODE_MSB
129 local i2s_channel_bits = 16
132 local pa_on_level = 1
134 local power_pin = nil
135 local power_on_level = 1
136 local power_delay = 3
137 local power_time_delay = 0
139 -- local voice_vol = 200 --默认就不放大了
140 i2s.setup(i2s_id, i2s_mode, i2s_sample_rate, i2s_bits_per_sample, i2s_channel_format, i2s_communication_format,i2s_channel_bits)
141 audio.config(multimedia_id, pa_pin, pa_on_level, power_delay, pa_delay, power_pin, power_on_level, power_time_delay)
142 audio.setBus(multimedia_id, audio.BUS_I2S,{chip = "tm8211", i2sid = i2s_id}) --通道0的硬件输出通道设置为I2S
143 -- audio.vol(multimedia_id, voice_vol)
145 elseif bsp
== "AIR105" then
146 -- Air105开发板支持DAC直接输出
147 audio
.config(0, 25, 1, 3, 100)
151 log.info("audio", "尚未支持的BSP")
155 sys
.publish("AUDIO_READY")
159 sys
.taskInit(audio_setup
)
161 local taskName
= "task_audio"
163 local MSG_MD
= "moreData" -- 播放缓存有空余
164 local MSG_PD
= "playDone" -- 播放完成所有数据
166 audio
.on(0, function(id
, event
)
167 --使用play来播放文件时只有播放完成回调
168 local succ
,stop
,file_cnt
= audio
.getError(0)
173 log.info("第", file_cnt
, "个文件解码失败")
176 sysplus
.sendMsg(taskName
, MSG_PD
)
180 local function audio_task()
182 sys
.waitUntil("AUDIO_READY")
183 -- 初始化spi flash, 如果是极限版TTS_ONCHIP,就不需要初始化
185 spi_flash
= spi
.deviceSetup(0,8,0,0,8,25600000,spi
.MSB
,1,0)
186 local ret
= sfud
.init(spi_flash
)
188 log.info("sfud.init ok")
190 log.info("sfud.init error", ret
)
194 log.info("tts", "TTS_ONCHIP?? skip sfud")
197 -- 本例子是按行播放 "千字文", 文本来源自wiki百科
204 fd
= io
.open("/luadb/qianzw.txt")
214 line
= "一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十"
217 log.info("播放内容", line
)
218 result
= audio
.tts(0, line
)
220 --等待音频通道的回调消息,或者切换歌曲的消息
222 msg
= sysplus
.waitMsg(taskName
, nil)
223 if type(msg
) == 'table' then
224 if msg
[1] == MSG_PD
then
229 log.error(type(msg
), msg
)
236 if not audio
.isEnd(0) then
241 audio
.pm(0,audio
.STANDBY
)
243 -- audio.pm(0,audio.SHUTDOWN) --低功耗可以选择SHUTDOWN或者POWEROFF,如果codec无法断电用SHUTDOWN
244 log.info("mem", "sys", rtos
.meminfo("sys"))
245 log.info("mem", "lua", rtos
.meminfo("lua"))
248 sysplus
.taskDel(taskName
)
251 sysplus
.taskInitEx(audio_task
, taskName
, task_cb
)
253 -- 用户代码已结束---------------------------------------------
256 -- sys.run()之后后面不要加任何语句!!!!!