1 JQ6500语音播报模块详解(STM32)

发布于:2025-08-13 ⋅ 阅读:(15) ⋅ 点赞:(0)

系列文章目录



前言

本节介绍下JQ6500语音播报模块的使用,基于的单片机是STM32F103RCT6。主要完成以下功能:
1、制作一个JQ6500驱动程序

2、通过按键进行切换上一曲、下一曲;增加音量,减小音量


1 JQ6500简介

  JQ6500 是一个提供串口的MP3芯片,完美的集成了MP3、WMV的硬解码。同时软件支持TF卡驱动,支持电脑直接更新spi flash的内容,支持FAT16、FAT32文件系统。通过简单的串口指令即可完成播放指定的音乐,以及如何播放音乐等功能,无需繁琐的底层操作,使用方便,稳定可靠是此款产品的最大特点。另外该芯片也是深度定制的产品,专为固定语音播放领域开发的低成本解决方案。

2 基本参数说明

2.1 硬件参数

在这里插入图片描述

2.2 模块管脚说明

在这里插入图片描述
在这里插入图片描述

3 控制方式

3.1 通信格式

支持异步串口通讯模式,通过串口接受上位机发送的命令
通讯标准:9600 bps
数据位 :8
校验位 :none
流控制 :none
在这里插入图片描述
例如,如果我们指定播放,就需要发送:7E 04 03 00 01 EF,红色代表第几首, 01表示
第一首,02表示第二首… 即从01开始计算;

数据长度为4 ,这4个字节分别是[04 03 00 01] 。不计算起始、结束。
组合播放:
连续发送【7E 04 03 00 01 EF】【7E 04 03 00 02 EF】【7E 04 03 00 03 EF】,则连续播放第一首、第二首、第三首,最多可以十首组合,播放完停止

3.2 通信指令

在这里插入图片描述
在这里插入图片描述
例如,下一曲,发送:7E 02 01 EF
例如,上一曲,发送:7E 02 02 EF
例如,播放, 发送:7E 02 0D EF

4 硬件设计

在这里插入图片描述
JQ6500与STM32F103RCT6接线图:

JQ6500 STM32F103RCT6
K1 PC5
BUSY PA5
TX PC11
RX PC10
DC-5V VCC5
GND GND

JQ6500与喇叭接线图:

JQ6500 喇叭
SPK- 喇叭-
SPK+ 喇叭+

5 软件设计

5.1 main.c

#include "board_config.h"

#include "board_test.h"

#include "module_config.h"

/************************************************
 JQ6500语音模块驱动
 实验现象:
 
 淘宝店铺:https://shop475501589.taobao.com/?spm=pc_detail.29232929/evo365560b447259.shop_block.dshopinfo.5dd97dd6JvMuG3
 咸鱼店铺:https://www.goofish.com/personal?spm=a21ybx.item.itemHeader.1.c17a3da6hy8k28&userId=3890583014
 哔哩哔哩:https://space.bilibili.com/482024430?spm_id_from=333.788.upinfo.detail.click
 作者:胜磊电子
************************************************/

/************************************* 全局变量 *******************************************************/


/************************************* 本地函数 *******************************************************/


/*
************************************************************
*	函数名称:	main
*
*	函数功能:	
*
*	入口参数:	无
*
*	返回参数:	0
*
*	说明:
************************************************************
*/
int main(void)
{
	// 初始化所有外设
    BOARD_InitAll();
	
	// 初始化所有模块
	MODULE_InitAll();

	UsartPrintf(USART_DEBUG,"这是JQ6500驱动实验\r\n");
	
    while (1) {
		BOARD_TestAll();
    }
}

5.2 board_config

5.2.1board_config.h

