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
还不如不用。
主要代码如下:
#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
相关文章推荐
- Torch+DeepSpeech2的语音识别注意事项
- HTML5语音播报引发的:关于TTS引擎扩展及修复注意事项
- 语音增加数据的操作方法与注意事项
- Kaldi语音识别注意事项
- IC 软件使用注意事项
- USES_CONVERSION的使用和注意事项
- Widget中的一个注意事项
- 数据库乱码解决,应注意事项 --struts+spring+hibernate环境下
- Linux for循环执行命令注意事项
- Fragment使用的注意事项
- RHEL4- ssh服务(十三)ssh文章系列总结及ssh防范之DenyHosts的注意事项
- Spring集成Hibernate注意事项
- Android Studio使用注意事项
- Java中的BigDecimal使用注意事项
- PHP编程注意事项
- 面试求职注意事项与技巧(二)
- 上传图片时,需注意事项
- Android点九图注意事项
- 2015/12/29 Java语言概述 操作中注意事项
- 『编程练习』九九乘法表 与 使用文件对象的注意事项