谁能帮我解释一下这段程序,是WT588D语音芯片的三线发码子程序

谁能帮我解释一下这段程序,是WT588D语音芯片的三线发码子程序,第1张

你结合时序图看会比较清楚,发码之前先给出复位信号,复位脚拉低5ms后在拉高延时20ms芯片复位,然后拉低片选端延时5ms激活芯片,再然后发送8位数据低位在先高位在后(在时钟的下降沿设置数据上升沿锁存数据)。8位数据发送完后需要把片选、数据端、时钟端置高。完成后需要延时20MS在判断忙信号,芯片放音时忙信号脚输出低电平,空闲时输出高电平。在忙信号端输出低电平时表示语音没有播放完成需要等待,置高后在发送下一个地址数据放音,不太清楚你If(dat==1)的意义。

我们这学期刚学的凌阳61板,语音程序有A2000,S480,S2403种算法,我先给个A2000的,还需要的话发消息给我,一起学习啦!

#include "A2000.h"

#define SPEECH_1 0

#define DAC1 1

#define DAC2 2

#define Ramp_UpDn_Off 0

#define Ramp_UpDn_On 3

#define Manual 0

#define Auto 1

#define Full 1

#define Empty 2

#define Mode 1

//===============================================================================================

// 函数: main()

// 描述:主函数

//===============================================================================================

main()

{

extern long RES_WW_24K_SA,RES_WW_24K_EA //定义语音资源的首末地址标号

long int Addr //定义地址变量

int Ret = 0 //定义获取语音数据变量并初始化

if(Mode == 1) //采用自动方式播放

{

SACM_A2000_Initial(1)//自动方式播放初始化

SACM_A2000_Play(SPEECH_1,DAC1,Ramp_UpDn_On) //定义语音索引号、播放通道、允许音量增/减调节

while(1){

F_ClearWatchdog()

SACM_A2000_ServiceLoop()} //获取语音数据并将其填入解码队列

}

if(Mode == 0)//采用非自动方式播放

{

Addr=RES_WW_24K_SA//送入语音队列的首址

SACM_A2000_Initial(0) //非自动方式播放的初始化

SACM_A2000_InitDecoder(DAC1) //开始对A2000的语音数据以非自动方式解码

while(SACM_A2000_TestQueue()!=Full) //测试并获取语音队列的状态

{

Ret=SP_GetResource(Addr) //从资源文件里获取一个字型语音数据

SACM_A2000_FillQueue(Ret) //获取语音编码数据并填入语音队列等候解码

Addr++

}

while(1)

{

if(SACM_A2000_TestQueue()!=Full)

{

Ret =SP_GetResource(Addr)

SACM_A2000_FillQueue(Ret)

Addr++

}

if(Addr<RES_WW_24K_EA ) //如果该段语音未播完,即未到达末地址时

SACM_A2000_Decoder() //获取资源并进行解码,再通过中断服务子程序送入DAC通道播放

else

SACM_A2000_Stop() //否则,停止播放

F_ClearWatchdog()//清看门狗

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11316334.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存