语音芯片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口
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
注:参考官方所给文档进行编写的

  • 13
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
JQ8400FL-10P语音模块特点: 支持MP3 WAV 硬件解码 支持FAT文件系统 支持采样率(KHz):8/11.025/12/16/22.05/24/32/44.1/48 24位DAC输出内部采用DSP硬件解码,非PWM输出,动态范围支持 90dB,信比 85dB 多种控制模式、两线串口模式、一线串口控制 支持SPIFLASH模拟成U盘,直接像操作U盘一样更新SPIFLASH里的语音 支持上一曲,下一曲,播放、暂停、停止、选曲、等常用功能控制 支持播放曲目序号获取,总曲目及目录总曲目等信息获取 支持各种信息查询,轻松获取语音芯片的当前状态 支持指定曲目插播,即可以暂停当前播放的音乐,播放插播的曲目,播放完后返回原来曲目断点处播放 支持中英文路径插播,除了指定曲目插播,同时也支持指定路径插播,只需要发送插播的路径即可以轻松实现 支持指定中英文路径播放,无需知道要播放的内容的序号,直接发送所在的路径即可。 支持智能组合播放,特定的文件夹里的歌曲组合,发送曲目名即可组合。 支持30级音量调节 支持5种EQ调节 支持7种播放模式控制,可以适应不同的应用 支持循次数设置,更多应用,更人性化 支持系统深度睡眠,睡眠后电流低至600微安,可以通过一线串和指令IO唤醒 支持指定时间快进,快退 支持指定时间段复读 支持指定从指定的时候点开始播放 专用的BUSY信号输出指示 成熟的指令和指令解析,让应用更稳定 专用配套上位机,快速上手,方便调试,指令自动生成

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值