物理链路层
需要处理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);
}