KT803C系列串口下载语音芯片驱动程序&硬件注意事项

目录

1.概述

1.1 简介 

UDP1FS是一个提供串口的语音模块方案,完美的集成了MP3的硬解码。同时软件支持工业级别的串口通信协议,以SPIFLASH作为存储介质。通过简单的串口指令即可完成播放指定的语音,以及如何播放语音等功能,无需繁琐的底层操作,使用方便,稳定可靠是此款产品的最大特点。

1.2 功能

1.3 应用

2.1 参数说明

2.2 管脚说明 -- 测试DEMO板

​2.3 简单测试方法

2.4一些可能不容易理解的概念或者名词详细说明

2.5串口下载流程说明---最为核心的部分

2.5.1 串口下载的协议

2.5.2 串口下载的详细说明 -- [分区2]

2.5.3 串口下载的相关指令说明[A0][A1][A2][A3]

3.1 通讯格式

3.2 通讯指令

3.2.1 控制指令

3.2.2 查询指令

3.3 芯片返回的数据

3.3.1 芯片上电返回的数据[3F]

3.3.2 语音播放完毕主动返回的数据[0x39][0x3E]

3.3.3 芯片接收数据正常返回的ACK



1.
概述

1.1 简介 

UDP1FS是一个提供串口的语音模块方案,完美的集成了MP3的硬解码。同时软件支持工业级别的串口通信协议SPIFLASH作为存储介质。通过简单的串口指令即可完成播放指定的语音,以及如何播放语音等功能,无需繁琐的底层操作,使用方便,稳定可靠是此款产品的最大特点。

KT803C蓝牙wifi电信2G4G远程串口更新下载MP3语音芯片ic方案_kt404a怎么写入语音-C文档类资源-CSDN下载KT803C芯片只是基于KT404A芯片开发出来的单独一个软件版本,用以满足串口下载语音的需求kt404a怎么写入语音更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/qyvhome/9932832

无需任何烧录器,无需任何软件,USB直接烧写FLASH。同时支持串口直接下载语音

UDP1FS模块是基于KT803C芯片开发的测试模块,用以满足串口下载语音的需求

兼容KT803C[SSOP24] 和 KT804C[SOP16]两款芯片的测试

1.2 功能

  1. 支持采样率(KHz):8/11.025/12/16/22.05/24/32/44.1/48

2、24位DAC输出,动态范围支持90dB,信噪比支持85dB

3、最大支持16M字节的SPIFLASH。例如W25Q16[2M字节]、W25Q128[16M字节]

4Miniusb接口更新语音文件,无需安装任何软件。支持XP和WIN7系统。

5、30级音量可调支持外挂多种类型的功放,如3W、5W、10W等等

  1. 支持用户直接单片机窗口下载语音,按照我们给出的协议。满足远程更换声音的需求,常见的如蓝牙、wifi、4G等等无线方案来轻松的更换声音
  2. 存储的语音文件可以很方便的通过串口进行动态更新。适用于一些短声音文件,以及小文件

1.3 应用

1、 车载导航语音播报

2、 公路运输稽查、收费站语音提示;

3、 火车站、汽车站安全检查语音提示;

4、 电力、通信、金融营业厅语音提示;

5、 车辆进、出通道验证语音提示;

6、 公安边防检查通道语音提示;     

8、 电动观光车安全行驶语音告示;   

9、 机电设备故障自动报警;

10、消防语音报警提示;

  1. KT803C系列串口下载语音芯片驱动程序&硬件注意事项_第1张图片方案说明

 

芯片选用的是SOC方案,集成了一个16位的MCU,以及一个专门针对音频解码的aDSP,采用硬解码的方式,更加保证了系统的稳定性和音质。小巧的封装尺寸更加满足嵌入其它产品的需求

2.1 参数说明

名称

参数

MP3文件格式

1、支持所有比特率11172-3和ISO13813-3 layer3音频解码

2、采样率支持(KHZ):8/11.025/12/16/22.05/24/32/44.1/48

3、支持Normal、Jazz、Classic、Pop、Rock等音效

USB接口

2.0标准

UART接口

标准串口,TTL电平,波特率可设[用户不可设]

输入电压

3.7V-5.2V[7805后级串一个二极管为最佳]

额定电流

10MA[静态]

低功耗电流

<200uA

功放功率

负载32欧姆0.25W[只支持驱动耳机][不支持直接驱动喇叭]

尺寸

参见封装章节

工作温度

[-40] -- [80度]

湿度

5% ~ 95%

主芯片型号

KT803C[SSOP24] --- KT804C[SOP16]

2.2 管脚说明 -- 测试DEMO板

引脚序号

引脚名称

功能描述

备注

1

GND

[负极]

系统地

2

RX

UART串行数据输入

3.3V的TTL电平

3

TX

UART串行数据输出

3.3V的TTL电平

4

DR

芯片DAC输出右声道

5

DL

芯片DAC输出左声道

6

SPK2

外接单声道喇叭

不可超过4欧姆3W

7

IO4

通用输入输出口4

8

IO3

通用输入输出口3

9

IO1

通用输入输出口1

10

IO2

通用输入输出口2

11

SPK1

外接单声道喇叭

不可超过4欧姆3W

12

BUSY

播放状态脚

播放时输出低

13

V33

14

USB+

USB数据线DATA+

15

USB-

USB数据线DATA-

16

VIN

电源输入[正极]

最大5.2V

备注:模块内置单声道功放。另外模块第1脚和第16脚都有丝印标注的

(1)、用户如果拿一个喇叭对模块进行测试,把喇叭的两个脚分别连接SPK1和SPK2.

(2)、DACL和DACR只能推动耳机,是芯片内部自己产品的音频信号,就像电脑的音频接口一样

KT803C系列串口下载语音芯片驱动程序&硬件注意事项_第2张图片

2.3 简单测试方法

  1. 我们的模块自带Microusb座子,用户可以直接接电脑更新语音

2、直接使用安卓的充电线下载或者供电即可[非typeC接口]

3、用户拿到模块,可以用镊子IO1到地[模拟一个微动开关]来判断

模块是否正常,但是前提是设备中至少要有1段语音

4、模块如果正常播放声音之后,就可以使用串口对模块进行正常的

测试了

5、一定不要用usb连接电脑供电,因为会进入下载模式

2.4一些可能不容易理解的概念或者名词详细说明

分区的概念   以及   为什么要有分区

1、由于我们将spiflash默认的分为了两个区间,平均分,所以下文会提到,分区1分区2的概念.

2、其中分区1 指的是可以通过USB下载固定语音的部分空间 -- 方便用户存储一些固定的语音

3、其中分区2 指的是通过串口动态更新的部分空间         -- 方便用户存储后期可能修改的语音

4、两个空间相互独立,互不干扰,可以分别控制,也可以统一控制,详见下文的介绍

上位机   以及   下位机

1、上位机 -- 代表用户使用的MCU  或者   我们提供电脑端的串口软件

2、下位机 -- 代表的是我们的主控芯片 --- 整个的流程请结合上位机进行参考

2.5串口下载流程说明---最为核心的部分

以下所有的流程,您只需要在逻辑上面分析一下,知道一个大概即可,我们有单独的上位机软件来配合调试的,所有的命令以及下载的流程都在上位机里面有体现

2.5.1 串口下载的协议

波特率:115200    数据位:8   奇偶校验:None   停止位:1    流控制:全部关闭

一、串口下载文件数据格式 (0xA1) ---- 这里只争对下载数据包

字节序号

字节内容

字节含义

1

0x7E

起始标记

2

CMD

命令字节

3

lenH

包的序号--高字节[不包含校验和结束、自身]

4

lenL

包的序号--低字节[不包含校验和结束、自身]

.....

DAT

数据区[固定256个字节]

结束

0xEF

结束标志

备注:我们规定一帧数据的数据区固定为256个字节

完整的下载有效数据格式:

帧头

命令

包序号[高字节]

包序号[低字节]

有效数据......

结束

0x7E

0xA1

lenH

lenL

DAT[256]

0xEF

2.5.2 串口下载的详细说明 -- [分区2]

第一步如下:

  1. 如果上位机发送一个100.2KB的音频文件至芯片,那么发送的细节如下

2、首先分析这100.2KB的数据,将这个数据拆分为以256[0.25kb]个字节为单位的数据包.那么总共需要传400.8次才能将这一帧数据传完。重点注意后面的0.8次实际上是占用一次的,不够256个字节的字节补0。组成一个完整的256字节的数据包,即总包数为401包

3、开始握手。上位机发送7E A0 00 03 03 01 91  EF

==> 这个代表上位机准备发送下载数据,03代表的是第3个文件。这个数据的总包数为“0x0191= 401”

==> 下位机收到之后,会返回7E A0 00 02 00 00 EF,代表下位机准备就绪

==> 此时上位机开始发送第一包数据,下位机收到之后,会返回“7E A0 00 02 00 01 EF”代表第一包数据收到,

  1. 此时上位机依次往下发,下位机每次收到之后,都会返回当前包的序号作为应答

4、如果上位机在5秒之类没有收到下位机的应答,则重发。重发第二次还未收到应答,则意味着此次下载失败,上位机需要做的事情就是发送“复位命令”,然后等待100ms,再重新发起下载。

第二步如下:

1、如果第3个文件上位机发送完毕:

2、上位机主动往下位机发送“7E A3 00 02 00 03 EF”,这样代表上位机已经将当前全部下发完毕。

3、等待下位机应答。如果下位机接收没问题,会返回这条指令作为应答,上位机再继续下一个文件的下载流程

【备注:每一包数据,我们芯片收到之后会自动写入到存储器之中。】

第三步如下:

1、如果上位机发送完所有的数据之后的处理

2、确认一下所有的应答都接收是否有误,如果无误,则上位机主动发出一个

“7E A3 00 02 00 00 EF” --- 代表整个下载过程完成,告知下位机退出下载模式

  1. 同时下位机收到这个命令之后,开始校验整个的文件数,确认没问题返回“7E 3F 00 02 dat1 dat2 EF”作为应答,同时下位机退出下载模式。进入正常等待状态”。

[dat1:分区1文件总数]           [dat2:分区2文件总数--- 串口下载的部分]

到这里整个串口下载的流程就完毕了。每一次下载都是这样的流程

第四步如下:--这里使用上位机单独下载一个文件的截图:

KT803C系列串口下载语音芯片驱动程序&硬件注意事项_第3张图片

 

2.5.3 串口下载的相关指令说明[A0][A1][A2][A3]

上位机

上位机这里的意思,是用户使用的MCU

下位机

下位机这里的意思,是KT803C芯片。

1、下载信息交换(A0)

7E A0 00 03 03 01 91 EF

上位机发起下载申请[dat1:文件编号][dat2:总包数高][dat3:总包数低]

7E A0 00 02 00 00 EF

下位机给上位机的应答,上位机收到就可以开始发送数据

7E A0 00 02 00 01 EF

下位机返回给上位机第1包的应答,上位机收到发第2包数据

7E A0 00 02 00 02 EF

下位机返回给上位机第2包的应答

..........

7E A0 00 02 01 91 EF

下位机返回给上位机第401包的应答

7E A3 00 02 00 03 EF

1、上位机在本文件的最后一包数据的应答收到之后,就发送这条命令

2、代表上位机当前文件的全部数据发送完毕,等待下位机校验之后的应答,

3、下位机校验无误之后,返回此帧数据,作为应答。

4、上位机收到之后开启下一个文件的数据发送流程

7E A3 00 02 00 04 EF

代表第4个文件接收完毕,原理同上

...

7E A3 00 02 00 0b EF

代表第11个文件接收完毕,原理同上

7E A3 00 02 00 00 EF

  1. 收到下位机最后一个文件的最后一个应答之后上位机主动发出
  2. 代表文件全部更新完毕
  3. 下位机收到之后,校验全部的文件是否正常,如果正常,
  4. 则返回7E 3F 00 02 datH datL EF此帧数据作为应答,同时退出下载模式
  5. [datH:代表分区1的文件总结] [datL:分区2的文件总数]

2、传输过程中出错的代码反馈【下位机到上位机】(A2)

7E A2 00 02 00 01 EF

下位机传输超容量范围的应答

7E A2 00 02 00 02 EF

文件编号错误的应答(未连续或未从第一个开始)

7E A2 00 02 00 03 EF

当前数据包接收错误,请求重发

7E A2 00 02 00 04 EF

当前文件校验出错[针对单个文件下载完之后]

7E A2 00 02 00 05 EF

全部文件校验出错[针对全部文件下载完之后]

这个暂时可以不处理。

3、备注说明如下:

  1. 整个的下载流程,说复杂,也复杂。说不复杂也不复杂。请配合上位机进行理解
  1. 下载流程:发起下载,是由上位机提出的。下位机和上位机,采取的方式是一问一答,来保证数据的顺利进行

  1. 串口通讯协议

    串口作为一种在控制领域常用的通信,我们进行了工业级别的优化,加入的帧的校验、重发、错误处理等措施,大大加强通信的稳定性和可靠性,串口的通信波特率默认为115200,不可再设置

3.1 通讯格式

支持异步串口通讯模式,通过串口接受上位机发送的命令
    通讯标准:115200 bps --- 不可修改
    数据位  :8

    停止位  :1
    校验位  :none
    流控制  :none

格式:$S  VER  Len  CMD  Feedback  para1  para2  checksum  $O

1

0x7E

起始标记

2

CMD

命令字节

3

lenH

包的序号--高字节

4

lenL

包的序号--低字节

.....

DAT

数据区

结束

0xEF

结束标志

举个例子,如果我们指定播放SPIFLASH的分区1里面的语音播放,就需要发送:7E A5 00 02 00 01 EF

数据长度为2 ,这2个字节分别是[00 01] 。代表是指定分区1的第1段语音播放

3.2 通讯指令

我们的通讯分为以下两大块

  1. 控制指令
  2. 查询芯片的参数以及状态

3.2.1 控制指令

CMD命令

对应的功能

参数(16位)

0x01

下一曲

0x02

上一曲

0x03

指定曲目(NUM)

详见3.4.1

0x04

音量+

0x05

音量-

0x06

指定音量

详见3.4.2

0x0C

芯片复位

任何状态有效

0x0D

播放

0x0E

暂停

0x0F

指定文件夹文件名播放

暂不开放

0x16

停止

0x17

指定文件夹循环播放

暂不开放

0x19

对当前播放的曲目设置为循环播放

暂不开放

0x21

组合播放

暂不开放

0x25

多文件夹插播

暂不开放

0x28

指定文件夹随机播放

暂不开放

0xA5

指定第一分区播放

详见3.4.1

0xA6

指定第二分区播放

详见3.4.2

0xA0

开始下载的起始指令

详见2.5.3

0xA1

下载的有效数据指令

详见2.5.3

0xA2

应答信息

详见2.5.3

0xA3

当前的文件下载完毕

详见2.5.3

3.2.2 查询指令

这里是查询芯片的状态和相关的参数

CMD命令详解(查询)

对应的功能

参数(16位)

0x3C

保留

0x3D

保留

0x3E

保留

0x3F

查询初始化的状态

详见3.3.1

0x40

返回错误,请求重发

0x41

应答

0x42

查询当前状态

详见3.4.10

0x43

查询当前音量

0x49

查询FLASH的总文件数

高字节[第一分区]     低字节[第二分区]

0x50

查询使用的flash的容量

3.3 芯片返回的数据

芯片在关键地方均会有数据返回。供用户掌控芯片的工作状态

(1)、芯片上电初始化成功的数据

(2)、芯片播放完当前曲目的数据

(3)、芯片成功接收到指令返回的ACK(应答)

(4)、芯片接收一帧数据出错[包括数据没收完整、校验出错两种情况]

(5)、芯片在繁忙时,有数据过来,芯片会返回忙的指令

3.3.1 芯片上电返回的数据[3F]

1、芯片上电,需要一定的时间初始化,这个时间是需要根据SPIFLASH设备的文件多少决定的,一般情况在小于500ms。如果超过这个时间芯片的初始化数据还没有发送出来,说明芯片初始化出错,请检查硬件的连接

2、芯片初始化返回的数据为当前的有效文件夹,譬如返回7E 3F 00 02 06 05 EF

(1)、其中0x06代表的是第一分区的总文件数为6个

(2)、其中0x05代表的是第二分区的总文件数为5个

3、MCU必须等待芯片初始化指令发出之后才能发送相应的控制指令,否则发送的指令芯片将不予处理。同时还会影响芯片的正常初始化。

3.3.2 语音播放完毕主动返回的数据[0x39][0x3E]

FLASH第一分区播放完第1曲

7E 3E 00 02 00 01 EF

FLASH第二分区播放完第2曲

7E 39 00 02 00 01 EF

  1. 我们的方案是播放完语音之后会自动进入停止状态。只需要指定曲目物理序号播放即可。
  1. 我们专门开辟一个GPIO作为播放停止的状态指示。请参见第BUSY脚
  1. 、播放状态输出低电平   [很多功放有静音脚,可以通过此IO直接进行控制]
  2. 、没有播放,则输出高电平。模块睡眠状态。也是高电平

3、方案模块通电之后,初始化正常 ,模块自动进入设备等待状态,等待用户发送播放的相关指令

3.3.3 芯片接收数据正常返回的ACK

1、芯片在所有的命令或者查询数据包接收完毕之后,会返回当前接收到的数据给MCU,作为接收到的ACK信号

/**
  ******************************************************************************
  * @file    main.c
  * @author  fire
  * @version V1.0
  * @date    2015-xx-xx
  * @brief   串口接发测试,串口接收到数据后马上回传。
  ******************************************************************************
  * @attention
  *
  * 实验平台:野火  STM32 F407 开发板
  * 论坛    :http://www.firebbs.cn
  * 淘宝    :https://fire-stm32.taobao.com
  *
  ******************************************************************************
  */
  
#include "stm32f4xx.h"
#include "./usart/bsp_debug_usart.h"
#include "delay.h"
/**
  * @brief  主函数
  * @param  无
  * @retval 无
  */
