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资源。
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