Ant_V1二期工程

简介 二期工程里主要包含的是原件的选择(更为细致),原理图,PCB,封装图库的完成以及第一次打样测试(这个真的是第一次打样的经历)过程,由于 当时没有录制视频,现在手里的只有一堆的电路,器件的手册材料,以及驱动代码等。

概述

         二期工程里主要包含的是原件的选择(更为细致),原理图,PCB,封装图库的完成以及第一次打样测试(这个真的是第一次打样的经历)过程,由于 当时没有录制视频,现在手里的只有一堆的电路,器件的手册材料,以及驱动代码等。

         貌似我github上传的是这期的工程如果你要参考的话,我会在GitHub上更新然后区别一下版本,以及工程记录文件。

 

原件的选择(细分)

下面是有关器件的选择以及图片型号以及原件来源:

电阻以及电容的选择:

晶振:3.726kHz 8MHz 12.228Hz

Mcustm32f103rgt6(1M flash 72MHz )

解码芯片:VS1053B

储存:MicroSD

LCD2.0

按键:方形按键

LED:直接使用小的led

耳机孔:

其他杂项:

原理图及封装图

下面只是一些展示如果想要所有的文件工程的话呢请到文章的末尾找到笔者在GitHub上上传的文件。

LED

image.png

MicroSD

image.png

耳机孔:

 


image.png

 

 

         注重原理而不是电路的连接,另外多的是使用功能而不是电路的具体电流电压属性,由于数字的路的工作电压的范围变动允许值还是比较大的,所以这里除了对电源于有要求外其余大要求不是太大,这里的电源包括了mcu的电源,LCD电源(由于LCD的背光是耗电比较大的),还有就是对于VS1053B的专门的电源,包括1.8v的以一个IOVCC(通过电阻分压大概3.0v)。

         其实在这里比较困难的是我不确定原子给的原理图是否可以直接用,但是由于他们出了模块所以这里就直接使用了一些电路配置,本工程没有使用外放说以电路上又有一些改进,这里在Vs1053B的配置过程中有一个管脚让我比较长困惑的是它的功能,那就是GRUND,手册上说在不使用的时候不能接地,但是在网络上查找相关的资料以后得到的结果是,其实这是耳机的公共地,也就是耳机的地线。

下面是我电路的配置。

电源(供电给MCU 以及其部件):通过AMS1117-3.35VUSB输入转换成3.3V供电

3.3V的滤波电解电容改为了220uf普通电容)

image.png

 

LCD及供电:

image.png

(这里注意图中BlackLight+最终的限流电阻更改成了27R3.3V的滤波电解电容改为了220uf普通电容)

 

MCU电路配置:

image.png

(我已经最大限度保持清晰了,想看原理图的话还是在文章末尾在GitHub上找吧!)

 

 

W25Q128以及MicoSD电路配置:

image.png

(开始的时候我还以为MicroSD对电压比较敏感呢,这里其实就几个上拉电阻而已)。

Key(按键):

image.png

这里的配置其实没有加消抖电容,这是由于最终的排版的位置不够索性就去掉了软件处理一下问题其实不大。

 

 

UARTSWD(仿真下载):uart这里没有考虑到使用的特殊情况直接没有任何的限制,然后外接一个ch340用于调试,swd则是借鉴jtag的接法接的。


 image.png

这就是一个jtag下载器的接法由于我用的是swd的下载方式其他无用的线路也就按照这里的接法拉高了。

 

 

 

 

 

 

具体的接法

image.png

重点来了这里是VS1053B的电路配置

VS1053B:包括VS1053B芯片周围电源以及耳机接口

 

image.png

电源1.8V

image.png

耳机接口:

image.png

好了就是所有的电路配置了,下面是一张全图,很模糊的还是看我上传的工程文件吧。

 image.png


 

         中间其实除了很多的状况,这才是小白吧,不过初期遇到问题越多也越好,这一样以后遇到类似的问题解决问题的能力就能够体现出来了,写代码也一样啊,所以呀,一个问题出来你还不会解决的时候就是你最好的学习机会。虽然这样的经历是不是很友好的甚至你还会反感但是现实不就是这样么。

 

在下面直接就是PCB图了(貌似我github上传的是这期的工程图)