/**
 * @file board_config.h
 * @brief 板级配置头文件,定义外设对象及初始化函数
 * @author 胜磊电子
 * @date 未定义
 * @version 1.0
 * @copyright 淘宝店铺:https://shop475501589.taobao.com/?spm=pc_detail.29232929/evo365560b447259.shop_block.dshopinfo.5dd97dd6JvMuG3<br>
 * 咸鱼店铺:https://www.goofish.com/personal?spm=a21ybx.item.itemHeader.1.c17a3da6hy8k28&userId=3890583014<br>
 * 哔哩哔哩:https://space.bilibili.com/482024430?spm_id_from=333.788.upinfo.detail.click
 */
#ifndef BOARD_CONFIG_H
#define BOARD_CONFIG_H

#include "led.h"
#include "beep.h"
#include "usart.h"
#include "key.h"
#include "delay.h"

/**
 * @brief 调试打印使用的USART外设
 */
#define USART_DEBUG				USART1		// 调试打印所使用的串口组

/**
 * @brief USART1接收缓冲区大小定义
 */
#define USART1_RX_BUFFER_SIZE 	512			// 接收缓冲区配置

/**
 * @brief USART1发送缓冲区大小定义
 */
#define USART1_TX_BUFFER_SIZE 	512			// 发送缓冲区配置

/**
 * @brief UART4接收缓冲区大小定义
 */
#define UART4_RX_BUFFER_SIZE 	512			// 接收缓冲区配置

/**
 * @brief UART4发送缓冲区大小定义
 */
#define UART4_TX_BUFFER_SIZE 	512			// 发送缓冲区配置
/**
 * @brief 按键中断处理函数声明
 */
#define    KEYUP_IRQHandler    		EXTI0_IRQHandler
#define    KEY012_IRQHandler   		EXTI9_5_IRQHandler

// 导出LED对象供外部使用
extern LED_TypeDef BOARD_LED1; /**< 板载LED1对象 */
extern LED_TypeDef BOARD_LED2; /**< 板载LED2对象 */

// 导出蜂鸣器对象供外部使用
extern Beep_TypeDef BOARD_BEEP; /**< 板载蜂鸣器对象 */

// 导出串口对象供外部使用
extern USART_HandleTypeDef huart1; /**< USART1句柄对象 */
extern USART_InitParams usart1_params; /**< USART1初始化参数对象 */

extern USART_HandleTypeDef huart4; /**< USART1句柄对象 */
extern USART_InitParams usart4_params; /**< USART1初始化参数对象 */



// 按键配置 - 可在board_config.c中修改
extern Key_InitTypeDef BOARD_KEYS[];
extern const uint8_t BOARD_KEYS_NUM;

/**
 * @brief 板级所有外设初始化函数
 * @details 初始化板上所有外设(LED、蜂鸣器、USART等)
 * @return 无
 */
void BOARD_InitAll(void);


#endif /* BOARD_CONFIG_H */

5.2.2 board_config.c

/**
 * @file board_config.c
 * @brief 板级配置实现文件,初始化板上所有外设
 * @author 胜磊电子
 * @date 未定义
 * @version 1.0
 * @copyright 淘宝店铺:https://shop475501589.taobao.com/?spm=pc_detail.29232929/evo365560b447259.shop_block.dshopinfo.5dd97dd6JvMuG3<br>
 * 咸鱼店铺:https://www.goofish.com/personal?spm=a21ybx.item.itemHeader.1.c17a3da6hy8k28&userId=3890583014<br>
 * 哔哩哔哩:https://space.bilibili.com/482024430?spm_id_from=333.788.upinfo.detail.click
 */
#include "board_config.h"

/************************************* 外设对象定义 *******************************************************/

/** 
 * @brief 板载LED1对象
 * @details 对应引脚为PB0
 */
LED_TypeDef BOARD_LED1; /**< 板载LED1(PB0) */

/** 
 * @brief 板载LED2对象
 * @details 对应引脚为PB1
 */
LED_TypeDef BOARD_LED2; /**< 板载LED2(PB1) */

