WIN5语音ic注意事项
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
總結
以上是生活随笔為你收集整理的WIN5语音ic注意事项的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TSM12M触摸芯片注意事项
- 下一篇: AB1601中volatile的使用