×

注意!页面内容来自https://blog.csdn.net/weixin_39986534/article/details/97623125,本站不储存任何内容,为了更好的阅读体验进行在线解析,若有广告出现,请及时反馈。若您觉得侵犯了您的利益,请通知我们进行删除,然后访问 原网页

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

本文记录了作者在使用单片机与JQ8400音频模块进行通信的过程中遇到的问题及解决办法,详细描述了从单总线通信到串口通信的调试过程,包括GPIO配置、时序调整、波特率设置以及供电问题的排查。

 

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

  • 通过文档上的介绍找到 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_GPIOCENABLE);
    
    	//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_USART2ENABLE);
	
	//2、开启 PA2 PA3 时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA ,ENABLE);
	
	//3、将 PA2 PA3 复用为 串口1 的特殊功能引脚
	GPIO_PinAFConfig(GPIOAGPIO_PinSource2GPIO_AF_USART1);
	GPIO_PinAFConfig(GPIOAGPIO_PinSource3GPIO_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(USART2USART_FLAG_TXE) == RESET);
		//发送数据
	USART_SendData(USART2,0x02);
	
			//检测是否发送完成
		while(USART_GetFlagStatus(USART2USART_FLAG_TXE) == RESET);
		//发送数据
	USART_SendData(USART2,0x00);
	
			//检测是否发送完成
		while(USART_GetFlagStatus(USART2USART_FLAG_TXE) == RESET);
		//发送数据
	USART_SendData(USART2,0xac);
	
	
		delay_s(4);
	

 

 

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

确定要放弃本次机会?
福利倒计时
: :

立减 ¥

普通VIP年卡可用
立即使用
3 条评论 您还未登录,请先 登录 后发表或查看评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值