WTN6170驱动

这里只是把数据手册中使用到的重要部分摘取出来,完整版请看WTN6170,这只是这个项目中的一个驱动代码,后续继续更新项目代码。项目实现功能请先看,智能门锁专栏 / 智能门锁功能实现这篇文章,里面介绍了实现的功能,后续将更新详细项目介绍

一. 简介

  • 语音长度为170s,音频采样率目前最高可达 32kHz,16 级音量控制,两种音频输出方式 PWM 输出和 DAC 输出。精准的+/-1%内部震荡,不需要加外部震荡,具备超低功耗待机。

  • 引脚说明

    Pad Name Pad No. ATTR. Description 描述
    PA2 1 I/O 忙信号输出
    PA1 2 I/O 两线串口时钟信号输入端/一线串口数据信号输入端/数脉冲数据信号输入端
    PA0 3 I/O 两线串口数据信号输入端/复位脚
    PA3 4 I/O 暂未使用(NC)
    PWM- 5 out PWM 输出脚
    VDD 6 Power 电源正极
    PWM+/DAC 7 I/O PWM、DAC 输出脚
    GND 8 Power 电源负极
  • 通信方式:一线串口模式可以利用 MCU 通过 DATA 线给 WTN6 系列语音芯片发送数据以达到控制的目的。可以实现控制语音播放、停止、循环等。

  • 一线语音地址对应关系:

    ps:如要播放该地址语音,只要发送该地址就能自动播放该地址语音,两条地址指令时间间隔需大于 4ms。

    数据(十六进制) 功能
    00H 播放第0段语音
    01H 播放第1段语音
    02H 播放第2段语音
    ... ...
    DDH 播放第221段语音
    DEH 播放第222段语音
    DFH 播放第223段语音
  • 一线语音及命令码对应表:

    ps:在未停止播放的情况下,如果没有命令码 F3H 或者 F8H,只有语音地址,就会打断之前在播放的语音,连码指令必须配合地址使用(例如:F3H+00H+F3H+01H)。F3H 和 F8H 可以方便的组合不同语音,F3H+地址+F8H+0AH(100ms),最大可组合 10 组内容,首组指令必须为 F3+地址;也可以通过判断语音播放时的 BUSY 电平和播放结束时的 BUSY 电平的变化,完成组合播放。

    命令码 功能 描述
    E0H-EFH 音量调节 E0音量最小,EF音量最大,共16级音量调节。
    在语音播放中、播放结束或待机状态发送此命令调节音量。
    F2H 循环播放当前语音 执行此命令可循环播放当前段语音,可在语音播放/停止时发送。
    注意:循环指令执行过程中可被FE命令、普通地址指令、F3/F8组合指令打断并失效;需先发播放指令,再发循环指令。
    F3H 连码播放 F3H+语音地址A, F3H+语音地址B, F3H+语音地址C...
    播放地址A时不打断,播完A后自动播B、C...
    要求:F3与地址间需加2ms延时。
    F8H 插入静音 F8H+静音时间(10ms为单位),播放完一个地址后插入静音。
    FEH 停止播放当前语音 执行此命令可立即停止当前段语音播放。

二. 关键参数

只使用DATA引脚即可,不用判断BUSY,发送语音时使用连码发送。

  • 一线串口时序图:

image-20250813185159607

先把数据线拉低 4~20ms 后,推荐 5ms,发送 8 位数据,先发送低位,再发送高位,使用高电平和低电平比例来表示每个数据位的值。(测试5ms不太行,改成10ms)

image-20250813184306206

注意:必须高电平在前,低电平在后。推荐使用 200us:600us。取值范围:40us:120us ~ 400us:1200us。注意使用 3:1 和 1:3 电平比例以保障通讯稳定。

  • 假如我们要发送 96H,那么他对应的时序图,如下所示:

image-20250813185643269

  • 假如我们要让芯片依次播放 01/02/03/04 地址的语音内容。即连码指令播放、F3+01+F3+02+F3+03+F3+04.对应时序可以如下图所示:

image-20250813185702944

  • 因为 WTN6 上电需要一定的初始化时间(约 100MS 左右),而且初始化期间无法响应指令,因此建议用户使用连码功能时,一组连码地址发送之后延时 2ms 再发送下一组连码地址;但是 F3 与地址之间的间隔还是 2ms;

  • 芯片 IO 口,发完语音后拉高等待下次发送语音。

三. 代码

HAL_gpio.h部分代码

/* WTN6170 的DATA和BUSY引脚 */
#define WTN6170_DATA_GPIO                                            GPIO_NUM_9
#define WTN6170_BUSY_GPIO                                            GPIO_NUM_7

