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,发送语音时使用连码发送。
- 一线串口时序图:

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

注意:必须高电平在前,低电平在后。推荐使用 200us:600us。取值范围:40us:120us ~ 400us:1200us。注意使用 3:1 和 1:3 电平比例以保障通讯稳定。
- 假如我们要发送 96H,那么他对应的时序图,如下所示:

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

-
因为 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

浙公网安备 33010602011771号