
1.概述
10、消防语音报警提示;
2.4下文的概念解析
1、分区的概念
(1)、由于我们将spiflash默认的分为了两个区间,所以下文会提到,第一分区和第二分区的概念.
(2)、其中第一分区指的是可以通过USB下载固定语音的部分空间
(3)、其中第二分区指的是通过串口动态更新的部分空间
(4)、两个空间相互独立,互不干扰,可以分别控制,也可以统一控制,详见下文的介绍
以下所有的流程,您只需要在逻辑上面分析一下,知道一个大概即可,我们有单独的上位机软件来配合调试的,所有的命令以及下载的流程都在上位机里面有体现
波特率: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 串口下载的详细说明
1、如果上位机发送一个100.2KB的音频文件至芯片,那么发送的细节如下
(1)、首先分析这100.2KB的数据,将这个数据拆分为以256[0.25kb]个字节为单位的数据包.那么总共需要传400.8次才能将这一帧数据传完。重点注意后面的0.8次实际上是占用一次的,不够256个字节的字节补0。组成一个完整的256字节的数据包,即总包数为401包
(2)、开始握手。上位机发送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”代表第一包数据收到,此时上位机依次往下发,下位机每次收到之后,都会返回当前包的序号作为应答
==> 如果上位机在5秒之类没有收到下位机的应答,则重发。重发第二次还未收到应答,则意味着此次下载失败,上位机需要做的事情就是发送“复位命令”,然后等待100ms,再重新发起下载。
2、如果第3个文件上位机发送完毕:
(1)、上位机主动往下位机发送“7E A3 00 02 00 03 EF”,这样代表上位机已经将当前全部下发完毕。
(2)、等待下位机应答。如果下位机接收没问题,会返回这条指令作为应答,上位机再继续下一个文件的下载流程
【备注:每一包数据,我们芯片收到之后会自动写入到存储器之中。】
3、如果上位机发送完所有的数据之后的处理
(1)、确认一下所有的应答都接收是否有误,如果无误,则上位机主动发出一个
“7E A3 00 02 00 00 EF” --- 代表整个下载过程完成,告知下位机退出下载模式
(2)、同时下位机收到这个命令之后,开始校验整个的文件数,确认没问题返回“7E 3F 00 02 dat1 dat2 EF”作为应答,同时下位机退出下载模式。进入正常等待状态”。
[dat1:第一分区文件总数]
[dat2:第二分区文件总数] --- 串口下载的部分
这里使用上位机单独下载一个文件的截图:
串口下载所使用的指令“0xA0”、“0xA1”、“0xA2”、“0xA3”
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包的应答 |
7E A0 00 02 00 02 EF | 下位机返回给上位机第2包的应答 |
.......... |
|
7E A0 00 02 01 91 EF | 下位机返回给上位机第401包的应答 |
7E A3 00 02 00 03 EF | 上位机本文件的最后一包数据的应答收到之后,就发送这条命令代表上位机当前文件的全部数据发送完毕,等待下位机校验之后的应答,下位机校验无误之后,返回此帧数据,作为应答。上位机收到之后开启下一帧的数据发送流程 |
7E A3 00 02 00 04 EF | 代表第4个文件接收完毕 |
... |
|
7E A3 00 02 00 0b EF | 代表第11个文件接收完毕 |
7E A3 00 02 00 00 EF | 收到下位机最后一个文件的最后一个应答之后,上位机主动发出,代表文件全部更新完毕,下位机收到之后,校验全部的文件是否正常,如果正常,则返回此帧数据作为应答,同时退出下载模式 |
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 | 全部文件校验出错[针对全部文件下载完之后] |
这个暂时可以不处理。
串口作为一种在控制领域常用的通信,我们进行了工业级别的优化,加入的帧的校验、重发、错误处理等措施,大大加强通信的稳定性和可靠性,串口的通信波特率默认为115200,不可再设置
支持异步串口通讯模式,通过串口接受上位机发送的命令 停止位 :1 | ||
格式:$S VER Len CMD Feedback para1 para2 checksum $O | ||
1 | 0x7E | 起始标记 |
2 | CMD | 命令字节 |
3 | lenH | 包的序号--高字节 |
4 | lenL | 包的序号--低字节 |
..... | DAT | 数据区 |
结束 | 0xEF | 结束标志 |
举个例子,如果我们指定播放SPIFLASH,就需要发送:7E A5 00 02 00 01 EF
数据长度为2 ,这2个字节分别是[00 01] 。代表是指定第一分区的第一段语音播放
我们的通讯分为以下两大块
n 控制指令
n 查询芯片的参数以及状态
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 | 开始下载的起始指令 | 详见“串口下载完整说明” |
0xA1 | 下载的有效数据指令 | 详见“串口下载完整说明” |
0xA2 | 应答信息 | 详见“串口下载完整说明” |
0xA3 | 当前的文件下载完毕 | 详见“串口下载完整说明” |
这里是查询芯片的状态和相关的参数
CMD命令详解(查询) | 对应的功能 | 参数(16位) |
0x3C | 保留 |
|
0x3D | 保留 |
|
0x3E | 保留 |
|
0x3F | 查询初始化的状态 | 详见3.5.1 |
0x40 | 返回错误,请求重发 |
|
0x41 | 应答 |
|
0x42 | 查询当前状态 | 详见3.4.10 |
0x43 | 查询当前音量 |
|
0x49 | 查询FLASH的总文件数 | 高字节[第一分区] 低字节[第二分区] |
0x50 | 查询使用的flash的容量 |
|
芯片在关键地方均会有数据返回。供用户掌控芯片的工作状态
n 芯片上电初始化成功的数据
n 芯片播放完当前曲目的数据
n 芯片成功接收到指令返回的ACK(应答)
n 芯片接收一帧数据出错[包括数据没收完整、校验出错两种情况]
n 芯片在繁忙时,有数据过来,芯片会返回忙的指令
(1)、芯片上电,需要一定的时间初始化,这个时间是需要根据SPIFLASH设备的文件多少决定的,一般情况在小于500ms。如果超过这个时间芯片的初始化数据还没有发送出来,说明芯片初始化出错,请检查硬件的连接
(2)、芯片初始化返回的数据为当前的有效文件夹,譬如返回7E 3F 00 002 06 05 EF
==>其中0x06代表的是第一分区的总文件数为6个
==>其中0x05代表的是第二分区的总文件数为5个
(3)、MCU必须等待芯片初始化指令发出之后才能发送相应的控制指令,否则发送的指令芯片将不予处理。同时还会影响芯片的正常初始化。
FLASH第一分区播放完第1曲 | 7E 3E 00 02 00 01 EF |
FLASH第二分区播放完第2曲 | 7E 39 00 02 00 01 EF |
1、争对很多的触发型的播放需求,我们模块更正为播放一曲之后自动进入停止状态。如果用户需要此类应用。只需要指定曲目播放即可。这样,曲目播放完毕会自动停止,等待指令
2、另外我们专门开辟一个IO作为解码和暂停的状态指示。请参见第BUSY脚
(1)、播放状态输出低电平[很多功放有静音脚,可以通过此IO直接进行控制]
(2)、播放暂停状态,输出高电平。模块睡眠状态。也是低电平
3、模块通电之后,初始化正常 ,模块会自动进入设备播放状态。并且停止解码,等待用户发送播放的相关指令
4、另外用户在指定设备之后,需要等待200ms的时间,再发送指定的曲目,因为一旦指定设备之后,系统会对指定的设备进行文件系统的初始化,如果立刻发送指定的曲目命令,会导致模块接收不到。
1、芯片在所有的命令或者查询数据包接收完毕之后,会返回当前接收到的数据给MCU,作为接收到的ACK信号




