JQ8900开发记录

仅用于开发记录,写的不详细,后续可能会补充。

一、简述

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。

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chinalihuanyu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值