/* 设置 WTN6170 引脚高低电平 */
#define WTN6170_LEVEL_HIGH           gpio_set_level(GPIO_NUM_9, GPIO_LEVEL_HIGH)
#define WTN6170_LEVEL_LOW             gpio_set_level(GPIO_NUM_9, GPIO_LEVEL_LOW)

驱动层

Dri_WTN6170.c

#include "Dri_WTN6170.h"

/**
 * @brief 初始化BDR6120S
 *
 * @param 无
 *
 * @return 无
 */
void WTN6170_Init(void)
{
    /* 先将数据线拉高 */
    WTN6170_LEVEL_HIGH;
}

/**
 * @brief BDR6120S发送命令
 *
 * @param cmd: 命令码
 *
 * @return 无
 */
void WTN6170_send_cmd(uint8_t cmd)
{
    uint8_t i = 0;
    /* 先将数据线拉低10ms */
    WTN6170_LEVEL_LOW;
    vTaskDelay(pdMS_TO_TICKS(10));
    for(i = 0; i < 8; i++)
    {
        if(1 == (cmd & 0x01))                                  /* 发送1 */
        {
            /* 发送1 高电平600us,低电平200us */
            WTN6170_LEVEL_HIGH;
            vTaskDelay(usleep(600));
            WTN6170_LEVEL_LOW;
            vTaskDelay(usleep(200));
        } 
        else                                                   /* 发送0 */
        { 
            /* 发送1 高电平200us,低电平600us */
            WTN6170_LEVEL_HIGH;
            vTaskDelay(usleep(200));
            WTN6170_LEVEL_LOW;
            vTaskDelay(usleep(600));
        }
        cmd >>= 1;
    }
    /* 先将数据线拉高 */
    WTN6170_LEVEL_HIGH;
    vTaskDelay(20);
}

Dri_WTN6170.h

#ifndef DRI_WTN6170_H
#define DRI_WTN6170_H

#include <stdio.h>

#include "freertos/FreeRTOS.h"
#include "sys/unistd.h"

#include "HAL_gpio.h"
                
