芯片的使用,关键的地方做如下说明:
IO输入特性 |
||||||
符号 |
参数 |
最小 |
典型 |
最大 |
单位 |
测试条件 |
VIL |
Low-Level Input Voltage |
-0.3 |
- |
0.3*VDD |
V |
VDD=3.3V |
VIH |
High-Level Input Voltage |
0.7VDD |
- |
VDD+0.3 |
V |
VDD=3.3V |
IO输出特性 |
||||||
符号 |
参数 |
最小 |
典型 |
最大 |
单位 |
测试条件 |
VOL |
Low-Level Output Voltage |
- |
- |
0.33 |
V |
VDD=3.3V |
VOH |
High-Level Output Voltage |
2.7 |
- |
- |
V |
VDD=3.3V |
|
|
|
|
|
|
|
1、芯片对外的接口均是3.3V的TTL电平,所以在硬件电路的设计中,请注意电平的转换问题。
另外在强干扰的环境中,请注意电磁兼容的一些保护措施,GPIO采用光耦隔离,增加TVS等等
2、串口通信,在一般的使用环境下,注意好电平转换即可。如果强干扰环境,或者长距离的RS485应用,那么请注意信号的隔离,严格按照工业的标准设计通信电路。可以联系我们,我们提供设计参考
3、我们支持音频文件的采样率最低为8KHZ。也就是说低于8KHZ的音频文件是不支持的,不能正常解码播放。用户可以使用音频处理软件,提高音频文件的采样率来解决这个问题。
4、芯片在睡眠状态的电流在10MA左右,播放中,依据音量的大小以及外接的喇叭负载,峰值电流可以达到1A。功耗会比较大。如果使用在低功耗场合,请用户控制芯片或者芯片的供电。这样可以减小芯片的功耗
5、用户如果直接使用我们芯片自带的功放,请选择合适的喇叭即可。推荐使用4欧姆/3W。这个是使用效果最好的配置。选用其它的喇叭,请注意负载大小,以及功率这两个参数
6、该芯片芯片支持MP3、WAV二种主流的音频格式。推荐用户尽量使用MP3格式,因为这样就更节省FLASH的容量。
7、我们的芯片支持8/11.025/12/16/22.05/24/32/44.1/48KHZ 采样率的音频文件,这些也是网络上绝大多数的音频文件的参数。如果用户的音频文件的采样率不在此范围内,是不支持播放的,但是可以通过专用的软件转换一下即可。我们的优势就是无压缩播放和高音质,所以不太建议用户对音频进行压缩。
串口部分的操作,参见下面的流程,我们提供了完整的参照例程,供用户参考:
目前我们提供的串口编程参考代码,有两部分
1、芯片上电之后,需要大概1S-1.5S时间进行初花的相关操作,初始化完毕之后,会有初始化的相关数据发送出来。用户也可以直接不理会这些数据
2、当指定设备播放之后,需要延时200ms的时间,再发送指定曲目等等相关指令。
3、因为芯片自带文件系统,正常情况下,在曲目不大于1000首的话,响应速度是低于50ms的
曲目超过3000首之后,文件系统的切换速度会变慢一点,响应速度在100ms --- 1S之间不等
4、芯片内部对串口的处理是10MS处理一次,所以连续的指令发送时,必须要间隔20MS的延时。否则前面的指令将会被覆盖而得不到执行
5、如果指定文件夹文件名播放[0x0F、0x14]延时必须大于40ms,因为芯片锁定文件是需要时间的。只要涉及到文件夹文件名查找的相关指令,40MS的延时是必不可少的。如果芯片当前正在查找文件,串口的数据过来太频繁,会导致芯片的工作不正常
1、针对很多用户不太习惯校验的通信方式,我们特别推出了带校验和不带校验的兼容方式。举例说明。如果我们发送组合播放指令如下:
组合播放[不带校验] |
7E FF 09 21 00 05 01 02 03 04 EF |
播放5、1、2、3、4 |
组合播放[带校验] |
7E FF 09 21 00 05 01 02 03 04 FE C8 EF |
播放5、1、2、3、4 |
比较两条指令的区别,就是省略掉的校验的2个字节。这两帧数据均可以被芯片所接收。
2、因为很多用户在使用的过程中,很多都是使用不带晶振的MCU。这样的话,我们必须建议您加上校验这种方式,来保证通信的稳定性。
3、假如用户使用STM32或者STC等等MCU,并且是外挂晶振的,就可以适当的省掉校验。因为不带晶振的MCU,时钟是相对不那么准的,所以串口会存在误差,一旦误差过大,会导致通信出错。请用户朋友自行斟酌。
发送的指令,去掉起始和结束。将中间的6个字节进行累加,最后取反再+1得到校验码。接收端就将接收到的一帧数据,去掉起始和结束。将中间的数据累加,再加上接收到的校验字节。刚好为0.这样就代表接收到的数据完全正确。
举例说明:
举个例子,如果我们播放下一曲,就需要发送:7E FF 06 01 00 00 00 FE FA EF
数据长度为6 ,这6个字节是[FF 06 01 00 00 00] 。不计算起始、结束、和校验。校验字节为FE FA。
发送端得到校验码的过程:
相加的过程: FF+06+01+00+00+00 = 0x0106
取反加1的过程:0x0106取反 = FEF9 / 再+1 = 0xFEFA,和我们的校验值对比一下
接收端进行校验的过程:
相减的过程: 0 - 0x0106 = 0xFEFA 。再和我们的结果比较一下。
最后可以参考一下我们给出的参考例程,或者直接移植我们给出的函数。就很容易理解了
1、原则上我们建议用户,使用11.0592MHZ或者相倍数的晶振。这样可以让串口产生9600的波特率会更准确。我们的芯片串口误差是允许在3%以内的
2、如果用户在12M的晶振时。首先要做如下判断,
(1)、看是什么MCU,51或者PIC、STM32等等,基本都自带波特率发生器,所以产生9600的波特率基本没压力。
(2)、看MCU是否为硬件串口,如果是IO模拟的串口的话,强烈建议用户使用11.0592的晶振
(3)、标准的51,如:STC89C52或者AT89C52等等都是采用定时器产生波特率的,经过简单的计算就可以算出,12M晶体做9600波特率的误差是是0.16%,正常运行是没有任何问题,但还是需要用户进行全面测试
1、按照物理顺序指定曲目播放:
需要按照下图的方法往SPIFLASH中拷贝歌曲。先拷贝进设备的,编号为第一首,以此类推
2、指定文件夹和文件名播放
详情请参考芯片数据手册的“3.4.6指定文件夹文件名的播放”章节
1、首先现在网上下载一个软件”串口猎人”,为什么选择这个,因为它有自动搜索串口的功能,十分好用。打开之后的主界面如上图所示,可以看到红色部分,依次设置即可
2、打开软件,首先要搜索串口,找到指定的端口之后,指定“波特率”,我们的芯片默认的波特率为9600,最后就是“启动串行端口”,这样软件就配置好了。这里有两个概念需要明确一下
第一是“HEX码”,我们默认是这个,这个是用来显示数据的。所以必须设置这里
第二是“字符串”,这个是用来显示打印字符的,我们这里用不到。
3、软件配置OK之后,将需要的指令复制到发送区域即可。具体的指令请参照芯片的数据手册
4、如果芯片的数据手册没有的测试指令的话,请自行计算,尤其需要注意的是“校验和”这两个字节,如何计算不对的话,芯片是不接受指令的,同时会返回相应的错误指令
我们这里的说明,争对的是用户的MCU给我们的芯片发送控制指令
1、发送端 --- 用户的MCU
/******************************************************************************
- 功能描述: 串口向外发送命令[包括控制和查询]
- 参数说明: CMD:表示控制指令,请查阅指令表,还包括查询的相关指令
feedback:是否需要应答[0:不需要应答,1:需要应答]
data:传送的参数
******************************************************************************/
void Uart_SendCMD(INT8U CMD ,INT8U feedback , INT16U dat)
{
Send_buf[0] = 0xff; //保留字节
Send_buf[1] = 0x06; //长度
Send_buf[2] = CMD; //控制指令
Send_buf[3] = feedback;//是否需要反馈
Send_buf[4] = (INT8U)(dat >> 8);//datah
Send_buf[5] = (INT8U)(dat); //datal
DoSum(&Send_buf[0],6); //校验
SendCmd(8); //发送此帧数据
}
DoSum(&Send_buf[0],6); 这里是指对Send_buf[0]---Send_buf[5]这6个字节进行校验的算法
生成校验的两个字节,并且存储于Send_buf[6]和Send_buf[7]中
/******************************************************************************
- 功能描述:求和校验
- 和校验的思路如下:
发送的指令,去掉起始和结束。将中间的6个字节进行累加,最后取反码。接收端就将接收到的一帧数据,去掉起始和结束。将中间的数据累加,再加上接收到的校验字节。刚好为0.这样就代表接收到的数据完全正确。
******************************************************************************/
void DoSum( INT8U *Str, INT8U len)
{
INT16U xorsum = 0;
INT8U i;
for(i=0; i
{
xorsum = xorsum + Str[i];
}
xorsum = 0 -xorsum;
*(Str+i) = (INT8U)(xorsum >>8);//得到高字节
*(Str+i+1) = (INT8U)(xorsum & 0x00ff);//得到低字节
}
2、接收端,芯片发送数据给用户的MCU
If(一帧数据接收完毕)
{
for(i=0; i<(*(pi+1)); i++)//这里pi指向的是接收缓冲区,*(pi+1)是获取数据长度。
{
xorsum = xorsum + pi[i] ;//将接受到的数据进行累加
}
xorsum1 = ((u16)((*(pi+i))<<8)) | (*(pi+i+1));//这里是接收到的校验字节,16位
xorsum = xorsum + xorsum1;//将接收到的校验字节和自己算的校验数据相加
if(!xorsum)
{
Uart_Task(pi);//串口处理--对接收到的指令进行处理
}
else
{
ErrorStatus = ERROR_CheckSError ;//接收校验出错
//校验码出错之后的处理
}
}
3、用户无论使用的是什么MCU,这两个函数均可以平行的移植到自己的程序中。
这里为什么增加两个二极管,分两种情况说明