您的位置:首页 > 其它

WIN5语音ic注意事项

2017-12-05 20:36 190 查看
1.最好不要使用busy脚进行检测,比较坑。只要播放了不存在的语音段,那么那个busy脚一直都是忙状态,断电后重启都没用。

还不如不用。

主要代码如下:

#define SINGLE_LINE_MODE 1

#define WIN5_DATA_IO PIO22

#define WIN5_BUSY_IO PIO27

#ifdef SINGLE_LINE_MODE

void DoorWin5IoInit(void)//io初始化

{
DRV_PinMux_SigSet((1L << WIN5_DATA_IO), PIN_GPIO);
DRV_Gpio_DirSet((1L << WIN5_DATA_IO), PIO_OUTPUT);
DRV_Gpio_PullSet((1L << WIN5_DATA_IO), PULL_UP);
DRV_Gpio_ValSet((1L << WIN5_DATA_IO), PIO_HIGH);

DRV_PinMux_SigSet((1L << WIN5_BUSY_IO), PIN_GPIO);
DRV_Gpio_DirSet((1L << WIN5_BUSY_IO), PIO_INPUT);
//DRV_Gpio_PullSet((1L << WIN5_BUSY_IO), PULL_UP);
DRV_Gpio_PullSet((1L << WIN5_BUSY_IO), PULL_DOWN);

}

void DoorWin5IoHigh(void)//输出高电平

{
DRV_Gpio_ValSet((1L << WIN5_DATA_IO), PIO_HIGH);

}

void DoorWin5IoLow(void)//输出低电平

{
DRV_Gpio_ValSet((1L << WIN5_DATA_IO), PIO_LOW);

}

static void DoorWin5PulseWidthLow(void)//代表输出0

{
DoorWin5IoHigh();
DoorUnit1UsDelay(400);
DoorWin5IoLow();
DoorUnit1UsDelay(1200);

}

static void DoorWin5PulseWidthHigh(void)//代表输出1

{
DoorWin5IoHigh();
DoorUnit1UsDelay(1200);
DoorWin5IoLow();
DoorUnit1UsDelay(400);

}

static void DoorWin5SendStart(void)

{
DoorWin5IoHigh();
DoorWin5IoLow();
DoorUnit1UsDelay(5000);

}

static void DoorWin5SendStop(void)

{
DoorWin5IoHigh();

}

#else

void DoorWin5IoInit(void)//io初始化

{

}

voidDoorWin5ClkHigh(void)//输出高电平

{

}

void DoorWin5ClkLow(void)//输出低电平

{

}

voidDoorWin5DataHigh(void)//输出高电平

{

}

void DoorWin5DataLow(void)//输出低电平

{

}

static void DoorWin5PulseWidthLow(void)//代表输出0

{
DoorWin5ClkLow();
DoorWin5DataLow();
DoorUnit1UsDelay(300);
DoorWin5ClkHigh();
DoorUnit1UsDelay(300);

}

static void DoorWin5PulseWidthHigh(void)//代表输出1

{
DoorWin5ClkLow();
DoorWin5DataHigh();
DoorUnit1UsDelay(300);
DoorWin5ClkHigh();
DoorUnit1UsDelay(300);

}

static void DoorWin5SendStart(void)

{
DoorWin5ClkLow();
DoorUnit1UsDelay(5000);

}

static void DoorWin5SendStop(void)

{
DoorWin5ClkHigh();

}

#endif

static U8 DoorWin5IsBusy(void)//检查语音芯片是否忙

{
U8 ioValue;
ioValue = DRV_Gpio_PinValGet(WIN5_BUSY_IO);
//printf("ioValue:%d\n", ioValue);
return ioValue;

}

static void DoorWin5WaitReady(void)//忙等待

{
//while(DoorWin5IsBusy() == 0);

}

static void DoorWin5SendOneByte(U8 win5Data)

{
U8 i;
printf("DoorWin5SendOneByte\n");
DoorWin5WaitReady();
DoorWin5SendStart();
for(i=0; i<8; i++)
{
if(win5Data&0x01)
{
DoorWin5PulseWidthHigh();
}
else
{
DoorWin5PulseWidthLow();
}
win5Data >>= 1;
}
DoorWin5SendStop();

}

void DoorWin5SetVolume(U8 volume)//设置音量大小

{
if(volume > 0x0F)
{
return;
}
DoorWin5SendOneByte(0xE0+volume);

}

void DoorPlayOneSection(U8 recordIndex)//播放某段语音

{
if(recordIndex > 0xCF)
{
return;
}
DoorWin5SendOneByte(recordIndex);
printf("DoorPlayOneSection ok:%02x\n", recordIndex);

}

static void DoorPlayCurrentRepeat(void)//循环播放当前语音

{
DoorWin5SendOneByte(0xF2);

}

static void DoorPlayStop(void)//停止播放

{
DoorWin5SendOneByte(0xFE);

}

static void DoorInsertSilentTime(U8 unit10Ms)//插入静止时间

{
DoorWin5SendOneByte(0xF8);
DoorWin5SendOneByte(unit10Ms);

}

static void DoorPlayContinue(U8 num, U8 *section)//连续播放

{
U8 i;
for(i=0; i<num; i++)
{
DoorWin5SendOneByte(0xF3);
DoorWin5SendOneByte(section[i]);
}

}

#if 1

void Win5VoiceTest(void)

{
U8 i;
printf("hello0...\n");
DoorWin5IoInit();
//DoorTimerDelayUnitMs(100);
DoorWin5SetVolume(0x0F);

begin:

for(i=0; i<0xCF; i++)
//for(i=0; i<0x3F; i++)
{
printf("hello...\n");
DoorPlayOneSection(i);
printf("hello1...\n");
DoorTimerDelayUnitMs(2000);
printf("hello2...\n");
DoorTimerDelayUnitMs(2000);
}

/*
printf("hello111...\n");
DoorWin5IoHigh();
DoorTimerDelayUnitMs(2000);
printf("hello222...\n");
DoorWin5IoLow();
DoorTimerDelayUnitMs(2000);
*/

goto begin;

}

#endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: