STM32F4XX 使用 JQ8400 FL 语音模块播放声音

 

  • 一开始打算用单总线的通信方式

  • 通过文档上的介绍找到 ONE LINE 的一线串口脚

  • //使能GPIO口
    //按照时序图编写程序
    
    /*
    模块——————————单片机
    ONE LINE—————————PC6
    DC-5V———————————5V
    GND———————————GND
    busy         ====    pc8
    
    
    */
     
    /*
     * 功  能:ONEUART初始化
     * 参  数:无
     * 返回值:无
     */
    void ONEUART_Init(void)
    {
    	//定义一个 GPIO 结构体变量
    	GPIO_InitTypeDef  GPIO_InitStruct ;
    
    	//1、开启 GPIOG 组时钟
    	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
    
    	//2、配置以及初始化 GPIO
    	GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_OUT;   	//输出模式
    	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;		//推挽
    	GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;		//上拉
    	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;	//输出速度
    	GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_6;  		//设置引脚
    	GPIO_Init(GPIOG, &GPIO_InitStruct);				//使用配置好的结构体去初始化相应的GPIO口
    	// 拉高电平
    	GPIO_SetBits(GPIOC,GPIO_Pin_6);
    	
    	
    		//2、配置以及初始化 GPIO
    	GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_IN;   	//输入模式
    	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;		//推挽
    	GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;		//上拉
    	GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_8;  		//设置引脚
    	GPIO_Init(GPIOG, &GPIO_InitStruct);				//使用配置好的结构体去初始化相应的GPIO口
    	// 拉高电平
    	GPIO_SetBits(GPIOC,GPIO_Pin_8);
    }
    
    /*
     * 功  能:ONEUART发送字节
     * 参  数:无
     * 返回值:无
     */
    void ONEUART_SendData(u8 addr)
    {
    		u8 i = 0;
    		//开始拉高
    		ONEUART_out(1);
    		delay_ms(2);
    		ONEUART_out(0);
    		delay_ms(4);
    		//send byte 
    		for( i = 0 ; i < 8 ; i++)
    		{
    			
    		ONEUART_out(1);
    	
    				if(addr & 0x01)
    				{
    						delay_us(1200);
    						ONEUART_out(0);
    						delay_us(400);
    				}
    				else 
    				{
    					delay_us(400);
    					ONEUART_out(0);
    					delay_us(1200);
    				}
    				addr =addr>>1; 
    		}
    		ONEUART_out(1);
    		delay_ms(10);
    }
    

     

 

查看手册

 

 

 

 

 

 

音频文件已经提前加入JQ8400芯片,程序执行后busy位(播放会拉高)始终为低电位,

一开始怀疑时序函数有问题,用dht11接收了数据后发现正常,

然后怀疑是模块有问题,决定再试试串口通信

 

 

 

================= == == ======== 分割线 ==============================================

继续查看手册

 

 

 

 



/*
RX         -----   TX PA3
TX        ------   RX PA2

*/
 
 
 /*
 * 功  能:UART2 的初始化
 * 参  数:
 * 		BaudRate	--->波特率,就是常见的那些 115200 9600 38400 ...
 * 返回值:无
 * 说  明:收发双方的波特率必须一致
 */
 
 
 
 
 
 	void UART2_Init(uint32_t BaudRate)
{	

	GPIO_InitTypeDef GPIO_InitStruct;
	USART_InitTypeDef USART_InitStruct;
	NVIC_InitTypeDef NVIC_InitStruct;
	
	//1、开启串口1时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
	
	//2、开启 PA2 PA3 时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA ,ENABLE);
	
	//3、将 PA2 PA3 复用为 串口1 的特殊功能引脚
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART1);
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART1);
	
	GPIO_InitStruct.GPIO_Mode   = GPIO_Mode_AF;//复用功能!!!!
	GPIO_InitStruct.GPIO_OType	= GPIO_OType_PP;
	GPIO_InitStruct.GPIO_Pin    = GPIO_Pin_2|GPIO_Pin_3;
	GPIO_InitStruct.GPIO_PuPd   = GPIO_PuPd_UP;
	GPIO_InitStruct.GPIO_Speed  = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStruct);
	
	//4、配置串口的模式
	USART_InitStruct.USART_BaudRate = BaudRate;   //波特率
	USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//关闭硬件流控
	USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发
	USART_InitStruct.USART_Parity = USART_Parity_No;    		//无检验位
	USART_InitStruct.USART_StopBits = USART_StopBits_1;  		//1位停止位
	USART_InitStruct.USART_WordLength = USART_WordLength_8b; 	//8位数据位
	USART_Init(USART2 ,&USART_InitStruct);
	
	//5、开启 接收 中断
	USART_ITConfig(USART2 , USART_IT_RXNE ,ENABLE);
	
	//6、使能 NVIC 
	NVIC_InitStruct.NVIC_IRQChannel = USART2_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
	NVIC_Init(&NVIC_InitStruct);	
	
	USART_Cmd(USART2 ,ENABLE);
 
 }
 

 主函数发送 AA 02 00 AC 开始播放

 

		//发送数据
	USART_SendData(USART2,0xaa);

			//检测是否发送完成
		while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
		//发送数据
	USART_SendData(USART2,0x02);
	
			//检测是否发送完成
		while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
		//发送数据
	USART_SendData(USART2,0x00);
	
			//检测是否发送完成
		while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
		//发送数据
	USART_SendData(USART2,0xac);
	
	
		delay_s(4);
	

 

 

发现busy拉高证明模块收到了我的播放指令,但是喇叭只有咚咚声音,经过排查,发现是由于供电不足造成的,于是多加了一条供电线用电报功能,成功放出JQ8400里面的音频文件

  • 6
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
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信号输出指示 成熟的指令和指令解析,让应用更稳定 专用配套上位机,快速上手,方便调试,指令自动生成

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值