十一、JQ8400语音播报模块
1.管脚说明
引脚 | 标示 | 说明 |
1 | ONE LINE | 一线串口脚 |
2 | BUSY | 忙信号脚,播放时为高,其他为低 |
3 | RX | 芯片串口接收脚,接MCU的TX |
4 | TX | 芯片串口发送脚,接MCU的RX |
5 | GND | 芯片数字地 |
6 | DC-5V | 芯片供电脚,3.3-5V |
7 | DAC-R | DAC音频输出右声道 |
8 | DAC-L | DAC音频输出左声道 |
9 | SPK- | 接喇叭 |
10 | SPK+ |
2.一线串口通信协议
SDA为数据发送端口,发送语音地址,先发送低位。
3.一线数据指令
指令(HEX) | 功能 | 说明 |
00 | 数字0 |
数字0-9可以用于需要数字的功能, 比如选曲、设置音量、设置EQ、 设置循环模式、设置通道、设置插播曲目 先发数字后发功能指令。 |
01 | 数字1 | |
02 | 数字2 | |
03 | 数字3 | |
04 | 数字4 | |
05 | 数字5 | |
06 | 数字6 | |
07 | 数字7 | |
08 | 数字8 | |
09 | 数字9 | |
0A | 清零数字 | 清除发送的数字 |
0B | 选曲确认 |
配 合 数 字 实 现 |
0C | 设置音量0-30 | |
0D | 设置EQ | |
0E | 设置循环模式 | |
0F | 设置通道 | |
10 | 设置插播曲目 | |
11 | 播放 |
单字节控制指令, 仅需发送一个控制指令即可。 |
12 | 暂停 | |
13 | 停止 | |
14 | 上一曲 | |
15 | 下一曲 | |
16 | 上一目录 | |
17 | 下一目录 | |
18 | 选择SD卡 | |
19 | 选择U盘 | |
1A | 选择FLASH | |
1B | 系统睡眠 |
4.一线串口MP3文件命名规则
(1)文件名需为5位数字,该五位数即为文件的曲目号。
(2)文件需放在根目录下。
5.一线串口说明和注意事项
(1)引导码延时要求大于2MS,建议使用4MS延时
(2)脉冲比例基数在2-5都可以识别
(3)两个字节之间延时建议在10MS以上
6.代码实现
1 void jq8400SendOneByteData(u8 dataOrCmd) 2 { 3 SDA=1; 4 Delay_Ms(10);//两个字节发送之间的延时,建议大于10ms 5 6 //发送引导码,大于2ms,建议为4ms 7 SDA=0; 8 Delay_Ms(4); 9 10 for(int i=0;i<8;i++){//发送数据 11 SDA=1; 12 if(dataOrCmd&0x01){//最低位为1,发送位1,高低电平时间3:1表示发送1,脉冲比例基数2-5都可以识别 13 Delay_Us(1200); 14 SDA=0; 15 Delay_Us(400); 16 }else{//发送位0 17 Delay_Us(400); 18 SDA=0; 19 Delay_Us(1200); 20 } 21 dataOrCmd >>= 1; 22 } 23 }
1 jq8400Init(); 2 jq8400SendOneByteData(0x0A);//先发送数字,再发送指令,清除数字指令 3 jq8400SendOneByteData(0x01);//发送数字1 4 //jq8400SendOneByteData(0x00);//发送数字0,结合组成数字10 5 jq8400SendOneByteData(0x0B);//确定选曲指令 6 7 jq8400SendOneByteData(0x11);//播放指令,单指令
7.二线串口操作
7.1 使用说明:串口波特率9600
7.2 常用几个功能协议
(1)设置音量:AA 13 01 音量 SM校验和
(2)选择曲目并播放:AA 07 02 曲目高 曲目低 SM校验和
(3)停止播放:AA 04 00 AE
(4)设置循环模式:AA 18 01 循环模式 SM校验和
8.事例代码
1 #ifndef __JQ8400_H__ 2 #define __JQ8400_H__ 3 #include "stm32f10x.h" 4 5 static char SETVOLUME[5]={0xAA,0x13,0x01,0x14,0xD2};//设置音量 6 static char PLAY[6]={0xAA,0x07,0x02,0x00,0x01,0xB4};//选择曲目并播放 7 static char STOP[4]={0xAA,0x04,0x00,0xAE};//停止播放 8 static char LOOP[5]={0xAA,0x18,0x01,0x02,0xC5};//设置循环模式 9 10 typedef enum{ 11 FALSE=0, 12 TRUE, 13 }bool; 14 15 //初始化串口 16 void JQ8400_Init(void); 17 //设置音量 18 void JQ8400_SetVolume(int volume); 19 //播放指定音乐 20 void JQ8400_Play(int index,bool loop); 21 //停止播放 22 void JQ8400_Stop(void); 23 24 #endif
1 #include "jq8400.h" 2 3 void JQ8400_Init(void) 4 { 5 //1.使能时钟,初始化端口 6 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); 7 8 GPIO_InitTypeDef GPIO_InitStruct; 9 10 GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9; 11 GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//发送数据端口,复用推挽输出 12 GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; 13 GPIO_Init(GPIOA,&GPIO_InitStruct); 14 15 GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10; 16 GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;//接收数据端口,浮空输入 17 GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; 18 GPIO_Init(GPIOA,&GPIO_InitStruct); 19 20 //2.使能时钟,配置串口参数 21 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); 22 23 USART_InitTypeDef USART_InitStruct; 24 25 USART_InitStruct.USART_BaudRate = 9600;//波特率 26 USART_InitStruct.USART_Mode = USART_Mode_Tx;//模式,发模式 27 USART_InitStruct.USART_WordLength = USART_WordLength_8b;//数据位长度,8位 28 USART_InitStruct.USART_Parity = USART_Parity_No;//校验位 29 USART_InitStruct.USART_StopBits = USART_StopBits_1;//一位停止位 30 USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制 31 USART_Init(USART1,&USART_InitStruct); 32 33 //3.使能串口 34 USART_Cmd(USART1,ENABLE); 35 } 36 37 //发送字符串函数 38 static void Send_Data(u8* data,u16 data_len) 39 { 40 for(int i=0;i<data_len;i++){ 41 while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//0表示数据还未转移到移位寄存器,1表示数据已经移动到移位寄存器可以发送数据 42 USART_SendData(USART1,data[i]); 43 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);//1表示发送完成 44 } 45 } 46 47 void JQ8400_SetVolume(int volume) 48 { 49 SETVOLUME[3]=volume; 50 SETVOLUME[4]=SETVOLUME[0]+SETVOLUME[1]+SETVOLUME[2]+SETVOLUME[3]; 51 Send_Data((u8*)SETVOLUME,5); 52 } 53 54 void JQ8400_Play(int index,bool loop) 55 { 56 if(loop == TRUE){ 57 LOOP[3]=0x01; 58 LOOP[4]=0xC4; 59 Send_Data((u8*)LOOP,5); 60 }else{ 61 LOOP[3]=0x02; 62 LOOP[4]=0xC5; 63 Send_Data((u8*)LOOP,5); 64 } 65 66 PLAY[3]=(index & 0xFF00) >> 8; 67 PLAY[4]=(index & 0x00FF); 68 PLAY[5]=PLAY[0]+PLAY[1]+PLAY[2]+PLAY[3]+PLAY[4]; 69 Send_Data((u8*)PLAY,6); 70 } 71 72 void JQ8400_Stop(void) 73 { 74 Send_Data((u8*)STOP,4); 75 }