PCB:

image.png

 

以上就是最终的PCB的样子了。但是这里的的问题是:

1.屏幕接线的尺寸画错了,本来0.4mm的尺寸我画成了0.8mm以上了。

2.没有关注高频的线路的设计,也就是下图的地方,下方直接就从晶振的下方穿过去了。

image.png

 

商家的选择

         其实这里商家的选择很简单,便宜就行,我开始的时候还专门整理一下价格以及他们的制程等,例如:

image.png

其实不必要这样,你只要保证你的你的PCB线宽大于8mil,线距也大于8mil(因为大部分线距为6mil),过孔大小大于8mil就好了,这三个条件其实我不用怎么调整对于我这样的工程完全没问题。

另外第一次打样我就被坑了,人家说50块(打印10片)我就给了,记住啊,普通10cm*10cm的板子1-10片都是30块(普通价格,绿油的)。所以直接一次打印10片就好了。

工程打样

由于我第一次画板子所以直接翻车,下面是图:

 image.png

 

 

我主要说我第一次板子的问题:

1.      布线问题

有注意到的是晶振和背面的信号干扰的问题所以这里直接无法驱动,要不是晶振干扰到了信号线或者反之,怎么说吧,画图之前确实考虑的好好的检查完的时候真是觉得这第一次打样就这样(而且还被坑了20块,8cm*5cm居然问我要了50,第二次打样花了30),还有就是Uart串口布线反了(RxTx反了)这不是太大的问题改一下布线就行。

2.      LCD接口:

          本着把所有的原件检查了一遍的原则,还是没有防止自己犯这种错误简直了,把封装的尺寸画错了,管脚间距直接扩大了一倍多,当时拿回来整个心情就不好了,但是为了检验线路正确还是焊上去了原件。

3.      晶振布局问题(重要)

          这个地方是很容易犯的,没做过电路,还没人带过很容易犯这种错误,在高速电路中要避免晶振下面过线,而且尽量顶层与底层走线靠近时不要平行,这些都是一般的规则,此次的布线本着的原则是很简单的直接将所有的器件连接到位能工作就万事大吉。

 

 

 

工程相关实验:

鉴于上次粘贴了老长的代码这里就结合代码说说事吧,要不然文章就太长了。

这里只给h文件的声明吧,要看具体源码可以到我博客第一期工程的最后面有github的链接

 

 

LED:驱动

void LEDInit();

void LEDOn();

void LEDOff();

 

 

MicroSD:

//定义储存卡寄存器信息

typedef struct{

         u8 CID[128];

         u8 RCA[16];

         u8 CSD[128];

         u8 SCR[64];

         u8 OCR[32];

         u8 MicroSDType;

         int MicroSDMemorySize;

}__MicroSDInfo;

 

extern __MicroSDInfo  MicroSDInfo;

 

char MicroSDInit(void);

u8 MicroSDReadDisk(u8*buf,u32 sector,u8 cnt);

u8 MicroSDWriteDisk(u8*buf,u32 sector,u8 cnt);

u8 MicroSDGetCID(u8 *cid_data);

u8 MicroSDGetCSD(u8 *csd_data);

u32 MicroSDGetSectorCount(void);

 

 

W25Q128:

extern u16 W25QXX_TYPE;                                       //定义W25QXX芯片型号               

 

#define    W25QXX_CS_SET           GPIO_SetBits(GPIOB,GPIO_Pin_12);             //W25QXX的片选信号

#define    W25QXX_CS_RESET      GPIO_ResetBits(GPIOB,GPIO_Pin_12);                //W25QXX的片选信号                                

 

 

 

 

void W25QXX_Init(void);

u16  W25QXX_ReadID(void);                          //读取FLASH ID

u8     W25QXX_ReadSR(void);                       //读取状态寄存器

void W25QXX_Write_SR(u8 sr);                    //写状态寄存器

void W25QXX_Write_Enable(void);             //写使能

void W25QXX_Write_Disable(void);               //写保护

void W25QXX_Write_NoCheck(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite);

void W25QXX_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead);   //读取flash

void W25QXX_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite);//写入flash

void W25QXX_Erase_Chip(void);            //整片擦除

