NV040C语音芯片驱动调试

文章讲述了在调试NV040C语音芯片时遇到的问题,包括对地址的理解错误,发现并非所有地址都有声音,以及在连续播放不同地址声音时需要添加长延时以确保上一次播放结束。由于芯片的busy引脚未连接MCU,无法直接判断播放状态,因此使用RTOS的长延时进行任务切换来避免问题。
摘要由CSDN通过智能技术生成

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有声音,分别对应不同报警等级

    地址数据语音内容
    00H11 genlow.wav
    01H22 genmed.wav
    02H35 Low Prioirty.wav
    03H44 Medium Prioirty.wav
    04H5低级报警
    05H6中级报警
  • 对于此次使用的芯片只定制了最开始的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资源。
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欲盖弥彰1314

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值