仅用于开发记录,写的不详细,后续可能会补充。
一、简述
24位DAC输出内部采集DSP硬件解码
二、参数信息
项目 | 参数 |
文件格式 | MP3,WAV,支持通配符命名 |
采样率 | 8/11.025/12/16/22.05/24/32/44.1/48 |
UART接口 | 标准串口,TTL电平,波特率9600,数据位8位,停止位1位,无检验位 |
输入电压 | DC3.3-5.2V;TO电平3.3V |
工作温度 | -40℃~85℃ |
湿度 | 5%~95% |
三、管脚说明
5V供电建议在单片机TX和模块RX中串联1K电阻。有音频播放的时候灯会亮。
四、控制方式
前两种方式没有使用过,不阐述,主要使用第三种。
1.按键控制
2.一线控制模式
3.两线串口模式
3.1通信格式(高8位在前,低8位在后)
起始码(0xAA)——指令类型——数据长度(n)——数据1~数据n——和校验(所有字节之和取低8位)
3.2协议约定
具体命令需要根据使用说明书。程序代码资料里有。
#define BUF_SIZE (128)
//组合播放最大容量,不要设置过大以免堆栈溢出
#define ZH_MAX 50
//串口函数重定义(ESP32)
#define JQ8x00_UART(pointer,len) uart_write_bytes(2,&pointer,len) //pointer为指针数据传入数据首地址
/**********************串口控制**************************/
typedef enum {
OverallCycle = 0X00, /*全盘循环 按顺序播放全盘曲目,播放完后循环播放*/
SingleCycle = 0x01, /*单曲循环 一直循环播放当前曲目*/
SingleStop = 0x02, /*单曲停止 播放完当前曲目一次停止*/
OverallRandom = 0X03, /*全盘随机 随机播放盘符内曲目*/
CatalogCycle = 0X04, /*目录循环 按顺序播放当前文件夹内曲目,播放完后循环播放,目录不包含子目录*/
CatalogRandom = 0x05, /*目录随机 在当前目录内随机播放,目录不包含子目录*/
CatalogTurnPlay = 0x06, /*目录顺序播放 按顺序播放当前文件夹内曲目,播放完后停止,目录不包含子目录*/
OverallTurnPlay = 0x07, /*全盘顺序播放 按顺序播放全盘曲目,播放完后停止*/
}LoopModeSelect; //循环模式选择
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; //系统盘符
具体需要重点记录的:
1.指定盘符指定路径播放(0x08)
- 指令:AA 08 长度 盘符 路径 校验和
- 返回:无
- 说明:长度=盘符长度(1)+路径长度
就比如我把02.wav文件放在SD卡的根目录里。
JQ8x00_RandomPathPlay(JQ8X00_SD,"/02");
/************************************************************************
功能描述:播放任意路径下的的音频文件
入口参数: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; //长度,1为盘符,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);
}
/**************************串口控制************************************/
/************************************************************************
功能描述:组合播报函数
入口参数: *DAT:字符串指针,Len字符串长度
返 回 值: none
其他说明: 将需要播报的文件名放入数组中作为形参即可
**************************************************************************/
void JQ8x00_ZuHeBoFang(uint8_t *DATA,uint8_t Len)
{
uint8_t 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++;
#if JQ8x00_BusyCheck
while(JQ8x00_BUSY_Read); //忙检测s
#endif
JQ8x00_UART(Buffer,i);
}
/************************************************************************
功能描述:起始码-指令类型-数据长度-校验和
入口参数: 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]; //校验和
#if JQ8x00_BusyCheck
while(JQ8x00_BUSY_Read); //忙检测
#endif
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;
}
#if JQ8x00_BusyCheck
while(JQ8x00_BUSY_Read); //忙检测
#endif
JQ8x00_UART(Buffer,DataLen);
}
ESP32串口初始化:
esp_err_t jq8900_uart_init(void)
{
/* Configure parameters of an UART driver,
* communication pins and install the driver */
uart_config_t uart_config = {
.baud_rate = 9600,
.data_bits = UART_DATA_8_BITS,
.parity = UART_PARITY_DISABLE,
.stop_bits = UART_STOP_BITS_1,
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
.source_clk = UART_SCLK_DEFAULT,
};
int intr_alloc_flags = 0;
#if CONFIG_UART_ISR_IN_IRAM
intr_alloc_flags = ESP_INTR_FLAG_IRAM;
#endif
ESP_ERROR_CHECK(uart_driver_install(2, BUF_SIZE * 2, 0, 0, NULL, intr_alloc_flags));
ESP_ERROR_CHECK(uart_param_config(2, &uart_config));
ESP_ERROR_CHECK(uart_set_pin(2, 13, 27, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE));
JQ8x00_Command_Data(SetVolume,5); //设置音量为5
return ESP_OK;
}
2.音量设置(0x13)
- 指令:AA 13 01 音量等级 校验和
- 返回:无
- 说明:音量等级31级,0~30级,默认20级
举例:AA 13 01 14 D2设置音量等级为20。