/** 
 * @brief 板载蜂鸣器对象
 * @details 对应引脚为PB8
 */
Beep_TypeDef BOARD_BEEP; /**< 板载蜂鸣器(PB8) */


/** 
 * @brief USART1句柄对象
 * @details 初始化接收/发送缓冲区、缓冲区大小及状态标志
 */
USART_HandleTypeDef huart1 = {
    .rx_buffer = (uint8_t[USART1_RX_BUFFER_SIZE]){0}, ///< 接收缓冲区(大小由USART1_RX_BUFFER_SIZE定义)
    .rx_buffer_size = USART1_RX_BUFFER_SIZE,          ///< 接收缓冲区大小
    .rx_len = 0,                                      ///< 初始接收长度为0
    .rx_complete = 0,                                 ///< 初始接收完成标志为0
	.tx_buffer = (uint8_t[USART1_TX_BUFFER_SIZE]){0}, ///< 发送缓冲区(大小由USART1_TX_BUFFER_SIZE定义)
    .tx_complete = 1                                  ///< 初始发送完成标志为1(空闲状态)
};

/** 
 * @brief USART1初始化参数
 * @details 配置USART1的硬件信息、中断使能及优先级
 */
USART_InitParams usart1_params = {
    .usart = USART1,
    .rcc_apb_periph_usart = RCC_APB2Periph_USART1,
    .rcc_apb_periph_gpio = RCC_APB2Periph_GPIOA,
    .gpio_port = GPIOA,
    .gpio_pin_tx = GPIO_Pin_9,
    .gpio_pin_rx = GPIO_Pin_10,
    .enable_rxne_interrupt = 1,    // 使能RXNE中断
    .enable_idle_interrupt = 1,    // 使能IDLE中断
    .enable_tc_interrupt = 0,      // 禁用TC中断
    .nvic_irq_channel = USART1_IRQn,
    .nvic_preemption_priority = 1,
    .nvic_sub_priority = 1
};

/** 
 * @brief UART4句柄对象
 * @details 初始化接收/发送缓冲区、缓冲区大小及状态标志
 */
USART_HandleTypeDef huart4 = {
    .rx_buffer = (uint8_t[UART4_RX_BUFFER_SIZE]){0}, ///< 接收缓冲区(大小由USART1_RX_BUFFER_SIZE定义)
    .rx_buffer_size = UART4_RX_BUFFER_SIZE,          ///< 接收缓冲区大小
    .rx_len = 0,                                      ///< 初始接收长度为0
    .rx_complete = 0,                                 ///< 初始接收完成标志为0
	.tx_buffer = (uint8_t[UART4_TX_BUFFER_SIZE]){0}, ///< 发送缓冲区(大小由USART1_TX_BUFFER_SIZE定义)
    .tx_complete = 1                                  ///< 初始发送完成标志为1(空闲状态)
};

/** 
 * @brief USART1初始化参数
 * @details 配置USART1的硬件信息、中断使能及优先级
 */
USART_InitParams usart4_params = {
    .usart = UART4,
    .rcc_apb_periph_usart = RCC_APB1Periph_UART4,
    .rcc_apb_periph_gpio = RCC_APB2Periph_GPIOC,
    .gpio_port = GPIOC,
    .gpio_pin_tx = GPIO_Pin_10,
    .gpio_pin_rx = GPIO_Pin_11,
    .enable_rxne_interrupt = 0,    // 使能RXNE中断
    .enable_idle_interrupt = 0,    // 使能IDLE中断
    .enable_tc_interrupt = 0,      // 禁用TC中断
    .nvic_irq_channel = UART4_IRQn,
    .nvic_preemption_priority = 1,
    .nvic_sub_priority = 1
};

/** 
 * @brief 开发板按键配置数组
 * @details 定义了开发板上4个按键的配置参数,包括GPIO、中断设置等
 */
