STM32f401驱动【语音模块】

物理链路层

STM32f401驱动【语音模块】_第1张图片

STM32f401驱动【语音模块】_第2张图片

 

STM32f401驱动【语音模块】_第3张图片

 需要处理VOICE_BUSY与VOICE_DATA线

VOICE_BUSY:PC4 通用输入

VOICE_DATA:PC5 通用推挽输出

BUSE线说明:有声音输出高、无声音时输出低、发协议码之前先判断是否忙碌

while(VOICE_BUSY);

VOICE_SEND(cmd);

数据层(软件层)

通过数据引脚(DATA)发送特定的协议码播报对应的语音

同步头:8ms高,1ms低

数据1:1.5ms高,0.5ms低

数据0:0.5ms高,1.5ms低

每次发送八位数据、先处理高位(MCU发到高位)

数据处理

//伪代码说明:先发送高位
void fun(u8 data)
{
    u8 i;
    for(i=0;i<8;i++)
    {
        if(data & 0x80)
        {
            DATA=1;
        }
        else
        {
            DATA=0;
        }
        data<<=1;
    }
}

代码流程分析

1.配置IO(PC4 输入 PC5 输出)

/*
Function name:Voice_Broad_Config
Description:MCU驱动语音模块基本配置
param:None
retval:None
Remarks:
PC5-->通用推挽输出
PC4-->通用输入
*/
void Voice_Broad_Config(void)
{
	/*************************库函数********************************/
	GPIO_InitTypeDef gpio_InitTypeDef;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);//打开PC时钟
	
	gpio_InitTypeDef.GPIO_Mode=GPIO_Mode_OUT;//通用输出模式
	gpio_InitTypeDef.GPIO_OType=GPIO_OType_PP;//输出类型 推挽
	gpio_InitTypeDef.GPIO_Pin=GPIO_Pin_5;//引脚
	gpio_InitTypeDef.GPIO_PuPd=GPIO_PuPd_NOPULL;//无上下拉
	gpio_InitTypeDef.GPIO_Speed=GPIO_Fast_Speed;//速度
	GPIO_Init(GPIOC,&gpio_InitTypeDef);
	
	gpio_InitTypeDef.GPIO_Mode=GPIO_Mode_IN;//通用输出模式
	gpio_InitTypeDef.GPIO_Pin=GPIO_Pin_4;//引脚
	GPIO_Init(GPIOC,&gpio_InitTypeDef);
}

2.同步头

/*
Function name:synchro_head
Description:同步头
param:None
retval:None
Remarks:
8ms高 1ms低
*/
void synchro_head(void)
{
	SEND_DATA=1;
	time_delay(8000);
	SEND_DATA=0;
	time_delay(1000);	
}

3.数据1

/*
Function name:data_1
Description:数据1
param:None
retval:None
Remarks:
1.5ms高 0.5ms低
*/
void data_1(void)
{
	SEND_DATA=1;
	time_delay(1500);
	SEND_DATA=0;
	time_delay(500);
}

4.数据0

/*
Function name:data_0
Description:数据0
param:None
retval:None
Remarks:
0.5ms高 1.5ms低
*/
void data_0(void)
{
	SEND_DATA=1;
	time_delay(500);
	SEND_DATA=0;
	time_delay(1500);
}

5.发送协议码(按先发送高位来)

/*
Function name:send_data_high
Description:先发送数据最高位
param:u8 data
retval:None
Remarks:
*/
void send_data_high(u8 data)
{
	u8 i;
	synchro_head();
	for(i=0;i<8;i++)
	{
		if(data & 0x80)//第二种方法
		{
			data_1();
		}
		else
		{
			data_0();
		}
		data<<=1;
	}
}

6.判断BUSY线不忙的时候发(发声音时忙碌,无声音时不忙碌):注意两句话发出的间隔不能小于等于1ms

for(i=0;i<3;i++)
{
	send_data_high(i);
	while(REV_DATA);
	Delay_us(1100);
}

你可能感兴趣的:(单片机MCU驱动,stm32,单片机,嵌入式硬件)