3.串口通讯协议
串口作为一种在控制领域常用的通信,我们进行了工业级别的优化,加入的帧的校验、重发、错误处理等措施,大大加强通信的稳定性和可靠性,同时可以在此基础上扩展更加强大的RS485
进行组网功能,串口的通信波特率可自行设置,默认为9600
3.1 通讯格式
支持异步串口通讯模式,通过串口接受上位机发送的命令 停止位 :1 | ||
格式:$S VER Len CMD Feedback para1 para2 checksum $O | ||
|
|
|
$S | 起始位0x7E | 每条命令反馈均以$开头,即0x7E |
VER | 版本 | 版本信息 |
Len | len后字节个数 | 校验和不计算在内 |
CMD | 命令字 | 表示具体的操作,比如播放/暂停等等 |
Feedback | 命令反馈 | 是否需要反馈信息,1反馈,0不反馈 |
dat | 参数 | 和前面的len相关联,不限制长度 |
checksum | 校验和[占两个字节] | 累加和校验[不计起始位$] |
$O | 结束位 | 结束位0xEF |
|
|
|
举个例子,如果我们指定播放SPIFLASH,就需要发送:7E FF 06 09 00 00 04 FF dd EF
数据长度为6 ,这6个字节分别是[FF 06 09 00 00 04] 。不计算起始、结束、和校验。然后对得到的结果进行累加,再用0减,即“0-checksum=校验数据”。如果这里不明白,可以参考我们的“QYMxFS辅助说明文档”。另外用户也可以直接忽视校验,参考我们的5.3.4章节说明。
3.2 通讯指令
我们的通讯分为以下两大块
- 控制指令
- 查询芯片的参数以及状态
3.2.1 控制指令
CMD命令 | 对应的功能 | 参数(16位) |
0x01 | 下一曲 |
|
0x02 | 上一曲 |
|
0x03 | 指定曲目(NUM) | 详见3.4.1 |
0x04 | 音量+ |
|
0x05 | 音量- |
|
0x06 | 指定音量 | 详见3.4.2 |
0x08 | 单曲循环指定曲目播放 | 详见3.4.3 |
0x09 | 指定播放设备 | 保留 |
0x0A | 进入睡眠 -- 低功耗 | 详见3.4.5 |
0x0B | 唤醒睡眠 |
|
0x0C | 芯片复位 | 任何状态有效 |
0x0D | 播放 |
|
0x0E | 暂停 |
|
0x0F | 指定文件夹文件名播放 | 详见3.4.6 |
0x14 | 单个文件夹支持1000首曲目 | 保留 |
0x15 | 停止插播播放背景音乐 | 详见3.4.9 |
0x16 | 停止 |
|
0x17 | 指定文件夹循环播放 | 详见3.4.10 |
0x18 | 指定根目录随机播放 | 详见3.4.11 |
0x19 | 对当前播放的曲目设置为循环播放 | 详见3.4.12 |
0x1A | 开启和关闭芯片的DAC输出 | 详见3.4.13 |
0x21 | 组合播放 | 详见3.4.14 |
0x25 | 多文件夹插播 | 详见3.4.16 |
0x28 | 指定文件夹随机播放 | 详见3.4.18 |
3.2.2 查询指令
这里是查询芯片的状态和相关的参数
CMD命令详解(查询) | 对应的功能 | 参数(16位) |
0x3C | 保留 |
|
0x3D | 保留 |
|
0x3E | 保留 |
|
0x3F | 查询在线的设备 | 详见3.5.1 |
0x40 | 返回错误,请求重发 |
|
0x41 | 应答 |
|
0x42 | 查询当前状态 | 详见3.4.10 |
0x43 | 查询当前音量 |
|
0x44 | 查询当前EQ | 保留 |
0x45 | 保留 | 该版本保留此功能 |
0x46 | 保留 | 该版本保留此功能 |
0x49 | 查询FLASH的总文件数 | 5个文件夹的总文件数 |
0x4D | 查询FLASH的当前曲目 | 返回文件夹号和曲目指针 |
0x4E | 查询指定文件夹的曲目总数 | 详见3.5.3 |
0x4F | 查询当前设备的总文件夹数 | 详见3.5.4 |
0x61 | 查询当前文件夹指针 | 仅支持FLASH |
3.3 芯片返回的数据
芯片在关键地方均会有数据返回。供用户掌控芯片的工作状态
- 芯片上电初始化成功的数据
- 芯片播放完当前曲目的数据
- 芯片成功接收到指令返回的ACK(应答)
- 芯片接收一帧数据出错[包括数据没收完整、校验出错两种情况]
- 芯片在繁忙时,有数据过来,芯片会返回忙的指令
- U盘、TF卡插入拔出,均有数据返回
3.3.1 芯片上电返回的数据
(1)、芯片上电,需要一定的时间初始化,这个时间是需要根据SPIFLASH设备的文件多少决定的,一般情况在小于500ms。如果超过这个时间芯片的初始化数据还没有发送出来,说明芯片初始化出错,请检查硬件的连接
(2)、芯片初始化返回的数据为当前的有效文件夹,譬如返回7E FF 06 3F 00 00 03 xx xx EF
==>其中0x03代表的是U盘和TF这两个设备在线
PC -- 在线 | 7E FF 06 3F 00 00 04 xx xx EF | 即下载模式 |
FLASH -- 在线 | 7E FF 06 3F 00 00 08 xx xx EF |
|
- 、MCU必须等待芯片初始化指令发出之后才能发送相应的控制指令,否则发送的指令芯片将不予处理。同时还会影响芯片的正常初始化。
3.3.2 曲目播放完毕返回的数据[0x3C][0x3D][0x3E]
U盘播放完第1曲 | 7E FF 06 3C 00 00 01 xx xx EF |
U盘播放完第2曲 | 7E FF 06 3C 00 00 02 xx xx EF |
TF卡播放完第1曲 | 7E FF 06 3D 00 00 01 xx xx EF |
TF卡播放完第2曲 | 7E FF 06 3D 00 00 02 xx xx EF |
FLASH播放完第1曲 | 7E FF 06 3E 00 00 01 xx xx EF |
FLASH播放完第2曲 | 7E FF 06 3E 00 00 02 xx xx EF |
- 争对很多的触发型的播放需求,我们模块更正为播放一曲之后自动进入停止状态。如果用户需要此类应用。只需要指定曲目播放即可。这样,曲目播放完毕会自动停止,等待指令
- 另外我们专门开辟一个IO作为解码和暂停的状态指示。请参见第BUSY脚
- 播放状态输出低电平[很多功放有静音脚,可以通过此IO直接进行控制]
- 播放暂停状态,输出高电平。模块睡眠状态。也是低电平
3.模块通电之后,初始化正常 ,模块会自动进入设备播放状态。并且停止解码,等待用户发送播放的相关指令
4、另外用户在指定设备之后,需要等待200ms的时间,再发送指定的曲目,因为一旦指定设备之后,系统会对指定的设备进行文件系统的初始化,如果立刻发送指定的曲目命令,会导致模块接收不到。
5、设备播放完每一段语音,都会有数据返回,举例说明:
7E FF 06 3C 00 00 01 xx xx EF
其中0x3C代表的是U盘,详细的请参见上表
其中0x00,0x01代表的是第1段语音播放完毕
0x01,0xF4代表的是第500段语音播放完毕。因为0x01F4 = 500.这里分别代表的是高低字节
6. 由于设备中所有的文件均是以物理顺序进行识别的,包括指定文件夹文件名播放,播放完毕之后,返回的数据还是其存储的物理顺序编号,这点请用户朋友留意。
3.3.3 模块应答返回的数据[0x41]
模块返回ACK | 7E FF 06 41 00 00 00 xx xx EF | 说明成功接收数据 |
(1)、为了加强数据通信之间的稳定性,我们增加了应答处理,ACKB字节就是设置是否需要回复应答。这样做的好处是保证每次通信都有握手信号,收到应答就表示MCU发送的数据,模块已经成功收到,马上处理。
(2)、对于一般的应用,客户可以自由选择,不加这个应答处理也是可以的。
3.3.4 模块错误返回的数据[0x40][0x50]
返回忙 | 7E FF 06 40 00 00 01 xx xx EF | 芯片在文件系统初始化时 |
当前是睡眠模式 | 7E FF 06 40 00 00 02 xx xx EF | 睡眠模式只支持指定设备 |
串口接收错误 | 7E FF 06 40 00 00 03 xx xx EF | 串口一帧数据没接收完毕 |
校验出错 | 7E FF 06 40 00 00 04 xx xx EF | 和校验出错 |
指定文件超范围 | 7E FF 06 40 00 00 05 xx xx EF | 文件的指定超过设定的范围 |
未找到指定文件 | 7E FF 06 40 00 00 06 xx xx EF | 指定为文件没有被找到 |
插播错误 | 7E FF 06 40 00 00 07 xx xx EF | 插播只允许在播放的状态下进行 |
播放TF卡错误 | 7E FF 06 40 00 00 08 xx xx EF | TF卡读取失败或者TF卡被拔出或者有坏区 |
FLASH初始化出错 | 7E FF 06 40 00 00 09 xx xx EF | FLASH里面的文件系统信息错误 |
进入睡眠 | 7E FF 06 40 00 00 0A xx xx EF | 进入SLEPP模式 |
1、为了加强数据通信之间的稳定性,我们增加了数据错误处理机制。模块收到不符合格式的数据,或者异常均会有信息反馈出来
2、在环境比较恶劣的情况下,强烈建议客户处理此命令。如果应用环境一般,可以不用处理。
3、模块返回忙,基本上是模块上电初始化的时候才会返回,因为模块需要初始化文件系统
4、只要参考我们给出的测试SDK程序,移植里面的串口操作部分,就不会出现校验出错,在这里强烈建议用户使用我们给出的校验方式。因为谁都不能保证数据的传输不会出错。
3.3.5 设备插入拔出消息[0x3A][0x3B]
U盘插入 | 7E FF 06 3A 00 00 01 xx xx EF |
TF插入 | 7E FF 06 3A 00 00 02 xx xx EF |
PC插入 | 7E FF 06 3A 00 00 04 xx xx EF |
U盘拔出 | 7E FF 06 3B 00 00 01 xx xx EF |
TF拔出 | 7E FF 06 3B 00 00 02 xx xx EF |
PC拔出 | 7E FF 06 3B 00 00 04 xx xx EF |
1、为了加强模块灵活性,我们特别增加了,设备插入、拔出的指令反馈。方便知道模块的工作状态。
2、设备插入的时候,我们默认进入到设备等待状态,如果用户插入的是带灯的U盘,可以看到U盘灯闪烁。也可以接收到设备插入的串口消息。
3.3.6 设备文件系统初始化成功返回[0x90]
U盘挂载文件系统OK | 7E FF 06 90 00 00 01 xx xx EF |
TF卡挂载文件系统OK | 7E FF 06 90 00 00 02 xx xx EF |
spiflash挂载文件系统OK | 7E FF 06 90 00 00 04 xx xx EF |
- 主控芯片初始化设备,并且挂载文件系统成功之后,新增此数据的返回,方便用户掌握状态
- 三种设备,挂载成功之后均会返回对应的数据