Key_InitTypeDef BOARD_KEYS[] = {
    {
        RCC_APB2Periph_GPIOA,     /**< GPIO时钟使能:GPIOA */
        GPIOA,                    /**< GPIO端口:GPIOA */
        GPIO_Pin_0,               /**< 引脚:PA0 */
        GPIO_PortSourceGPIOA,     /**< 端口源:GPIOA */
        GPIO_PinSource0,          /**< 引脚源:Pin0 */
        EXTI_Line0,               /**< 外部中断线:Line0 */
        EXTI0_IRQn,               /**< 中断号:EXTI0_IRQn */
        2,                        /**< 抢占优先级:2 */
        1,                        /**< 子优先级:1 */
        EXTI_Trigger_Rising,      /**< 触发方式:上升沿触发 */
        GPIO_Mode_IPD             /**< GPIO模式:下拉输入 */
    },
    {
        RCC_APB2Periph_GPIOC,     /**< GPIO时钟使能:GPIOC */
        GPIOC,                    /**< GPIO端口:GPIOC */
        GPIO_Pin_5,               /**< 引脚:PC5 */
        GPIO_PortSourceGPIOC,     /**< 端口源:GPIOC */
        GPIO_PinSource5,          /**< 引脚源:Pin5 */
        EXTI_Line5,               /**< 外部中断线:Line5 */
        EXTI9_5_IRQn,             /**< 中断号:EXTI9_5_IRQn */
        2,                        /**< 抢占优先级:2 */
        2,                        /**< 子优先级:2 */
        EXTI_Trigger_Falling,     /**< 触发方式:下降沿触发 */
        GPIO_Mode_IPU             /**< GPIO模式:上拉输入 */
    },
    {
        RCC_APB2Periph_GPIOC,     /**< GPIO时钟使能:GPIOC */
        GPIOC,                    /**< GPIO端口:GPIOC */
        GPIO_Pin_6,               /**< 引脚:PC6 */
        GPIO_PortSourceGPIOC,     /**< 端口源:GPIOC */
        GPIO_PinSource6,          /**< 引脚源:Pin6 */
        EXTI_Line6,               /**< 外部中断线:Line6 */
        EXTI9_5_IRQn,             /**< 中断号:EXTI9_5_IRQn */
        2,                        /**< 抢占优先级:2 */
        2,                        /**< 子优先级:2 */
        EXTI_Trigger_Falling,     /**< 触发方式:下降沿触发 */
        GPIO_Mode_IPU             /**< GPIO模式:上拉输入 */
    },
    {
        RCC_APB2Periph_GPIOC,     /**< GPIO时钟使能:GPIOC */
        GPIOC,                    /**< GPIO端口:GPIOC */
        GPIO_Pin_7,               /**< 引脚:PC7 */
        GPIO_PortSourceGPIOC,     /**< 端口源:GPIOC */
        GPIO_PinSource7,          /**< 引脚源:Pin7 */
        EXTI_Line7,               /**< 外部中断线:Line7 */
        EXTI9_5_IRQn,             /**< 中断号:EXTI9_5_IRQn */
        2,                        /**< 抢占优先级:2 */
        2,                        /**< 子优先级:2 */
        EXTI_Trigger_Falling,     /**< 触发方式:下降沿触发 */
        GPIO_Mode_IPU             /**< GPIO模式:上拉输入 */
    }
};

/** 
 * @brief 按键数量常量
 * @details 计算并存储按键配置数组的元素个数
 */
const uint8_t BOARD_KEYS_NUM = sizeof(BOARD_KEYS) / sizeof(BOARD_KEYS[0]);

/************************************* 外设初始化函数 *******************************************************/

/**
 * @brief 初始化板载LED
 * @details 初始化BOARD_LED1(PB0)和BOARD_LED2(PB1)对应的GPIO引脚
 * @return 无
 */
