NV040C语音芯片调试
查看手册
- 看到此处的指令误以为所有地址都有声音。
驱动时序模拟
时序模拟:
#define SHORT_TIMING 0
#define LONG_TIMING 1
#define TIMING_OPT LONG_TIMING
#if TIMING_OPT == SHORT_TIMING
#define TIMING_DELAY_1() osal_delay_us(600)
#define TIMING_DELAY_3() osal_delay_us(1800)
#else
#define TIMING_DELAY_1() osal_delay_ms(1)
#define TIMING_DELAY_3() osal_delay_ms(3)
#endif
/* 帧间隔时间,频繁发送数据需要间隔100ms以上 */
#define TIMING_IFS() osal_delay_ms(101)
/*
* 逻辑1 高电平:低电平=3:1 400us :1200us 到 1ms : 3ms 范围
* 逻辑0 高电平:低电平=1:3
* 低位先发送
*/
static void NV040C_BasicSend(uint8_t cmd)
{
uint8_t i;
NV040C_SDA(0);
osal_delay_ms(5); /* 头码 4~6 ms */
for (i = 0; i < 8; i++)
{
NV040C_SDA(1);
if (cmd & 1) /* 写1 */
{
TIMING_DELAY_3();
NV040C_SDA(0);
TIMING_DELAY_1();
}
else /* 写0 */
{
TIMING_DELAY_1();
NV040C_SDA(0);
TIMING_DELAY_3();
}
cmd >>= 1; /*地址值右移一位*/
}
NV040C_SDA(1); /* 指令发送完毕需要拉高 */
TIMING_IFS();
}
调试
调试的谬误:
误以为所有地址都有声音,所以随便选择了一个地址进行调试,调试大半天都没有声音,误以为是时序问题调试了好久。后面发现是地址没有声音数据的。
-
芯片声音地址0x00-0xDF不是每个地址都有声音。
-
芯片某个声音地址是否有声音取决用户是否和厂家联系定制。
-
项目定制的只有声音地址0x00~0x05有声音,分别对应不同报警等级
地址 数据 语音内容 00H 1 1 genlow.wav 01H 2 2 genmed.wav 02H 3 5 Low Prioirty.wav 03H 4 4 Medium Prioirty.wav 04H 5 低级报警 05H 6 中级报警 -
对于此次使用的芯片只定制了最开始的6个地址有声音,所以地址0x06及以上的都是没有声音的。
调试无法连续间隔播放不同地址声音问题,调试发现该问题解决需要在播放一个声音结束后需要一个长延时:
void nv040cLoop(void)
{
osal_delay_ms(1000);
BSP_NV040C_PlayVoice(NV040C_VOICE_ID_GENLOW);
osal_delay_ms(1000);
BSP_NV040C_PlayVoice(NV040C_VOICE_ID_GENMED);
osal_delay_ms(1000);
BSP_NV040C_PlayVoice(NV040C_VOICE_ID_LOW_PRI);
osal_delay_ms(1000);
BSP_NV040C_PlayVoice(NV040C_VOICE_ID_MEDIUM_PRI);
osal_delay_ms(1000);
BSP_NV040C_PlayVoice(NV040C_VOICE_ID_LOW_ALARM);
osal_delay_ms(1000);
BSP_NV040C_PlayVoice(NV040C_VOICE_ID_MEDIUM_ALARM);
}
- osal_delay_ms(1000); 长延时1s等待上一次声音播放结束。
- 由此推测原因是因为声音在播放需要比较长的时间,在播放期间写入数据会出现问题,正确做法是等待播放结束再写入语音地址。
- 由于芯片busy引脚没有连接MCU,无法通过该引脚判断语音是否在播放,调试只能通过长延时等待播放结束,好在使用RTOS,RTOS长延时会进行任务切换不会浪费CPU资源。