/* WTN6170 命令码 */       
/* 基础提示音(0-25) */                
#define WTN6170_VOICE_20MS_SILENCE          0   /* 20ms静音                */
#define WTN6170_VOICE_0                     1   /* 0                       */
#define WTN6170_VOICE_1                     2   /* 1                       */
#define WTN6170_VOICE_2                     3   /* 2                       */
#define WTN6170_VOICE_3                     4   /* 3                       */
#define WTN6170_VOICE_4                     5   /* 4                       */
#define WTN6170_VOICE_5                     6   /* 5                       */
#define WTN6170_VOICE_6                     7   /* 6                       */
#define WTN6170_VOICE_7                     8   /* 7                       */
#define WTN6170_VOICE_8                     9   /* 8                       */
#define WTN6170_VOICE_9                     10  /* 9                       */
#define WTN6170_VOICE_DROP_EFFECT           11  /* 水滴音效                 */
#define WTN6170_VOICE_BUZZER_EFFECT         12  /* 蜂鸣器音效               */
#define WTN6170_VOICE_ALARM_EFFECT          13  /* 报警器音效               */
#define WTN6170_VOICE_DOORBELL_EFFECT       14  /* 门铃音效                 */
#define WTN6170_VOICE_VOLUME_ADJUST         15  /* 音量调节音效             */
#define WTN6170_VOICE_FAILURE_EFFECT        16  /* 失败音效                 */
#define WTN6170_VOICE_CHOOSE_OPEN_MODE      17  /* 请选择开门模式           */
#define WTN6170_VOICE_FINGERPRINT           18  /* 指纹                    */
#define WTN6170_VOICE_PASSWORD              19  /* 密码                    */
#define WTN6170_VOICE_SENSOR_CARD           20  /* 感应卡                  */
#define WTN6170_VOICE_KEY                   21  /* 钥匙                    */
#define WTN6170_VOICE_REMOTE_CONTROL        22  /* 遥控器                  */
#define WTN6170_VOICE_SINGLE_UNLOCK         23  /* 单一开锁                */
#define WTN6170_VOICE_COMBINATION_UNLOCK    24  /* 组合开锁                */
#define WTN6170_VOICE_DOOR_OPEN_EFFECT      25  /* 开门音效+门已开         */
/* 操作提示 */                    
#define WTN6170_VOICE_DOOR_CLOSED           26  /* 关门音效+门已关         */
#define WTN6170_VOICE_DOOR_NOT_CLOSED       27  /* 提示音效+门未关好,请注意 */
#define WTN6170_VOICE_ILLEGAL_OPERATION     28  /* 非法操作                */
#define WTN6170_VOICE_SUCCESS               29  /* 成功                    */
#define WTN6170_VOICE_FAILURE               30  /* 失败                    */
#define WTN6170_VOICE_CONFIRM               31  /* 确认                    */
#define WTN6170_VOICE_INVALID               32  /* 无效                    */
#define WTN6170_VOICE_END                   33  /* 结束                    */
#define WTN6170_VOICE_PRESS_STAR_KEY        34  /* 请按*号键               */
#define WTN6170_VOICE_PRESS_STAR_KEY_2      35  /* 请按*号键               */
#define WTN6170_VOICE_DELETE_SUCCESS        36  /* 删除成功                */
#define WTN6170_VOICE_DELETE_FAILURE        37  /* 删除失败                */
#define WTN6170_VOICE_CONFIRM_DELETE        38  /* 确认删除                */
#define WTN6170_VOICE_DELETE_ALL            39  /* 全部删除                */
#define WTN6170_VOICE_DELETE_INVALID        40  /* 删除无效                */
#define WTN6170_VOICE_VERIFY_SUCCESS        41  /* 验证成功                */
#define WTN6170_VOICE_VERIFY_FAILURE        42  /* 验证失败                */
#define WTN6170_VOICE_SET_SUCCESS           43  /* 设置成功                */
#define WTN6170_VOICE_SET_FAILURE           44  /* 设置失败                */
#define WTN6170_VOICE_FACTORY_RESET         45  /* 恢复出厂                */
#define WTN6170_VOICE_OPERATION_SUCCESS     46  /* 操作成功                */
#define WTN6170_VOICE_OPERATION_FAILURE     47  /* 操作失败                */
#define WTN6170_VOICE_OPERATION_INVALID     48  /* 操作无效                */
#define WTN6170_VOICE_ADD_SUCCESS           49  /* 添加成功                */
#define WTN6170_VOICE_ADD_FAILURE           50  /* 添加失败                */
#define WTN6170_VOICE_ADD_USER              51  /* 添加用户                */
#define WTN6170_VOICE_DELETE_USER           52  /* 删除用户                */
#define WTN6170_VOICE_USER_FULL             53  /* 用户已满                */
#define WTN6170_VOICE_ADD_ADMIN             54  /* 添加管理员              */
#define WTN6170_VOICE_DELETE_ADMIN          55  /* 删除管理员              */
#define WTN6170_VOICE_ADMIN_FULL            56  /* 管理员已满              */
#define WTN6170_VOICE_VERIFY_ADMIN          57  /* 验证管理员              */
#define WTN6170_VOICE_TRY_AGAIN             58  /* 请重试                  */
#define WTN6170_VOICE_SELECT_MENU           59  /* 选择菜单                */
#define WTN6170_VOICE_BACK_MENU             60  /* 返回上一级菜单          */
#define WTN6170_VOICE_EXIT_MENU             61  /* 退出菜单                */
#define WTN6170_VOICE_SELECT_NUMBER         62  /* 请选择数字操作          */
#define WTN6170_VOICE_INPUT_NUMBER          63  /* 请输入编号              */
#define WTN6170_VOICE_INPUT_USER_PWD        64  /* 请输入用户密码          */
#define WTN6170_VOICE_REINPUT_USER_PWD      65  /* 请再一次输入用户密码     */
#define WTN6170_VOICE_PWD_ADD_SUCCESS       66  /* 密码添加成功            */
#define WTN6170_VOICE_PWD_ADD_FAILURE       67  /* 密码添加失败            */
#define WTN6170_VOICE_PWD_VERIFY_SUCCESS    68  /* 密码验证成功            */
#define WTN6170_VOICE_PWD_VERIFY_FAILURE    69  /* 密码验证失败            */
#define WTN6170_VOICE_INPUT_ADMIN_PWD       70  /* 请输入管理员密码        */
#define WTN6170_VOICE_REINPUT_ADMIN_PWD     71  /* 请再一次输入管理员密码   */
#define WTN6170_VOICE_REPEAT_PASSWORD       72  /* 重复密码                */
#define WTN6170_VOICE_PLEASE_INPUT          73  /* 请输入                  */
#define WTN6170_VOICE_PASSWORD_             74  /* 位                      */
#define WTN6170_VOICE_ADD_USER_FINGER       76  /* 添加用户指纹            */

