STM32驱动JQ8900语音模块

上次写了esp32驱动JQ8900模块,我做设计一般会把外设先在esp32上实现一般,再移植到比较复杂的stm32上去。直接上正常运行的干货代码。


一、硬件准备

STM32F10x系列任意开发板(这里我使用的是f103zet6正点原子开发板)
JQ8900播报模块一个,喇叭一个,12V/5V电源适配器一个,杜邦线若干

二、程序编写

1.jq8900.c

代码如下:

#include "jq8900.h"
#include "delay.h"
#include "stm32f10x.h"
 
///
//函	  OnUart_GPIO(void)
//功	  能:语音模块一线串口IO口
//输入参数: void
//输出参数: void
//说	  明:
//
void OnUart_GPIO(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
 
		RCC->APB2ENR|=1<<3;   //GPIOB
		
		//GPIOB.11
		GPIOB->CRH&=0xFFFF0FFF;     //清零 
		GPIOB->CRH|=0x00003000;     //推挽输出	50MHZ
		GPIOB->ODR=~(1<<11);        //B.11低	
 
	
}
void delay1_us(u32 nTimer)
{
	u32 i=0;
	for(i=0;i<nTimer;i++){
		__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
		__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
		__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
		__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
		__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
	}
}
///
//函	  数:SendData(u8 addr)
//功	  能:语音模块一线串口
//输入参数: addr要发送的0x数
//输出参数: void
//说	  明:
//
void SendData(u8 addr)//发送函数。
{
    u8 i;
 
     /*发送时关掉中断,防止中断影响时序  */
    SDA = 1; /*开始拉高*/
    delay1_us ( 1000 );
    SDA = 0; /*开始引导码*/
    delay1_us ( 3200 );/*此处延时最少要大于2ms*/
    for ( i = 0; i < 8; i++ ) /*总共8位数据  */
    {
        SDA = 1;
        if ( addr & 0x01 ) /*3:1表示数据位1,每个位用两个脉冲表示  */
        {
            delay1_us ( 600 );
            SDA = 0;
            delay1_us ( 200 );
        }
        else              /*1:3表示数据位0 ,每个位用两个脉冲表示  */
        {
            delay1_us ( 200 );
            SDA = 0;
            delay1_us ( 600 );
        }
        addr >>= 1;
    }
    SDA = 1;
    
		//恢复中断
}

这段代码主要是对语音模块的一线串口进行了初始化和发送数据。

在初始化过程中,使用GPIOB.11作为一线串口的数据线,设置为推挽输出模式,并将其拉低。

在发送数据时,先将数据线拉高1ms作为起始信号,然后发送引导码,引导码是一个2ms以上的低电平,表示数据传输开始。接着发送数据,每个数据位用两个脉冲表示,其中数据位1用高电平占600us和低电平占200us的两个脉冲表示,数据位0用高电平占200us和低电平占600us的两个脉冲表示。最后将数据线拉高,表示数据传输结束。

需要注意的是,在发送数据时需要关闭中断,以防止中断影响时序。在发送完数据后需要恢复中断。

2.jq8900.h

代码如下:

#ifndef __JQ8900_H
#define __JQ8900_H
 
#include "sys.h"
 
#define SDA PBout(11)
 
void SendData ( u8 addr );    //发送函数。
void OnUart_GPIO(void);       //GPIO
void delay1_us(u32 nTimer);
void show_number1();
#endif

3.main.c

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "jq8900.h"

 int main(void)
 {	
	delay_init();	    //延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 
	OnUart_GPIO();
	while(1)
	{
    show_number1();
    delay_ms(2000);
	}
 }

十分简单的一段代码,初始化一线串口后,死循环里调用函数show_number1(),每隔2秒播放一次音频。与esp32调用音频类似,同样是编写了播放音频1的程序。

void show_number1()
{
    //设置音量为20
    SendData(0x0a);    //清空数字
    SendData(0x02);    //音量20
    SendData(0x00);
    SendData(0x0c);    //设置音量
    delay_ms(2000);    //延时
    
    //选取曲目1播放
    SendData(0x0a);//清空数字
    SendData(0x01);//曲目数字,对应00001.mp3
    SendData(0x0b);//选曲播放
    delay_ms(2000);
    
    //开始播放
    //SendData(0x11);//开始播放
    //delay(2000);
}

这段代码主要是对语音模块进行操作,实现了播放指定曲目和设置音量等功能。

在播放指定曲目时,通过发送曲目对应的数字和选曲播放命令,让语音模块播放指定曲目。在这段代码中,选取曲目1进行播放。

在设置音量时,通过发送音量对应的数字和设置音量命令,让语音模块设置指定的音量。在这段代码中,设置音量为20。

三、音频替换

JQ8900可以通过数据线与电脑连接,类似一个小型U盘,我们可以借助一些文字转语言的软件,生成一些想要的.MP3格式文件,并修改命名为0000x。注意,JQ8900的flash只有4M,故一些大型音频最好别导入,太占空间。

总结

水了一篇文章,不过也完成了对JQ8900模块的进一步应用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值