static void BOARD_InitLEDs(void) {
    // 初始化LED1 (PB0)
    LED_Init(&BOARD_LED1, GPIOB, GPIO_Pin_0);
    
    // 初始化LED2 (PB1)
    LED_Init(&BOARD_LED2, GPIOB, GPIO_Pin_1);
}

/**
 * @brief 初始化板载蜂鸣器
 * @details 初始化BOARD_BEEP(PB8)对应的GPIO引脚
 * @return 无
 */
static void BOARD_InitBeep(void) {
    // 初始化蜂鸣器 (PB8)
    Beep_Init(&BOARD_BEEP, GPIOB, GPIO_Pin_8);
}

/**
 * @brief 初始化板载USART
 * @details 初始化USART1,设置波特率为115200
 * @return 无
 */
static void BOARD_InitUSART(void) {
    // 初始化USART1,波特率为115200
    Usart_Init(&huart1, &usart1_params, 115200);
	
	// 初始化USART4,波特率为9600
    Usart_Init(&huart4, &usart4_params, 9600);
}

/**
 * @brief 初始化开发板按键
 * @details 配置开发板上按键的GPIO和中断参数,使其可以触发中断
 * @return 无
 */
static void BOARD_InitKeys(void) {
    Key_Init(BOARD_KEYS, BOARD_KEYS_NUM);
}

/**
 * @brief 初始化延时模块
 * @details 配置系统时钟,选择指定的定时器作为延时基准
 * @param timer 选择的定时器编号 (如 1 表示 TIM2)
 * @return 无
 */
static void BOARD_InitDelay(uint8_t timer) {
    // 初始化延时模块,选择 TIM2 作为延时定时器
    Delay_Init(timer);
}

/************************************* 全局初始化函数 *******************************************************/

/**
 * @brief 初始化板上所有外设
 * @details 配置NVIC优先级分组,依次初始化LED、蜂鸣器和USART外设
 * @return 无
 * @note NVIC优先级分组配置为2(2位抢占优先级,2位子优先级)
 */
void BOARD_InitAll(void) {
    // 配置中断优先级分组为2(2位抢占优先级,2位子优先级)
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	
	
    // 初始化LED
    BOARD_InitLEDs();				
	
    // 初始化蜂鸣器
    BOARD_InitBeep();						
	
    // 初始化USART
    BOARD_InitUSART();		

	// 初始化按键
    BOARD_InitKeys();  	
	
	// 使用 TIM2 作为延时定时器
    BOARD_InitDelay(1);	
}

5.3 module_config

5.3.1 module_config.h

/**
 * @file module_config.h
 * @brief 模块配置实现文件,初始化所有模块
 * @author 胜磊电子
 * @date 未定义
 * @version 1.0
 * @copyright 淘宝店铺:https://shop475501589.taobao.com/?spm=pc_detail.29232929/evo365560b447259.shop_block.dshopinfo.5dd97dd6JvMuG3<br>
 * 咸鱼店铺:https://www.goofish.com/personal?spm=a21ybx.item.itemHeader.1.c17a3da6hy8k28&userId=3890583014<br>
 * 哔哩哔哩:https://space.bilibili.com/482024430?spm_id_from=333.788.upinfo.detail.click
 */
 
#ifndef MODULE_CONFIG_H
#define MODULE_CONFIG_H

#include "usart.h"
#include "jq6500.h"


// 模块初始化函数
void MODULE_InitAll(void);

#endif /* MODULE_CONFIG_H */

5.3.2 module_config.c

/**
 * @file module_config.h
 * @brief 模块配置实现文件,初始化所有模块
 * @author 胜磊电子
 * @date 未定义
 * @version 1.0
 * @copyright 淘宝店铺:https://shop475501589.taobao.com/?spm=pc_detail.29232929/evo365560b447259.shop_block.dshopinfo.5dd97dd6JvMuG3<br>
 * 咸鱼店铺:https://www.goofish.com/personal?spm=a21ybx.item.itemHeader.1.c17a3da6hy8k28&userId=3890583014<br>
 * 哔哩哔哩:https://space.bilibili.com/482024430?spm_id_from=333.788.upinfo.detail.click
 */