void W25QXX_Erase_Sector(u32 Dst_Addr);        //扇区擦除

void W25QXX_Wait_Busy(void);                //等待空闲

void W25QXX_PowerDown(void);                 //进入掉电模式

void W25QXX_WAKEUP(void);                                 //唤醒

 

 

VS1053B

#define VS_DQ       PBin(7)   //DREQ

#define VS_RST      PBout(5)   //RST

#define VS_XCS      PBout(6)          //XCS

#define VS_XDCS     PBout(8)          //XDCS

//////////////////////////////////////////////////////////////

 

__packed typedef struct

{                                                             

         u8 mvol;           //主音量,范围:0~254

         u8 bflimit;                 //低音频率限定,范围:2~15(单位:10Hz)

         u8 bass;            //低音,范围:0~15.0表示关闭.(单位:1dB)

         u8 tflimit;                 //高音频率限定,范围:1~15(单位:Khz)

         u8 treble;                  //高音,范围:0~15(单位:1.5dB)(原本范围是:-8~7,通过函数修改了);

         u8 effect;                 //空间效果设置.0,关闭;1,最小;2,中等;3,最大.

         u8 speakersw; //板载喇叭开关,0,关闭;1,打开

         u8 saveflag;   //保存标志,0X0A,保存过了;其他,还从未保存    

}_vs10xx_obj;

 

 

extern _vs10xx_obj vsset;               //VS10XX设置

u16  VS_RD_Reg(u8 address);                                //读寄存器

u16  VS_WRAM_Read(u16 addr);                     //RAM

void VS_WRAM_Write(u16 addr,u16 val);     //RAM

void VS_WR_Data(u8 data);                            //写数据

void VS_WR_Cmd(u8 address,u16 data);      //写命令

u8   VS_HD_Reset(void);                                    //硬复位

void VS_Soft_Reset(void);                  //软复位

u16 VS_Ram_Test(void);                            //RAM测试       

void VS_Sine_Test(void);                    //正弦测试

                                                                                                                   

u8    VS_SPI_ReadWriteByte(u8 data);

void VS_SPI_SpeedLow(void);

void VS_SPI_SpeedHigh(void);

void VS_Init(void);                                              //初始化VS10XX     

void VS_Set_Speed(u8 t);                                  //设置播放速度

u16  VS_Get_HeadInfo(void);                 //得到比特率

u32 VS_Get_ByteRate(void);                           //得到字节速率

u16 VS_Get_EndFillByte(void);                        //得到填充字节

u8    VS_Send_MusicData(u8* buf);             //VS10XX发送32字节

void VS_Restart_Play(void);                             //重新开始下一首歌播放     

void VS_Reset_DecodeTime(void);                         //重设解码时间

u16  VS_Get_DecodeTime(void);              //得到解码时间

 

void VS_Load_Patch(u16 *patch,u16 len);   //加载用户patch

u8    VS_Get_Spec(u16 *p);                   //得到分析数据       

void VS_Set_Bands(u16 *buf,u8 bands);       //设置中心频率

void VS_Set_Vol(u8 volx);                                 //设置主音量  

void VS_Set_Bass(u8 bfreq,u8 bass,u8 tfreq,u8 treble);//设置高低音

void VS_Set_Effect(u8 eft);                              //设置音效

void VS_SPK_Set(u8 sw);                                           //板载喇叭输出开关控制

void VS_Set_All(void);

 

void vs10xx_read_para(_vs10xx_obj * vs10xxdev);

void vs10xx_save_para(_vs10xx_obj * vs10xxdev);

由于LCD没有就位,VS1053B无法工作这里只验证了MicroSD卡和W25Q128



 

总结:里没有了原先的工程记录了,所以没有主函数代码了,不过这里要解释的是这写硬件其实做过了还是挺简单的,但是在写代码以及做图的时候一定要细心,特别是画图真的是特别烦人。我是从原理图封装图一点点画的(除了stm32f103 这个官方有提供,还有VS053B

所以得一直检查,防止出错,另外在借鉴别人的电路时还得回把不必要的部分去掉这些技能是我们构建设计的时候需要get到的。

tips:貌似这里也没有写完不过有时间再补吧。


文章评论

Top