/**********************************************************
1、程序的整个下载流程比较复杂,不能想当然的理解,一定要配合我们给的上位机进行对比

2、下载流程,我们没有提供参考程序,需要您自己去写

3、上位机的源码我们是不提供的,您可以参考,原理其实也就是

握手---->分包发--->完毕--->退出下载---->MCU发指令点播
**********************************************************/
  
  
/**********************************************************
 -- 这里是通过winhex,获取的一个小音乐文件的数组
 -- 这里仅仅用来模拟测试而已
 -- 很明显可以看到这个音乐文件,大概在2K
 -- 这个语音文件的数组,播放的音乐是"8"
 -- 详细的参见文档"20191209_如何使用WINHEX查看音频文件的数据以及生成数组"
**********************************************************/
unsigned char musicdata[2560] = {
	0xFF, 0xF3, 0x28, 0xC4, 0x00, 0x09, 0xE0, 0x5D, 0x78, 0x0C, 0x18, 0xC6, 0x28, 0x0E, 0x00, 0xCA, 
	0x28, 0x48, 0xE3, 0x0B, 0x10, 0x2C, 0x71, 0x85, 0xA3, 0xC5, 0x62, 0x12, 0x38, 0xC3, 0x88, 0x07, 
	0x02, 0xDF, 0xE8, 0x32, 0xEF, 0xFF, 0xFF, 0xF4, 0x9A, 0x7F, 0xE8, 0x32, 0x09, 0x8A, 0xA1, 0xF9, 
	0x93, 0x26, 0x81, 0xC1, 0x65, 0x0C, 0x39, 0x25, 0x17, 0x0D, 0x80, 0xFC, 0x01, 0x13, 0xBE, 0x20, 
	0x71, 0x40, 0xC1, 0x22, 0xE3, 0x9D, 0xF2, 0xF9, 0xFF, 0xF3, 0x28, 0xC4, 0x13, 0x09, 0x30, 0x06, 
	0x9E, 0x5E, 0x00, 0x44, 0x02, 0x01, 0x39, 0xC6, 0xFE, 0x08, 0x3C, 0xE5, 0x1F, 0x9C, 0xFF, 0xFF, 
	0xEA, 0x04, 0xC1, 0xFF, 0xF3, 0xFE, 0x51, 0x7A, 0x90, 0x5D, 0x80, 0x19, 0x42, 0x64, 0x14, 0x46, 
	0xCB, 0x1D, 0x85, 0x4E, 0x10, 0x07, 0x54, 0x95, 0x00, 0x91, 0x10, 0xF0, 0x32, 0x7D, 0xE2, 0xAB, 
	0x04, 0x88, 0x9A, 0x4F, 0x4C, 0x8E, 0x09, 0x24, 0xE8, 0x5C, 0xC8, 0x99, 0xC1, 0x21, 0x43, 0x20, 
	0xFF, 0xF3, 0x28, 0xC4, 0x29, 0x10, 0x28, 0x4A, 0x5C, 0x3E, 0x32, 0x4C, 0x08, 0x60, 0xA1, 0xCF, 
	0xFA, 0x59, 0x43, 0xF9, 0x88, 0x81, 0x2C, 0x26, 0x64, 0xA0, 0x86, 0x27, 0xA0, 0x2E, 0x21, 0x88, 
	0xD0, 0x91, 0xCA, 0x6C, 0xC2, 0x2F, 0x39, 0x25, 0xB7, 0x61, 0xFF, 0xC0, 0x74, 0x3C, 0x55, 0x11, 
	0xC1, 0xF7, 0x43, 0x29, 0x52, 0x63, 0xFB, 0x13, 0x74, 0x55, 0x22, 0x59, 0xD5, 0x99, 0x3F, 0xC9, 
	0xE7, 0x44, 0x20, 0x76, 0xB3, 0x31, 0xB6, 0x62, 0xFF, 0xF3, 0x28, 0xC4, 0x23, 0x10, 0x52, 0x4E, 
	0x99, 0xBE, 0x10, 0x0B, 0xA2, 0x0F, 0x52, 0x68, 0x16, 0xFF, 0xF4, 0x14, 0xC8, 0x86, 0x6D, 0x5B, 
	0x33, 0x13, 0xB6, 0x40, 0xE0, 0x27, 0x2F, 0x4E, 0x26, 0x1F, 0x40, 0xDF, 0x2E, 0x58, 0xD9, 0x0A, 
	0xBD, 0x5B, 0xBA, 0xEA, 0x05, 0x2A, 0x72, 0x8D, 0x74, 0x03, 0x34, 0x83, 0x8F, 0x7B, 0x70, 0xF4, 
	0xD5, 0xBA, 0xA2, 0x94, 0x42, 0x35, 0xFF, 0x64, 0x6B, 0x68, 0x6F, 0xB9, 0xF4, 0xAF, 0xA2, 0xAF, 
	0xFF, 0xF3, 0x28, 0xC4, 0x1C, 0x10, 0x6A, 0x1E, 0x5C, 0xFE, 0x0A, 0x44, 0x10, 0x18, 0xB7, 0x83, 
	0x32, 0x29, 0x54, 0xAB, 0x2A, 0xA3, 0x94, 0x8C, 0x75, 0x4F, 0xFF, 0xFF, 0xF4, 0x9C, 0xFC, 0xDF, 
	0xFA, 0x32, 0xA9, 0x51, 0x50, 0x10, 0x20, 0x83, 0xEC, 0x00, 0x5B, 0xF0, 0x2A, 0xC1, 0x54, 0xF6, 
	0xFD, 0x5F, 0x6D, 0x09, 0x37, 0x1C, 0x92, 0x5B, 0xB0, 0xD8, 0x01, 0xD0, 0xD7, 0xC4, 0xB8, 0x3C, 
	0x21, 0x15, 0x29, 0x90, 0xC4, 0x44, 0x5D, 0x4A, 0xFF, 0xF3, 0x28, 0xC4, 0x15, 0x0F, 0x02, 0x1A, 
	0x8E, 0x5E, 0x10, 0x05, 0xC2, 0xF3, 0x5C, 0xDE, 0x67, 0xCD, 0xAF, 0x7F, 0x76, 0x2C, 0xCD, 0xA0, 
	0xE7, 0x55, 0x50, 0xA2, 0x5C, 0xC1, 0x81, 0x91, 0x94, 0xCA, 0x52, 0x3F, 0xF5, 0xBE, 0xCD, 0x7D, 
	0x16, 0x94, 0x7B, 0xB0, 0x85, 0x92, 0x54, 0xF2, 0xCA, 0x9C, 0xD9, 0xEB, 0x09, 0xC9, 0x24, 0xB4, 
	0x6B, 0x80, 0xFC, 0x01, 0xD3, 0x1D, 0xB4, 0x65, 0xD8, 0xA3, 0x5E, 0x7B, 0xD5, 0xD1, 0xF0, 0xB4, 
	0xFF, 0xF3, 0x28, 0xC4, 0x14, 0x0B, 0xE9, 0x2E, 0x96, 0x5E, 0x11, 0x84, 0x46, 0x5E, 0xBA, 0x5F, 
	0xFE, 0xB6, 0x80, 0x11, 0xB6, 0xA3, 0x3D, 0xC8, 0xEE, 0xD1, 0xC8, 0x91, 0x73, 0xFF, 0xFF, 0xFE, 
	0xB8, 0x7A, 0x91, 0x55, 0xB4, 0xDE, 0xB7, 0xB0, 0xD2, 0x01, 0x39, 0x2D, 0xB6, 0x8D, 0xC7, 0xE0, 
	0x01, 0xBD, 0x8A, 0x41, 0x32, 0x07, 0xE9, 0x13, 0xB3, 0x02, 0xD0, 0x9F, 0x75, 0x96, 0x5E, 0xB3, 
	0xA2, 0x96, 0x99, 0xFF, 0xFF, 0xEE, 0x5B, 0x02, 0xFF, 0xF3, 0x28, 0xC4, 0x1F, 0x0D, 0xD9, 0x2A, 
	0x96, 0x5E, 0x01, 0x84, 0x36, 0x19, 0x18, 0x38, 0x42, 0x8A, 0x20, 0x81, 0x60, 0xA8, 0x80, 0xD0, 
	0x54, 0x31, 0xFE, 0xFD, 0x28, 0x07, 0xCD, 0xEF, 0xC4, 0xAC, 0xAC, 0x39, 0x6D, 0x55, 0x4D, 0xC9, 
	0x25, 0xB4, 0x0D, 0x80, 0x45, 0xA2, 0x1C, 0xD4, 0x29, 0xA1, 0x04, 0x88, 0xB9, 0x93, 0x70, 0xB1, 
	0x87, 0xED, 0x5A, 0x37, 0xF9, 0xDB, 0x2A, 0xE0, 0xC4, 0x66, 0x78, 0x39, 0x89, 0x69, 0x04, 0xA4, 
	0xFF, 0xF3, 0x28, 0xC4, 0x22, 0x07, 0xF1, 0x2A, 0x96, 0x58, 0x10, 0x07, 0x27, 0x00, 0x7A, 0x1E, 
	0x13, 0xA7, 0x93, 0x8E, 0x68, 0x28, 0xCB, 0x84, 0x97, 0x78, 0xD4, 0x9B, 0xBC, 0x6A, 0x77, 0xF5, 
	0xD6, 0x7E, 0x23, 0xBF, 0x81, 0x5B, 0x7A, 0x5B, 0x37, 0xB6, 0x29, 0x7F, 0xE5, 0x22, 0xAD, 0x05, 
	0x33, 0x3C, 0x0D, 0x47, 0x17, 0x44, 0x0B, 0x9C, 0x34, 0xF9, 0x0F, 0xF1, 0xEE, 0xC0, 0x67, 0xDC, 
	0xC2, 0x79, 0x51, 0xCE, 0xEA, 0x81, 0x5B, 0xFA, 0xFF, 0xF3, 0x28, 0xC4, 0x3D, 0x0F, 0x51, 0x32, 
	0x34, 0x14, 0x78, 0x07, 0x24, 0x15, 0x13, 0xF6, 0xE0, 0x02, 0xD1, 0xB0, 0xA0, 0x5F, 0xB7, 0x63, 
	0x94, 0x29, 0x67, 0x67, 0x4F, 0xB7, 0x55, 0xAA, 0x4A, 0xF2, 0x35, 0x8E, 0xAC, 0x08, 0xD4, 0x05, 
	0x7F, 0xD7, 0xFF, 0xFF, 0xA3, 0x39, 0xD5, 0x9E, 0x8E, 0x24, 0x16, 0x0E, 0x0B, 0xF4, 0x1A, 0x22, 
	0x5C, 0xA8, 0x54, 0x8B, 0xFF, 0xFE, 0xBF, 0x8C, 0xEE, 0x74, 0x8A, 0x05, 0x6B, 0xBD, 0xB9, 0x25, 
	0xFF, 0xF3, 0x28, 0xC4, 0x3A, 0x0D, 0x29, 0xC6, 0x81, 0xBE, 0x10, 0x05, 0x0A, 0x90, 0x00, 0xEE, 
	0x1F, 0x3E, 0x70, 0x1C, 0x30, 0x32, 0x84, 0x6C, 0x6A, 0x9C, 0x91, 0xA8, 0x50, 0xC0, 0x40, 0xA3, 
	0x13, 0x90, 0xA3, 0x93, 0x7A, 0x18, 0x5C, 0x5C, 0xDE, 0x50, 0x10, 0x39, 0xCF, 0x80, 0xF2, 0xF0, 
	0x39, 0x70, 0xB8, 0x7F, 0x44, 0x63, 0xE2, 0xA4, 0xD6, 0x5D, 0xBF, 0xFE, 0x07, 0x07, 0xC1, 0xF0, 
	0x70, 0x10, 0xFE, 0x66, 0x0C, 0x06, 0x04, 0x0E, 0xFF, 0xF3, 0x28, 0xC4, 0x40, 0x0E, 0xF0, 0x0A, 
	0x7D, 0x9F, 0x42, 0x10, 0x02, 0x07, 0x03, 0xA2, 0x51, 0x68, 0xB4, 0x0A, 0x00, 0x80, 0x0C, 0x77, 
	0xA3, 0xE9, 0x8A, 0x33, 0xDA, 0x06, 0x15, 0x56, 0xE1, 0x7D, 0x09, 0x12, 0x18, 0xD3, 0x0E, 0x80, 
	0x07, 0xB2, 0xBA, 0x22, 0xD8, 0x64, 0xE6, 0x68, 0xED, 0x8F, 0xE4, 0xD8, 0xF1, 0x1C, 0x15, 0x1A, 
	0x55, 0x42, 0x82, 0x10, 0xC2, 0xE6, 0x84, 0xA8, 0x9C, 0x0E, 0x98, 0xBD, 0x6D, 0xA0, 0x83, 0x79, 
	0xFF, 0xF3, 0x28, 0xC4, 0x3F, 0x17, 0x3A, 0x23, 0x0E, 0x5F, 0x8D, 0x88, 0x02, 0x84, 0xD4, 0xD9, 
	0xD6, 0xFF, 0xFD, 0x9F, 0x77, 0x3A, 0xA4, 0x96, 0x82, 0x45, 0xC3, 0x6F, 0xFF, 0xFF, 0xB1, 0x7C, 
	0xB8, 0xA3, 0x22, 0x01, 0xE1, 0x7F, 0xFF, 0xFF, 0x80, 0xDF, 0xD5, 0x50, 0x20, 0xE0, 0x01, 0xA4, 
	0x97, 0x81, 0x99, 0x47, 0x41, 0x79, 0x58, 0x49, 0xD1, 0x47, 0xCC, 0xC7, 0xF1, 0x66, 0x75, 0xBD, 
	0x24, 0x84, 0x04, 0xDF, 0xD6, 0xB5, 0x88, 0xE0, 0xFF, 0xF3, 0x28, 0xC4, 0x1D, 0x13, 0xC2, 0x32, 
	0xF2, 0x37, 0xCD, 0x68, 0x02, 0x28, 0xE6, 0xCD, 0xF7, 0x20, 0x1A, 0x7D, 0x46, 0x23, 0x90, 0xB8, 
	0xDE, 0x89, 0x90, 0xDE, 0x69, 0x7F, 0x98, 0xBB, 0x7D, 0x68, 0xFF, 0xCF, 0xA1, 0xFD, 0x7F, 0xE8, 
	0x9B, 0xFF, 0x51, 0x9A, 0x6F, 0xEA, 0x3E, 0x58, 0x9B, 0xAB, 0xCC, 0x4E, 0x32, 0x32, 0x20, 0x87, 
	0x3B, 0xFF, 0x21, 0x88, 0xAC, 0xD1, 0x90, 0xC8, 0x28, 0x00, 0x79, 0x05, 0xC0, 0x69, 0x6F, 0xC8, 
	0xFF, 0xF3, 0x28, 0xC4, 0x09, 0x0F, 0x39, 0x36, 0xFD, 0x96, 0x3B, 0x4B, 0x02, 0x88, 0xCD, 0xF5, 
	0x34, 0xA0, 0x6F, 0xFC, 0x28, 0x43, 0xF3, 0x20, 0xEC, 0x30, 0x6F, 0xFA, 0x05, 0x8B, 0xFE, 0x83, 
	0xC0, 0x82, 0x9F, 0x28, 0x74, 0x39, 0xFC, 0xA0, 0x28, 0xB7, 0x59, 0xCE, 0x1A, 0x7F, 0x09, 0x72, 
	0xA0, 0x99, 0xFE, 0x04, 0xD2, 0x1D, 0x39, 0xD0, 0x1E, 0xE6, 0x7F, 0xA5, 0xE0, 0x37, 0xEB, 0xFF, 
	0x26, 0x62, 0x00, 0x20, 0x00, 0xA1, 0x01, 0x50, 0xFF, 0xF3, 0x28, 0xC4, 0x07, 0x0E, 0xB2, 0x4A, 
	0xEE, 0x3E, 0x68, 0x45, 0xA4, 0x1B, 0xF9, 0x24, 0x23, 0xFF, 0xCC, 0xC8, 0x4F, 0xEA, 0xCD, 0xC6, 
	0xDE, 0x82, 0xAA, 0x2F, 0x80, 0x2D, 0x2E, 0xFF, 0x27, 0x90, 0xBF, 0x9D, 0x18, 0x71, 0xB7, 0xFC, 
	0xB7, 0xFC, 0x9E, 0x7B, 0xFC, 0x5F, 0xF5, 0xFE, 0x5F, 0xF0, 0x3F, 0xF2, 0xFF, 0x86, 0x4F, 0xD0, 
	0xE1, 0xDB, 0x89, 0x1F, 0xFC, 0xB8, 0x39, 0xD6, 0x4A, 0x02, 0x80, 0x30, 0x01, 0xEE, 0x25, 0xC0, 
	0xFF, 0xF3, 0x28, 0xC4, 0x07, 0x0E, 0xC2, 0x42, 0xF6, 0x3E, 0x6A, 0x0B, 0x60, 0x3F, 0xCD, 0x47, 
	0x67, 0xF9, 0x14, 0xD3, 0xFA, 0xC5, 0x8F, 0xF5, 0x1A, 0x82, 0x04, 0xD5, 0xFF, 0x24, 0x4F, 0xFF, 
	0x3A, 0x3C, 0x00, 0x54, 0x58, 0xEB, 0x6B, 0x7C, 0x90, 0x49, 0x7F, 0xC1, 0x5B, 0xF8, 0xD1, 0xDF, 
	0xD0, 0x4F, 0xFE, 0xDF, 0xEB, 0xFE, 0x85, 0xFF, 0x56, 0xFF, 0x05, 0x67, 0x6F, 0x5B, 0x7A, 0xFF, 
	0xE8, 0x02, 0x80, 0x20, 0x01, 0x6D, 0x4A, 0x50, 0xFF, 0xF3, 0x28, 0xC4, 0x07, 0x0D, 0x01, 0x5E, 
	0xF6, 0x3E, 0x02, 0x8E, 0x3C, 0x28, 0x5C, 0x45, 0xFF, 0x95, 0x13, 0x3F, 0xC2, 0x81, 0xFB, 0xBD, 
	0x44, 0xA0, 0x19, 0x4F, 0xE2, 0x02, 0xFF, 0xE0, 0xF4, 0x91, 0xD5, 0x6E, 0x82, 0xF7, 0xFD, 0x09, 
	0xFF, 0xA9, 0x07, 0x70, 0x87, 0xBB, 0xA1, 0xFC, 0x57, 0xC3, 0x7E, 0xDE, 0xA7, 0x71, 0x30, 0x63, 
	0xFF, 0xEE, 0x02, 0x00, 0x20, 0x17, 0xA9, 0x40, 0xE7, 0xC0, 0x65, 0xFF, 0xE4, 0xD7, 0xF7, 0xC6, 
	0xFF, 0xF3, 0x28, 0xC4, 0x0E, 0x0C, 0x88, 0xF2, 0xEE, 0x16, 0x01, 0x9A, 0x24, 0x31, 0x9F, 0xBD, 
	0x65, 0x40, 0x25, 0x83, 0x98, 0x7B, 0xF2, 0x71, 0x1D, 0xBF, 0x50, 0xFC, 0x39, 0xD3, 0xEA, 0xF2, 
	0x5E, 0x8F, 0x35, 0xCB, 0x3F, 0xD3, 0xEE, 0xE1, 0xB3, 0x9C, 0x8F, 0xFC, 0x37, 0x7F, 0xE4, 0x5D, 
	0xC8, 0xD5, 0x02, 0xC0, 0x20, 0x49, 0x29, 0xB7, 0xDB, 0x01, 0x57, 0x02, 0x41, 0xBF, 0xF1, 0x80, 
	0xFF, 0xD0, 0x3C, 0xBF, 0xE2, 0x60, 0x46, 0xFD, 0xFF, 0xF3, 0x28, 0xC4, 0x16, 0x0C, 0xA0, 0xF7, 
	0x26, 0x5E, 0x01, 0xCA, 0x26, 0x4B, 0xFE, 0xE1, 0x21, 0x33, 0xFC, 0x0A, 0x1E, 0xC4, 0x46, 0xB9, 
	0x64, 0xF1, 0x12, 0x7C, 0x57, 0xCF, 0x6A, 0x06, 0x83, 0xDB, 0x45, 0x53, 0xC4, 0xBF, 0xE5, 0x43, 
	0x41, 0xC5, 0x02, 0x80, 0x22, 0x55, 0x37, 0xD6, 0xE0, 0x1D, 0x1B, 0x1F, 0xFF, 0x19, 0xFE, 0x60, 
	0x19, 0xFF, 0x56, 0x8A, 0xF8, 0x97, 0x89, 0x87, 0x31, 0x18, 0x34, 0x77, 0x9E, 0xF8, 0x4B, 0xFE, 
	0xFF, 0xF3, 0x28, 0xC4, 0x1E, 0x0B, 0x18, 0xAB, 0x0E, 0x3E, 0x00, 0xCA, 0x26, 0x12, 0xF2, 0x4E, 
	0xD4, 0xA0, 0x8D, 0x70, 0x69, 0xFF, 0xE5, 0x7D, 0x41, 0xC2, 0x7D, 0xEA, 0x50, 0x90, 0x5C, 0xB5, 
	0xBA, 0x02, 0x80, 0x0D, 0xFE, 0xA1, 0x88, 0xD4, 0x2F, 0x04, 0x3F, 0xF7, 0x20, 0x13, 0xFF, 0x9B, 
	0xF4, 0xD0, 0x2D, 0xFF, 0xAA, 0x13, 0xFD, 0x7F, 0xE9, 0xFF, 0xFF, 0xEB, 0xFF, 0xFF, 0xC3, 0x15, 
	0xFF, 0xAB, 0x37, 0xFF, 0xFF, 0xD1, 0x1D, 0x91, 0xFF, 0xF3, 0x28, 0xC4, 0x2C, 0x0C, 0x12, 0xC6, 
	0xE4, 0x7E, 0x01, 0x44, 0x4E, 0x58, 0x10, 0xE3, 0xFA, 0x6A, 0x05, 0xCB, 0x51, 0x29, 0x83, 0x98, 
	0x0D, 0xB2, 0x03, 0x1A, 0xC3, 0xF3, 0x90, 0x28, 0x90, 0x57, 0x2C, 0x4B, 0x9E, 0x2D, 0x95, 0x5A, 
	0x8D, 0xA4, 0x36, 0x7A, 0xAF, 0x18, 0x1D, 0xFA, 0xD6, 0x82, 0xC3, 0xC6, 0x7F, 0xFF, 0x8C, 0x42, 
	0xCE, 0xE2, 0xEE, 0x67, 0xFD, 0x61, 0xB5, 0x0A, 0x1F, 0x09, 0x01, 0x8D, 0xE2, 0x2D, 0x95, 0x80, 
	0xFF, 0xF3, 0x28, 0xC4, 0x36, 0x0D, 0x18, 0x5E, 0xD1, 0x9E, 0x00, 0xC4, 0x2A, 0x53, 0x69, 0x80, 
	0x15, 0x89, 0x01, 0xC5, 0x7F, 0xB2, 0x27, 0xFD, 0x38, 0xAB, 0xFE, 0x30, 0xB8, 0xA2, 0x26, 0xB9, 
	0x67, 0x77, 0xFB, 0xF1, 0xBC, 0x5E, 0x98, 0x4A, 0xD4, 0x41, 0xE1, 0x47, 0x69, 0xFF, 0x66, 0x6E, 
	0xC4, 0x95, 0x72, 0xF9, 0x6E, 0xDD, 0xE9, 0x83, 0x42, 0xC0, 0x55, 0x05, 0x2C, 0x7B, 0x10, 0x03, 
	0x08, 0x23, 0x92, 0x00, 0x30, 0x00, 0x28, 0x7B, 0xFF, 0xF3, 0x28, 0xC4, 0x3C, 0x0C, 0xB8, 0xEE, 
	0x9C, 0x3E, 0x01, 0x4C, 0x34, 0xFA, 0xDC, 0x77, 0xD1, 0x83, 0xA1, 0x8D, 0xEB, 0x12, 0x06, 0x16, 
	0x03, 0x19, 0x6B, 0x5C, 0x37, 0xCD, 0x6A, 0x89, 0x81, 0xD0, 0xD8, 0x77, 0xFF, 0xFF, 0xFF, 0xE8, 
	0xEF, 0x9E, 0x0D, 0x55, 0x00, 0x50, 0x20, 0xD7, 0x6E, 0x00, 0x54, 0x77, 0x3F, 0xB2, 0xFE, 0x73, 
	0x96, 0x18, 0x57, 0xE9, 0x72, 0x41, 0xCE, 0xEF, 0xEC, 0xA8, 0x7F, 0x4C, 0x0B, 0x51, 0x3C, 0x19, 
	0xFF, 0xF3, 0x28, 0xC4, 0x44, 0x09, 0xC8, 0xEE, 0xC5, 0xBE, 0x01, 0x46, 0x5E, 0xAA, 0x00, 0x50, 
	0x00, 0xDF, 0xFE, 0x00, 0xFF, 0xDD, 0x64, 0x6F, 0xA1, 0x44, 0x44, 0x40, 0x53, 0x8F, 0xA9, 0xFC, 
	0xB2, 0x00, 0x71, 0xC0, 0x03, 0xFF, 0xFF, 0xA7, 0xCE, 0xF5, 0x55, 0x00, 0x40, 0x00, 0xBB, 0x6D, 
	0xC0, 0xFF, 0x98, 0x3D, 0xFA, 0xC2, 0xD4, 0x06, 0x71, 0xC2, 0xDB, 0x5F, 0xE6, 0xEF, 0xAB, 0x74, 
	0xBA, 0x95, 0x4C, 0x41, 0x4D, 0x45, 0x33, 0x2E, 0xFF, 0xF3, 0x28, 0xC4, 0x57, 0x07, 0x40, 0xAA, 
	0xD2, 0x58, 0x02, 0x4E, 0x43, 0x39, 0x38, 0x2E, 0x34, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 
	0x55, 0x00, 0x40, 0x05, 0xB6, 0xED, 0xC0, 0x34, 0xBF, 0xFF, 0x30, 0xBF, 0xDD, 0x92, 0x12, 0xE0, 
	0xCA, 0xF7, 0xFB, 0xA0, 0x22, 0x0D, 0x4F, 0xB8, 0xF3, 0x41, 0x81, 0x3D, 0x4A, 0x4C, 0x41, 0x4D, 
	0x45, 0x33, 0x2E, 0x39, 0x38, 0x2E, 0x34, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x12, 0xDB, 0xB7, 
	0xFF, 0xF3, 0x28, 0xC4, 0x75, 0x04, 0xA8, 0xA6, 0xE2, 0x58, 0x08, 0x0A, 0x6E, 0x03, 0xF0, 0x07, 
	0x23, 0x01, 0xCF, 0xE4, 0xC2, 0x3C, 0xDC, 0x1A, 0x47, 0xB2, 0x34, 0x05, 0x5F, 0x76, 0x21, 0x8F, 
	0xB1, 0xC3, 0x93, 0x1C, 0x51, 0xEB, 0xBA, 0x20, 0x66, 0x14, 0xB6, 0x7F, 0xFF, 0xFE, 0x7E, 0xB5, 
	0xF7, 0xC4, 0x07, 0x16, 0x07, 0x03, 0x47, 0x1B, 0xFF, 0x56, 0x06, 0x91, 0x82, 0x02, 0x36, 0xD2, 
	0x7C, 0x86, 0x77, 0x81, 0x06, 0x87, 0x25, 0xBA, 0xFF, 0xF3, 0x28, 0xC4, 0x9D, 0x02, 0x48, 0x02, 
	0xE8, 0x78, 0x00, 0x44, 0x4E, 0xFB, 0xB6, 0x4A, 0xF6, 0x68, 0x54, 0x24, 0x19, 0x14, 0x13, 0xA4, 
	0x98, 0x39, 0xB8, 0xEF, 0xB3, 0xB7, 0x46, 0x1B, 0x50, 0x58, 0xA0, 0x98, 0x4A, 0xC2, 0x31, 0x09, 
	0x29, 0x92, 0xE4, 0xA2, 0x73, 0xA6, 0x55, 0x11, 0xBE, 0x74, 0x6A, 0x6B, 0xA7, 0xB2, 0x4E, 0x9D, 
	0xFF, 0x59, 0x5F, 0xED, 0x89, 0x32, 0x60, 0x73, 0xE1, 0x87, 0xA4, 0x20, 0xB3, 0xF8, 0x73, 0x93, 
	0xFF, 0xF3, 0x28, 0xC4, 0xCE, 0x05, 0x90, 0xAA, 0xC2, 0x58, 0x08, 0x0A, 0x6E, 0x19, 0x79, 0x0A, 
	0x06, 0xAF, 0x0B, 0x00, 0x1C, 0x85, 0x18, 0xFD, 0xAC, 0xAC, 0xE2, 0x43, 0x31, 0x85, 0x5E, 0x1F, 
	0x7F, 0xBE, 0x59, 0x70, 0xE1, 0xD8, 0x7B, 0x52, 0x8D, 0x30, 0xC2, 0x84, 0xA1, 0x21, 0x77, 0x7F, 
	0xFF, 0xF8, 0xD7, 0xA8, 0x1A, 0x0A, 0x95, 0x92, 0x2A, 0x2B, 0x4A, 0x4B, 0x55, 0x4C, 0x41, 0x4D, 
	0x45, 0x33, 0x2E, 0x39, 0x38, 0x2E, 0x34, 0x55, 0xFF, 0xF3, 0x28, 0xC4, 0xE0, 0x06, 0xD9, 0x1E, 
	0xBE, 0x58, 0x00, 0x44, 0x5E, 0x09, 0xB9, 0x46, 0xE3, 0xF0, 0x07, 0x99, 0x97, 0x4C, 0xCB, 0xE5, 
	0x96, 0x47, 0x23, 0x26, 0x50, 0xC0, 0xC1, 0x82, 0x6C, 0xFA, 0x9B, 0x8A, 0x8A, 0x8B, 0x1A, 0x02, 
	0x85, 0x45, 0x0F, 0xEB, 0x6F, 0xFF, 0xFD, 0x58, 0xA8, 0xA5, 0x4D, 0x16, 0x15, 0x4C, 0x41, 0x4D, 
	0x45, 0x33, 0x2E, 0x39, 0x38, 0x2E, 0x34, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 
	0xFF, 0xF3, 0x28, 0xC4, 0xEF, 0x0A, 0xC1, 0x4A, 0xC4, 0x7E, 0x00, 0x4C, 0xD2, 0x55, 0x55, 0x55, 
	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 
	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 
	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 
	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xFF, 0xF3, 0x28, 0xC4, 0xFF, 0x14, 0x21, 0x56, 
	0x58, 0x00, 0x33, 0x12, 0xE4, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 
	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 
	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 
	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 
	0xFF, 0xF3, 0x28, 0xC4, 0xE9, 0x0B, 0x09, 0x32, 0x80, 0x56, 0x00, 0x46, 0xC0, 0x55, 0x55, 0x55, 
	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 
	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 
	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 
	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xFF, 0xF3, 0x28, 0xC4, 0xEC, 0x0A, 0x00, 0xDE, 
	0x44, 0x7E, 0x00, 0x46, 0xC8, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 
	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 
	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 
	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};  
  
  

  
  
