语音芯片JQ8400的使用心得
语音芯片介绍
模块特征(简要介绍)
1、支持MP3 WAV硬件解码
2、支持FAT文件系统
3、两线串口模式、一线串口模式
4、支持普通音乐播放器具有的功能如上一曲、下一曲、播放、暂停、停止、选曲等常用功能
5、支持智能组合播放,特定的文件夹里的歌曲组合,发送曲目名即可
6、30级音量调节
7、官方带有配套上位机,可以生成实现所需功能的传输指令
更新语音内容说明
JQ8400 语音模块选用的是 SOC 方案,集成了一个 16 位的 MCU,以及一个专门针对音频解码的 ADSP,采用硬解码的方式,更加保证了系统的稳定性和音质。小巧尺寸更加满足嵌入其它产品的需求。
SPI-flash(更换语音内容)
此芯片最大的优势在于能够灵活的更换 SPI-flash 内的语音内容,省去了传统语音芯片需要安装上位机更换语音的麻烦,SPI FLASH 直接模拟成 U 盘,跟拷贝 U 盘一样,非常方便。使得产品研发和生产变得便捷简单。一线串口控制模式、RX232 串口控制可选,为研发提供更多的选择性。USB 数据线连接模块,插上电脑,电脑会自动识别,像插入U盘一样,可以直接更换语音内容,语音文件命名方式有一定限制,程序也需要按这个格式编写。
模块引脚说明
JQ8400-FL的芯片引脚,还有带有TF的和有其它可控制的IO口的芯片
芯片引脚说明
二两线串口通信(一线串口通信见附件官方文档)
串口传输函数
void UART1_SendCode(u8 *DATA,u8 len)
{USART_ClearFlag(USART1,USART_FLAG_TC); //发送之前清空发送标志while(len--){USART_SendData(USART1, *DATA++);while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束}
}
两线串口指定路径播放以下为它的驱动函数,支持中文和英文数字等组,建议文件夹名和文件名不要过长。建立两个文件夹,文件夹名为测试1,测试1内有文件夹2,文件夹2里有文件00002的音频。
/************************************************************************
功能描述:播放任意路径下的的音频文件
入口参数:JQ8X00_Symbol:系统盘符,*DATA:需要播放的音频文件路径
返 回 值: none
其他说明:播放说明例 如 :/广告/小米手机.mp3,可以按如下格式/广告* /小米*???,“广告*”代表前两个字为“广告的文件夹”,*为通配符注意格式,下一个目录符号前要加*,如/测试1* /测试2* /00002*???JQ_8x00_RandomPathPlay(JQ8X00_FLASH,"广告* /小米")播放FLASH根目录下文件名为00001.mp3的音频,则传JQ_8x00_RandomPathPlay(JQ8X00_FLASH,"/00001");
**************************************************************************/
void JQ8x00_RandomPathPlay(JQ8X00_Symbol symbol,char *DATA)
{uint8_t Buffer[52] ={0xaa,0x08};uint8_t i,j;Buffer[2] = 1 + strlen(DATA) + 4; Buffer[3] = symbol; i = 4;while(*DATA){Buffer[i++] = *DATA;DATA++;}Buffer[i++] = '*';Buffer[i++] = '?';Buffer[i++] = '?';Buffer[i++] = '?';for(j=0;j<i;j++){Buffer[i] = Buffer[i] + Buffer[j]; }i++;JQ8x00_UART(Buffer,i);
}
//下面为播放函数
char Path_Buffer[] = {"/测试1*/测试2*/00002"}; //播放路径: 根目录->测试1->测试2 下文件名为00002的音频文件
JQ8x00_RandomPathPlay(JQ8X00_FLASH,Path_Buffer); //播放 根目录->测试1->测试2 下文件名为00002的音频文件
两线串口组合播放以下为它的驱动函数,组合播放是按文件名来组合,文件要求存储在“ZH”文件夹下,可以把要组合的文件名
称更改为两个字节的名称,一般建议用数字表示。如: 01.mp3,02.mp3,也可以用两个字母或一个汉字命名 。
/************************************************************************
功能描述:组合播报函数
入口参数: *DAT:字符串指针,Len字符串长度
返 回 值: none
其他说明: 将需要播报的文件名放入数组中作为形参即可
**************************************************************************/
void JQ8x00_ZuHeBoFang(uint8_t *DATA,uint8_t Len)
{u16 CRC_data=0,i = 3;uint8_t Buffer[ZH_MAX] ={0xaa,0x1b};Buffer[2] = Len*2; //计算长度CRC_data = CRC_data + 0xaa + 0x1b + Buffer[2];while(Len--){Buffer[i] = *DATA/10+0x30; //取出十位CRC_data = CRC_data + Buffer[i];i++;Buffer[i] = *DATA%10+0x30; //取出个位CRC_data = CRC_data + Buffer[i];i++;DATA++;}Buffer[i] = CRC_data;i++;JQ8x00_UART(Buffer,i);
}
//下面为播放函数uint8_t ZH_Buffer[3] = {1,2,3}; JQ8x00_ZuHeBoFang(ZH_Buffer,3); //将ZH文件夹下名字为01 02 03的3个音频文件依次播放
芯片通信采用全双工串口通信;
波特率为 9600,数据位:8 ,停止位 1 位,检验位 N
通信格式
起始码-指令类型-数据长度(n)-数据 1-数据 n-和检验(SM)
指令码 :固定为 AA
指令类型 : 用来区分指令类型
数据长度 :指令中的数据的字节数
数据 :指令中的相关数据,当数据长度为 1 时,表示只有 CMD,没有数据位
和检验 :为之前所有字节之和的低 8 位,即起始码到数据相加后取低 8 位 鯦数据格式 :发送的数据或命令,高 8 位数据在前,低 8 位在后
协议约定
播放状态定义 :系统上电处于停止状态
00(停止) 01(播放) 02(暂停)
盘符定义: 切换盘符后处于停止状态
USB:00 SD:01 FLASH:02 NO_DEVICE:FF
音量:音量总共为 31 级,0-30 级,上电默认为 20 级
播放模式定义:上电默认为单曲停止
/************************************************************************
功能描述:起始码-指令类型-数据长度-校验和
入口参数: MODE:模式
返 回 值: none
其他说明: 无数数据传入
**************************************************************************/
void JQ8x00_Command(UartCommand Command)
{uint8_t Buffer[4] ={0xaa};Buffer[1] = Command; //指令类型 Buffer[2] = 0x00; //数据长度Buffer[3] = Buffer[0] + Buffer[1] + Buffer[2]; //校验和JQ8x00_UART(Buffer,4);
}/************************************************************************
功能描述:起始码-指令类型-数据长度-数据-校验和
入口参数: *DAT:字符串指针,Len字符串长度
返 回 值: none
其他说明:
**************************************************************************/
void JQ8x00_Command_Data(UartCommandData Command,uint8_t DATA)
{uint8_t Buffer[6] ={0xaa};uint8_t DataLen = 0;Buffer[1] = Command; //指令类型if((Command != AppointTrack) && (Command != SetCycleCount) && (Command != SelectTrackNoPlay) && (Command != AppointTimeBack) && (Command != AppointTimeFast)) //只含一个数据指令 {Buffer[2] = 1; //数据长度Buffer[3] = DATA; //数据Buffer[4] = Buffer[0] + Buffer[1] + Buffer[2] + Buffer[3]; //校验和DataLen = 5;}else //含两个数据指令 {Buffer[2] = 2; //数据长度Buffer[3] = DATA/256; //数据Buffer[4] = DATA%256; //数据Buffer[5] = Buffer[0] + Buffer[1] + Buffer[2] + Buffer[3] + Buffer[4]; DataLen = 6;}
串口传输控制指令包含无数据的和多个数据的
typedef enum {CheckPlayState = 0x01, /*查询播报状态*/Play = 0x02, /*播放*/pause = 0x03, /*暂停*/Stop = 0x04, /*停止*/LastSong = 0x05, /*上一曲*/NextSong = 0x06, /*下一曲*/ CheckOnelineDisksign = 0x09, /*查询当前在线盘符*/CheckCurrentDisksign = 0X0A, /*查询当前播放盘符*/CheckTotalTrack = 0x0C, /*查询总曲目*/CurrentTrack = 0x0D, /*当前曲目*/LastFloder = 0x0E, /*上一个文件夹目录*/NextFloder = 0x0F, /*下一个文件夹目录*/ EndPlay = 0x10, /*结束播放*/CheckFloderFirstTrack = 0x11, /*查询文件目录首曲目*/CheckFloderAllTrack = 0x12, /*查询文件目录总曲目*/AddVolume = 0x14, /*音量加*/DecVolume = 0x15, /*音量减*/EndZHPlay = 0X1C, /*结束组合播报*/ CheckSongShortName = 0x1E, /*查询歌曲短文件名*/EndLoop = 0x21, /*结束复读*/GetTotalSongTime = 0x24, /*获取当前曲目总时间*/OpenPlayTime = 0x25, /*播放时间开发送*/ ClosePlayTime = 0x26, /*关闭播放时间发送*/
}UartCommand; //无数据的指令,起始码-指令类型-数据长度-校验和typedef enum {AppointTrack = 0x07, /*指定曲目播放*/SetCycleCount = 0x19, /*设置循环次数*/SetEQ = 0X1A, /*EQ设置*/SelectTrackNoPlay = 0x19, /*选曲不播放*/GoToDisksign = 0X0B, /*切换指定盘符*/SetVolume = 0x13, /*音量设置*/SetLoopMode = 0x18, /*设置循环模式*/SetChannel = 0x1D, /*设置通道*/ AppointTimeBack = 0x22, /*指定时间快退*/AppointTimeFast = 0x23, /*指定时间快退*/
}UartCommandData; //包含多个数据的指令,起始码-指令类型-数据长度-数据1-...-校验和
盘符和循环模式选择指令
typedef enum {JQ8X00_USB = 0X00, /*UPANND*/JQ8X00_SD = 0x01, /*SD*/JQ8X00_FLASH = 0x02, /*FLASH*/
}JQ8X00_Symbol; //系统盘符
//循环模式选择在包含多个数据指令里面
// SetLoopMode = 0x18, /*设置循环模式*/
typedef enum {OverallCycle = 0X00, /*全盘循环 按顺序播放全盘曲目,播放完后循环播放*/SingleCycle = 0x01, /*单曲循环 一直循环播放当前曲目*/SingleStop = 0x02, /*单曲停止 播放完当前曲目一次停止*/OverallRandom = 0X03, /*全盘随机 随机播放盘符内曲目*/CatalogCycle = 0X04, /*目录循环 按顺序播放当前文件夹内曲目,播放完后循环播放,目录不包含子目录*/CatalogRandom = 0x05, /*目录随机 在当前目录内随机播放,目录不包含子目录*/CatalogTurnPlay = 0x06, /*目录顺序播放 按顺序播放当前文件夹内曲目,播放完后停止,目录不包含子目录*/OverallTurnPlay = 0x07, /*全盘顺序播放 按顺序播放全盘曲目,播放完后停止*/
}LoopModeSelect; //循环模式选择
通过按键控制播放不同歌曲,使用的是原子的STM32ZET6的串口1,见附件文档
附件:JQ8400
注:参考官方所给文档进行编写的
语音芯片JQ8400的使用心得相关推荐
- 阿里AI labs发布两大天猫精灵新品,将与平头哥共同定制智能语音芯片
作者 | 夕颜 出品 | AI科技大本营(ID:rgznai100) 2019 年,去年刮起的一阵智能音箱热浪似乎稍微冷却下来,新产品不再像雨后春笋一样层出不穷,挺过市场洗礼的产品更是凤毛麟角,这些产 ...
- 单片机断电后不保存程序_为什么单片机语音芯片既有flash又有EEPROM
为什么单片机语音芯片既有flash又有EEPROM 单片机语音芯片运行时的数据存在于RAM (随机存储器)中,停电后无法保留RAM的数据时,如何在停电后不丢失数据呢?这需要使用EEPROM和FLASH ...
- 阿里云开放国内首个云端数据库测试平台,云已成为数据库新标准;华为5G随行WiFi发布;科大讯飞推出 AI 专用语音芯片系列……...
戳蓝字"CSDN云计算"关注我们哦! 嗨,大家好,重磅君带来的[云重磅]特别栏目,如期而至,每周五第一时间为大家带来重磅新闻.把握技术风向标,了解行业应用与实践,就交给我重磅君吧! ...
- 全新 AI 语音芯片、双麦 AIoT 模组,科大讯飞硬核技术助力智能家电创新
据艾瑞咨询的数据显示,2017 年中国智能家居市场规模为 3342.3 亿元,其中智能家电规模为2828.0亿元,占比87%.预计到 2020 年智能家电的市场规模将达到 5155.0 亿元. 智能家 ...
- 科大讯飞语音识别芯片_科大讯飞造家电专用语音芯片 市场机会在哪里?
撰文/蓝科技 家电行业算不上朝阳产业,也绝不是夕阳产业,但围绕家电行业上下游打造的产业链,却带来了很多机会. 尤其是AI驱动.5G到来之际,AIoT正成为新的风口向市场快速渗透.以家电行业为例,理论上 ...
- 成都这家AI语音芯片公司又融了数千万,能“偷袭”科大讯飞不?
新蓉商关注: 3月23日, 成都启英泰伦科技有限公司 (以下简称"启英泰伦") 官方消息称 公司完成新一轮数千万元融资, 新蓉商记者获悉, 这家公司注册资本已经先后6次增资, 目前 ...
- 谈谈市场上常用语音芯片方案选型,录音芯片方案选型
[系列专栏]:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! <QT开发实战> <嵌入式通用开发实战> <嵌入式Linux开发实战> 转自:http:/ ...
- sop8语音芯片选型,九齐硕呈等等比较,看完此篇就足够了
目录 一.简介 二.KT148A语音芯片介绍 1. 32 位 DSP 语音芯片.5MHZ的内部振荡,PLL到120MHZ: 2. 工作电压 2.0~5.5V: 注意低于3.3V的供电,硬件上有细节的区 ...
- 语音芯片播报方案选型补充说明
一.简介 现在市场上语音芯片的种类烦多.从语音识别芯片到语音播放芯片,可选的型号和种类都很多,要选一个合适的还是比较困难.现在的语音播放芯片,一般分为纯语音播放(指OTP芯片),带Flash播放语音芯 ...
最新文章
- python gdbm_GDBM不适用于Python 3.6和anaconda
- Linux下用iptables做端口映射
- Angular面试从喜剧到悲剧的十个问题
- 开方计算与浮点数的问题
- PHP error_reporting() 错误控制函数功能详解
- 廖雪峰Java9正则表达式-2正则表达式进阶-3分组匹配
- 阿里播放器Aliplayer封装
- PPC2003SE开发日记-资源之工具安装(JONSON原创)
- 大作手操作体系:突破后回调不下箱体可加仓,但是也有失误的时候!
- Ansible(十四)-- ansible 中的变量(三) set_fact 模块 注册变量实现跨play调用变量
- JavaScript事件函数
- Shader实现透明反射效果应用地板
- 2015校园O2O商业模式解析——从社交切入
- 用Interl 5100AGN 无线网卡破解无线网络WEP密码
- 简述数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型
- Dcloud云函数服务空间
- Conflux伍鸣:用DAG结构提升中本聪共识的吞吐率
- 课程设计:基于Python的爬虫租房数据分析
- 唐诗宋词学习·106~110节
- js基础1 输入输出方式 数据类型
热门文章
- matlab 解缠原理,相位解缠算法matlab
- 使用 logrotate 配置 supervisor 进行日志管理按天备份
- android studio 下拉菜单,怎么在android studio中使用Spinner实现一个下拉菜单
- Microsoft.Office.Interop.Word 创建word
- 用js代码在body里面添加内容
- JavaWeb实现注册登录功能并将用户数据写进数据库(商城系统第一部分)
- VSCode 格式化 cpp 文件时配置左大括号不换行
- 风影ASP.NET基础教学 9 数据访问
- 三国杀代码12武将C++
- 《郑军的回忆》文章记录了我3年的痛苦过去