#include "module_config.h"



/**
 * @brief 初始化 MODULE_InitJQ6500 语音模块
 * @details 该函数用于初始化 MODULE_InitJQ6500 语音模块
 * @note 无
 * @return 无
 */
static void MODULE_InitJQ6500(void) {
    JQ6500_Init(UART4);
}


void MODULE_InitAll(void) {
    MODULE_InitJQ6500();	   //液晶屏初始化
}


5.4 jq6500

5.4.1 jq6500.h

#ifndef JQ6500_H
#define JQ6500_H

#include "system_config.h"  // 根据实际使用的MCU型号修改

/**
 * @brief 初始化JQ6500语音模块
 * @param USARTx 串口外设指针 (如USART1, USART2等)
 */
void JQ6500_Init(USART_TypeDef* USARTx);

/**
 * @brief 播放
 */
void JQ6500_Play(void);

/**
 * @brief 暂停
 */
void JQ6500_Pause(void);

/**
 * @brief 停止
 */
void JQ6500_Stop(void);

/**
 * @brief 上一曲
 */
void JQ6500_Previous(void);

/**
 * @brief 下一曲
 */
void JQ6500_Next(void);

/**
 * @brief 音量加
 */
void JQ6500_VolumeUp(void);

/**
 * @brief 音量减
 */
void JQ6500_VolumeDown(void);

/**
 * @brief 设置音量
 * @param volume 音量值(0-30)
 */
void JQ6500_SetVolume(uint8_t volume);

/**
 * @brief 指定曲目播放
 * @param track 曲目编号
 */
void JQ6500_PlayTrack(uint16_t track);

/**
 * @brief 单曲循环开关
 * @param enable 1-开启 0-关闭
 */
void JQ6500_SingleLoop(uint8_t enable);

/**
 * @brief 循环播放
 */
void JQ6500_CyclePlay(void);

/**
 * @brief 随机播放
 */
void JQ6500_RandomPlay(void);

/**
 * @brief 开启EQ模式
 * @param eq 0-正常 1-流行 2-摇滚 3-古典 4-爵士 5-贝斯
 */
void JQ6500_SetEQ(uint8_t eq);

#endif /* JQ6500_H */

5.4.2 jq6500.c

/**
 * @file jq6500.c
 * @brief JQ6500语音模块驱动实现
 * @author 
 * @date 
 * @version 1.0
 */
 

#include "jq6500.h"
#include "stm32f10x_usart.h"  // 根据实际使用的MCU型号修改

// 静态变量存储当前使用的串口外设
static USART_TypeDef* jq6500_usart = NULL;

// JQ6500指令帧格式定义
#define JQ6500_FRAME_HEADER   0x7E  // 帧头
#define JQ6500_FRAME_TAIL     0xEF  // 帧尾
#define JQ6500_FRAME_VERSION  0x02  // 版本号

/**
 * @brief 向JQ6500发送单字节指令
 * @param cmd 指令字节
 */
static void JQ6500_SendCmd(uint8_t cmd) {
    if (jq6500_usart == NULL) return;
    
    uint8_t frame[4] = {
        JQ6500_FRAME_HEADER,
        JQ6500_FRAME_VERSION,
        cmd,
        JQ6500_FRAME_TAIL
    };
    
    // 使用标准库函数发送数据
    for (uint8_t i = 0; i < 4; i++) {
        USART_SendData(jq6500_usart, frame[i]);
        // 等待发送完成
        while (USART_GetFlagStatus(jq6500_usart, USART_FLAG_TXE) == RESET);
    }
}

/**
 * @brief 向JQ6500发送数据
 * @param data 数据缓冲区
 * @param len 数据长度
 */