unsigned char xxx,iii,jjj;  
unsigned char KB_X;
unsigned char numnum;
unsigned char numnum_CRC;

unsigned int yyy;


unsigned char UART_DATA;  
  
  
  

  
uint8_t mycode[] = {0x12,0x13,0x14}; 
  
 
  
void Key_Init()
{
	GPIO_InitTypeDef  GPIO_InitStructure;

	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOB时钟

	//GPIOB1初始化设置
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输出模式
//	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;//100MHz
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
}
  
  
  
int main(void)
{	
	int i,j;
	
		delay_init(168);
	
  /*初始化USART 配置模式为 115200 8-N-1,中断接收*/
  Debug_USART_Config();
	
	Key_Init();	
	
	/* 发送一个字符串 */
//	Usart_SendString( DEBUG_USART,"这是一个串口中断接收回显实验\n");
//	printf("这是一个串口中断接收回显实验\n");
	
  while(1)
	{	
		
		if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0)
		{
			delay_us(10000);
			
			if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0)
			{

/******************************************************
 - MCU端发起下载的指令 -- 
******************************************************/
				Usart_SendByte(USART1, 0x7E);
				Usart_SendByte(USART1, 0xA0);
				Usart_SendByte(USART1, 0x00);
				Usart_SendByte(USART1, 0x03);
				Usart_SendByte(USART1, 0x01); //第一个文件
				Usart_SendByte(USART1, 0x00);
				Usart_SendByte(USART1, 0x0A); //总包数---是10包
				Usart_SendByte(USART1, 0xEF);
				
				delay_us(10000); //这里延时大概在100ms
				delay_us(60000);
				delay_us(60000);

				
				for(xxx = 1; xxx <= 10; xxx++)
				{
					
					Usart_SendByte(USART1, 0x7E);
					Usart_SendByte(USART1, 0xA1);
					Usart_SendByte(USART1, 0x00);
					Usart_SendByte(USART1, xxx); //下载的包的序号
					for(yyy=0; yyy<256; yyy++)
					{
						Usart_SendByte(USART1,musicdata[(xxx-1)*256 + yyy]); //当前包的实际数据
						
						delay_us(1000);
					}
					Usart_SendByte(USART1, 0xEF); //结束
					delay_us(1000);
				}
				
				
				Usart_SendByte(USART1, 0x7E);
				Usart_SendByte(USART1, 0xA3);
				Usart_SendByte(USART1, 0x00);
				Usart_SendByte(USART1, 0x02);
				Usart_SendByte(USART1, 0x00);
				Usart_SendByte(USART1, 0x01);
				Usart_SendByte(USART1, 0xEF); //MCU告诉KT803c 。当前的文件已经发送完毕
				
				delay_us(10000);
				
				
				Usart_SendByte(USART1, 0x7E);
				Usart_SendByte(USART1, 0xA3);
				Usart_SendByte(USART1, 0x00);
				Usart_SendByte(USART1, 0x02);
				Usart_SendByte(USART1, 0x00);
				Usart_SendByte(USART1, 0x00);
				Usart_SendByte(USART1, 0xEF);//MCU告诉KT803c 。下载过程完毕,退出下载模式
				
				delay_us(10000);
				
				
				
				
				Usart_SendByte(USART1, 0x7E);
				Usart_SendByte(USART1, 0xA6);
				Usart_SendByte(USART1, 0x00);
				Usart_SendByte(USART1, 0x02);
				Usart_SendByte(USART1, 0x00);
				Usart_SendByte(USART1, 0x01);
				Usart_SendByte(USART1, 0xEF);//MCU告诉KT803c 。播放分区2里面的第1段音乐

				
			}
		}
	}	
}



/*********************************************END OF FILE**********************/

你可能感兴趣的:(语音芯片,单片机,物联网,51单片机)