/* 高级功能提示音(77-111)*/
#define WTN6170_VOICE_DELETE_USER_FINGER    77  /* 删除用户指纹             */
#define WTN6170_VOICE_ADD_ADMIN_FINGER      78  /* 添加管理员指纹           */
#define WTN6170_VOICE_DELETE_ADMIN_FINGER   79  /* 删除管理员指纹           */
#define WTN6170_VOICE_PLACE_FINGER          80  /* 请放置手指               */
#define WTN6170_VOICE_PLACE_FINGER_AGAIN    81  /* 请再次放置手指           */
#define WTN6170_VOICE_REMOVE_FINGER         82  /* 请拿开手指               */
#define WTN6170_VOICE_FINGER_ADD_SUCCESS    83  /* 指纹添加成功             */
#define WTN6170_VOICE_FINGER_ADD_FAILURE    84  /* 指纹添加失败             */
#define WTN6170_VOICE_FINGER_VERIFY_SUCCESS 85  /* 指纹验证成功             */
#define WTN6170_VOICE_FINGER_VERIFY_FAILURE 86  /* 指纹验证失败             */
#define WTN6170_VOICE_ADD_SENSOR_CARD       87  /* 添加感应卡               */
#define WTN6170_VOICE_DELETE_SENSOR_CARD    88  /* 删除感应卡               */
#define WTN6170_VOICE_SWIPE_CARD            89  /* 请刷卡                   */
#define WTN6170_VOICE_SWIPE_CARD_AGAIN      90  /* 请再一次刷卡             */
#define WTN6170_VOICE_SWIPE_SUCCESS         91  /* 刷卡成功                 */
#define WTN6170_VOICE_SWIPE_FAILURE         92  /* 刷卡失败                 */
#define WTN6170_VOICE_CARD_REGISTERED       93  /* 卡片已注册               */
#define WTN6170_VOICE_INVALID_CARD          94  /* 无效卡                   */
#define WTN6170_VOICE_ADD_REMOTE            95  /* 添加遥控                 */
#define WTN6170_VOICE_DELETE_REMOTE         96  /* 删除遥控                 */
#define WTN6170_VOICE_ADD_KEY               97  /* 添加钥匙                 */
#define WTN6170_VOICE_DELETE_KEY            98  /* 删除钥匙                 */
#define WTN6170_VOICE_LOW_BATTERY           99  /* 电量不足                 */
#define WTN6170_VOICE_CHANGE_BATTERY        100 /* 请更换电池               */
#define WTN6170_VOICE_SET_TIME              101 /* 请设置时间               */
#define WTN6170_VOICE_NETWORK_SUCCESS       102 /* 联网成功                 */
#define WTN6170_VOICE_NETWORK_CONFIG        103 /* 联网配置中,请稍后        */
#define WTN6170_VOICE_AUTO_TIME_CONFIG      104 /* 自动配置时间,请稍后      */
#define WTN6170_VOICE_INIT_COMPLETE         105 /* 初始化完成               */

/* 音量调节(77-111) */
#define WTN6170_VOICE_VOL_MIN               0xE0 /* 最小音量级别(E0H)       */
#define WTN6170_VOICE_VOL_1                 0xE1 /* 音量级别1 (E1H)         */
#define WTN6170_VOICE_VOL_2                 0xE2 /* 音量级别2 (E2H)         */
#define WTN6170_VOICE_VOL_3                 0xE3 /* 音量级别3 (E3H)         */
#define WTN6170_VOICE_VOL_4                 0xE4 /* 音量级别4 (E4H)         */
#define WTN6170_VOICE_VOL_5                 0xE5 /* 音量级别5 (E5H)         */
#define WTN6170_VOICE_VOL_6                 0xE6 /* 音量级别6 (E6H)         */
#define WTN6170_VOICE_VOL_7                 0xE7 /* 音量级别7 (E7H)         */
#define WTN6170_VOICE_VOL_8                 0xE8 /* 音量级别8 (E8H)         */
#define WTN6170_VOICE_VOL_9                 0xE9 /* 音量级别9 (E9H)         */
#define WTN6170_VOICE_VOL_10                0xEA /* 音量级别10 (EAH)        */
#define WTN6170_VOICE_VOL_11                0xEB /* 音量级别11 (EBH)        */
#define WTN6170_VOICE_VOL_12                0xEC /* 音量级别12 (ECH)        */
#define WTN6170_VOICE_VOL_13                0xED /* 音量级别13 (EDH)        */
#define WTN6170_VOICE_VOL_14                0xEE /* 音量级别14 (EEH)        */
#define WTN6170_VOICE_VOL_MAX               0xEF /* 最大音量级别(EFH)       */

/* 功能指令 */
#define WTN6170_VOICE_LOOP_MODE             0xF2 /* 循环播放模式(F2H)       */
#define WTN6170_VOICE_SEQ_PLAY              0xF3 /* 连码播放模式(F3H)       */
#define WTN6170_VOICE_INSERT_SILENCE        0xF8 /* 静音插入(F8H)           */
#define WTN6170_VOICE_STOP                  0xFE /* 紧急停止(FEH)           */

/**
 * @brief 初始化BDR6120S
 *
 * @param 无
 *
 * @return 无
 */
void WTN6170_Init(void);

/**
 * @brief BDR6120S发送命令
 *
 * @param cmd: 命令码
 *
 * @return 无
 */
void WTN6170_send_cmd(uint8_t cmd);

#endif

posted @ 2025-08-13 23:24  2666666  阅读(69)  评论(0)    收藏  举报