static void JQ6500_SendData(uint8_t* data, uint16_t len) {
    if (jq6500_usart == NULL || data == NULL || len == 0) return;
    
    for (uint16_t i = 0; i < len; i++) {
        USART_SendData(jq6500_usart, data[i]);
        // 等待发送完成
        while (USART_GetFlagStatus(jq6500_usart, USART_FLAG_TXE) == RESET);
    }
}

/**
 * @brief 初始化JQ6500语音模块
 * @param USARTx 串口外设指针
 */
void JQ6500_Init(USART_TypeDef* USARTx) {
    jq6500_usart = USARTx;
    // 确保串口已在外部初始化完成(波特率、数据位等)
}

/**
 * @brief 播放
 */
void JQ6500_Play(void) {
    JQ6500_SendCmd(0x01);
}

/**
 * @brief 暂停
 */
void JQ6500_Pause(void) {
    JQ6500_SendCmd(0x02);
}

/**
 * @brief 停止
 */
void JQ6500_Stop(void) {
    JQ6500_SendCmd(0x04);
}

/**
 * @brief 上一曲
 */
void JQ6500_Previous(void) {
    JQ6500_SendCmd(0x02);
}

/**
 * @brief 下一曲
 */
void JQ6500_Next(void) {
    JQ6500_SendCmd(0x01);  // 发送7E 02 06 EF
}

/**
 * @brief 音量加
 */
void JQ6500_VolumeUp(void) {
    JQ6500_SendCmd(0x0B);
}

/**
 * @brief 音量减
 */
void JQ6500_VolumeDown(void) {
    JQ6500_SendCmd(0x0C);
}

/**
 * @brief 设置音量
 * @param volume 音量值(0-30)
 */
void JQ6500_SetVolume(uint8_t volume) {
    if (volume > 30) volume = 30;  // 音量范围限制
    
    uint8_t frame[5] = {
        JQ6500_FRAME_HEADER,
        JQ6500_FRAME_VERSION,
        0x13,
        volume,
        JQ6500_FRAME_TAIL
    };
    JQ6500_SendData(frame, 5);
}

/**
 * @brief 指定曲目播放
 * @param track 曲目编号
 */
void JQ6500_PlayTrack(uint16_t track) {
    uint8_t frame[6] = {
        JQ6500_FRAME_HEADER,
        JQ6500_FRAME_VERSION,
        0x07,
        (uint8_t)(track >> 8),    // 曲目高8位
        (uint8_t)(track & 0xFF),  // 曲目低8位
        JQ6500_FRAME_TAIL
    };
    JQ6500_SendData(frame, 6);
}

/**
 * @brief 单曲循环开关
 * @param enable 1-开启 0-关闭
 */
void JQ6500_SingleLoop(uint8_t enable) {
    uint8_t frame[5] = {
        JQ6500_FRAME_HEADER,
        JQ6500_FRAME_VERSION,
        0x19,
        enable ? 0x01 : 0x00,
        JQ6500_FRAME_TAIL
    };
    JQ6500_SendData(frame, 5);
}

/**
 * @brief 循环播放
 */
void JQ6500_CyclePlay(void) {
    JQ6500_SendCmd(0x11);
}

/**
 * @brief 随机播放
 */
void JQ6500_RandomPlay(void) {
    JQ6500_SendCmd(0x18);
}

/**
 * @brief 开启EQ模式
 * @param eq 0-正常 1-流行 2-摇滚 3-古典 4-爵士 5-贝斯
 */
void JQ6500_SetEQ(uint8_t eq) {
    if (eq > 5) eq = 0;  // EQ模式范围限制
    
    uint8_t frame[5] = {
        JQ6500_FRAME_HEADER,
        JQ6500_FRAME_VERSION,
        0x1A,
        eq,
        JQ6500_FRAME_TAIL
    };
    JQ6500_SendData(frame, 5);
}


总结

以上,就是JQ6500的使用。


网站公告

今日签到

点亮在社区的每一天
去签到