STM32串口通信实践:JQ8900-16P模块连接指南
这篇文章将介绍JQ8900一线通信实现音频播放。
目录
一、硬件JQ8900-16
二、引脚说明
三、使用说明
四、代码编写
五、音频
六、现象
一、硬件JQ8900-16(有很多功能特征,不一一列举)
1、支持MP3 WAV 硬件解码
2、多种控制模式、两线串口模式、一线串口控制、按键模式
二、引脚说明
STM32采用型号为F103RCT6
此处只介绍了本次一线串口用到的引脚 ,VPP作为一线串口,我接在了STM32的PA10引脚(本程序用到了软件触发,因此引脚可任意选取); BUSY空闲不接;VCC、GND分别接电源正负极;SPK-、SPK+直接和喇叭相连接。
引脚序号 |
引脚名称 |
功能描述 |
备注 |
1 |
VPP |
一线串口 |
|
2 |
BUSY |
播放指示灯 |
有音频输出时高,无音频输出低 |
3 |
GND |
地 |
电源地 |
4 |
DC-5V |
模块电源输入 |
不可以超过5.2V |
5 |
SPK- |
喇叭+ |
接2W/8R以下无源喇叭 |
6 |
SPK+ |
喇叭- |
|
三、使用说明(因为我所做的项目对此模块要求较低,这里只做比较基础的功能使用)
这个时序图很重要,JQ8900的初始化和使用主要依靠此图。
值得注意的是:
以下为命令说明:
0x00~0x09:仅表示数字0~9。
0x0a: 为单字节控制指令,用于清空上一次接收的数字。
0x0b~0x10:为多字节控制指令,需要和0x00~0x09配合使用。
0x11~0x1c:为单字节控制指令,只需要发送一个控制指令即可。
选取播放说明:最多只能存储19份音频,1-9份音频和10-19的音频的代码略有不同。
Eg: 选曲目号2播放
步骤如下: 清空数字->曲目号->“选曲播放”控制指令。
发送代码 0x0A->0x02->0x0b
使用单片机发送函数如下:
SendData(0x0a);
SendData(0x02);
SendData(0x0b);
选曲目号15播放
SendData(0x0a);
SendData(0x01);
SendData(0x05);
SendData(0x0b);
四、代码编写
1、JQ8900.C
#include "JQ8900.h"
#include "DELAY.H"
#include "stm32f10x.h"
/**
* @brief GPIO初始化
* @param 无
* @retvel 无
*/
void JQ8900_Init(void)
{
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_OD ;
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_10; //此处采用软件触发,引脚可任意选取
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz ;
GPIO_Init (GPIOA,&GPIO_InitStructure);
}
/**
* @brief 发送字节函数
* @param 字节数据
* @retvel 无
*/
void SendData(uint8_t Data)
{
uint8_t m;
GPIO_WriteBit(GPIOA,GPIO_Pin_10,Bit_SET);//PA10置高电平
Delay_us(1000);
GPIO_WriteBit(GPIOA,GPIO_Pin_10,Bit_RESET);//PA10置低电平
Delay_us (4000); //最好给4ms的延时
for( m=0 ; m<8 ; m++)
{
GPIO_WriteBit(GPIOA,GPIO_Pin_10,Bit_SET);
if(Data&0x01)
{
Delay_us(500);
GPIO_WriteBit(GPIOA,GPIO_Pin_10,Bit_RESET);
Delay_us(210);
}
else
{
Delay_us (210);
GPIO_WriteBit(GPIOA,GPIO_Pin_10,Bit_RESET);
Delay_us(500);
}
Data>>=1;
}
GPIO_WriteBit(GPIOA,GPIO_Pin_10,Bit_SET);
}
/**
* @brief 选曲播放函数
* @param 曲目号Num_L(0x__),Num_H(0x__)
* @retvel 无
*/
void Play_Spe_Song(uint8_t Num_L,uint8_t Num_H,uint32_t xms)
{
SendData(0x0A);
if(Num_H==0)
{
SendData(Num_L);
Delay_ms (xms); //延时,根据音频时长进行调整
}
else
{
SendData(Num_L);
SendData(Num_H);
Delay_ms (xms); //延时,根据音频时长进行调整
}
SendData(0x0B);
}
2、JQ8900.H
#ifndef __JQ8900_H__
#define __JQ8900_H__
#include "stm32f10x.h"
void JQ8900_Init(void);
void SendData(uint8_t Data);
void Play_Spe_Song(uint8_t Num_L,uint8_t Num_H,uint32_t xms);
#endif
3、main.c (实现功能从音频1自动播放到音频8)
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.H"
#include "JQ8900.H"
int main(void)
{
JQ8900_Init();
while(1)
{
uint8_t m=0x00;
int i;
for(i=0;i<9;i++)
{
Play_Spe_Song(m,0x00,1000);
m+=1;
}
}
}
五、音频
链接:https://pan.baidu.com/s/1txL3wMIC8URzZIcZ1JR8wA
提取码:1111
作者:只会C语言·