发帖数

43

原创数

43

关注者

16

阅读数

9333

点赞数

2

张角

  • RISC-V鸿蒙系统开发板SPI通信模块调试2(项目连载5)


    上篇文章中,我们提到了使用读取SPI Flash ID这个程序段,来测试SPI的通信是不是成功。

    目前程序运行的结果,是无法正确读取Flash 芯片的ID的。那问题出现在哪里呢?如何去分析这个问题,或者说去尝试解决这个问题呢?

    在进行波形分析之前,我们首先要做的就是查看一下芯片有没有虚焊,还有选用的SPI Flash芯片是不是我们需要的。

    经过仔细比对,确认我们购买的W25Q128芯片,就是睿思芯科公司提供的例程所使用的芯片。那么在芯片的选型上应该没有问题。

    那芯片有没有虚焊呢?这里总共涉及到3块芯片,一个是我们的单片机,一个1.8V3.3V的电平转换芯片,另外一个就是SPI Flash芯片。因为单片机引脚之间距离只有0.2mm,芯片重新焊接的难度太大。所以,我这边就重新把电平转换芯片和SPI Flash芯片吹下来,重新焊接了一次。确保电路的焊接是没有问题的。

    芯片焊接的重新焊接的过程中,发生了一件非常可怕的事情,电平转化芯片TXB0104的焊盘被整体损坏掉了。如果不是有同事帮忙调试焊接,这块板子有可能就废掉了。

    如果是个别焊盘损坏掉,还可以飞线进行操作,现在整排焊盘都掉了,该怎么办呢?

    实际调试的过程中,对焊盘的修复,我们使用的办法是把损坏掉的焊盘附近的铜线上过油刮掉,使用裸露的铜线作为新“焊盘”进行焊接。然后,再使用非常细小的铜丝把芯片的引脚和板子上的铜线连接起来。如下所示,这个操作过程比较麻烦,需要有娴熟的焊接功底才行。

    图片9.jpg

    但是现在有一个重要的事情需要总结,为什么焊接的过程中,自己会把这个电平转换芯片的焊盘一整排全部搞掉?自己确实没有在给焊盘加锡的过程中,使用烙铁头去剐蹭焊接。最后的总结是,在给焊盘加锡的过程中,烙铁头的温度过高,同时由于烙铁头使用的时间太长了之后,氧化严重。上面两个因素导致了烙铁头上的锡非常粘稠,同时温度非常高。那么在加锡的过程中,很容易就会把焊盘带掉。而且因为是加锡的过程,会同时对很多焊盘进行操作,所以一掉就是一整排!!!

    这块开发板,在实际焊接芯片引脚的过程中,我们设定的烙铁温度,高达450度,如下图所示。

    图片10.jpg

    我们为什么会使用到这么高温度的呢?主要是我们这个板子是四层板,TOP层和BOTTOM层之间的两层,进行了大量的敷铜。导致散热非常快。把烙铁头的温度调高,可以增加焊锡的流动性。如果按照平时300-350度左右的温度来焊板子,我们所熟悉的拖锡动作是没有办法实现的,锡一下子就凉掉了。

    但是如果有芯片压在焊盘上,使用这么高的温度进行拖锡,并不会造成焊盘的脱落!

    在这块,我们调试的经验就是,给电路板的焊盘进行加锡的过程中,一定不能把温度调节得太高,否则会造成一排焊盘脱落的人间悲剧!这种情况下,大概率,这块板子就废掉了。

    上面也提到了,电平转换芯片TXB0104SPI Flash重新焊接之后,SPI通信依然没有成功。那说明大概率并不是芯片虚焊的问题。那个单片机的引脚,我们目前只能假设它的焊接是完全成功的(太难焊了,拆下重焊成本太高)。那么接下来,只能是先对波形详细分析了。

    首先,我们需要做的就是去查看CLK这个引脚的波形,看看CLK的波形输出是不是合理的。SPI,需要在一定的频率范围内才能正常工作。如果频率太高的话,MOSIMISO这两个接口的波形,可能还没有达到芯片规定的“高”或者“低”,时钟沿就进行了下一次的跳变,这种情况下,很显然单片机和SPI Flash之间是无法进行通信的。

    先给大家看一下,我这边第一次抓到的CLK引脚的波形。

    图片11.jpg

    大家看到这个波形的时候,是不是觉得有点奇怪。在这个波形中,猛一看CLK的频率信号只有60Hz左右。而实际上,我们的CLK的频率至少要是几Mhz呀。那这个频率是怎么回事呢?

    后来分析得到结论,上面图中的高脉冲应该是程序的延时之间的间隔,也就是两个测试程序之间的时间间隔,或者是两次发送数据之间的间隔。真正的CLK波形,需要使用单片机的触发功能,去捕获相应的波形。所谓的触发功能,就是可以设定一个比较值,如果输出信号的波形大于了这个值,示波器就会显示出来这个信号的波形。这里有一个信号比较的过程存在。

    通过示波器,捕获出来真正的CLK信号之后,它的波形是如下形状的。

    图片12.jpg

    大家看一下,这个波形的频率高达12Mhz。这个12Mhz是怎么来的呢,我们前面提到了这个单片机的时钟晶振是24Mhz,那么这个SPI的通信速率12Mhz应该是时钟信号24Mhz二分频之后得到的。现在,我们就有一个怀疑,SPI通信的失败是不是由于这么高频的通信速率导致的呢?

    还有一个问题,大家有没有发现这个CLK的波形,它的最小值并没有到参考地。同时它的最大幅值,我们使用示波器测量之后,只有2.2V。可是SPI这边的工作电压是3.3V呀,而且我们的电平转换芯片输出的电压也是3.3V。那是不是这个CLK信号,本身就是有问题呀?或者说在这个电压幅值区间,Flash芯片能不能识别CLK信号呢?

    我们这片文章,就先分析到这里。下一篇,我们继续SPI通信的调试。


    收藏 0 回复 0 浏览 143
  • 基于RISC-V单片机的鸿蒙开发板项目简介(项目连载1)

    大家好,我是张飞实战电子的张角老师。我目前正在做的一个项目是开发一块基于RISC-V架构单片机的鸿蒙系统开发板。

     

    鸿蒙系统是华为公司开发的新一代物联网操作系统系统,RISC-V单片机是不同于ARM架构的单片机,目前形势一片大好。在美国对我国芯片以及操作系统等高新科技的疯狂打压的背景下,鸿蒙系统以及RISC-V架构单片机这两种产品的发展以及突破显得尤其重要。它们两个很大概率上会是电子信息领域我们突破美国技术封锁的两个突破口。

     

    张飞实战电子,愿意在力所能及的情况下,为这两块产品的推广添砖加瓦,贡献自己的力量。为此,我们愿意把这块基于RISC-V架构单片机的鸿蒙系统开发板的实现过程,尽可能清楚的展现给大家,争取越详细越好,为大家以后进行相关的产品开发提供一些经验参考。

     

    这块开发板使用的单片机是深圳睿思芯科的Pygmy-E系列的单片机,这是一款32位的面向IOT领域的单片机,具备超低功耗的特性以及丰富的外设接口。

     

    开发板的硬件电路模块包括电源电路,电平转换电路,单片机最小电路,USBSPI电路,USBUART电路,温湿度检测电路,片外SPI Flash电路,红外模块检测电路,开关检测电路,蜂鸣器电路,流水灯电路。

     

    电源电路包括12V电源接口电路,12V5V Buck电路,5V3V3 Buck电路,3V3 1V8 LDO电路,3V30V9 buck电路,3V30V 8 buck电路。BUCK电源和LDO电源是我们做开发板的过程中非常常用的电源,在这个模块,我将和大家分享下BUCK以及LDO电路的设计方法。

     

    电平转换电路主要是利用双向电平转换芯片TXS0104以及TXB0104等实现电平的双向转换。为什么我们需要电平转换芯片呢,主要是因为我们使用的这块单片机是还处于验证阶段,单片机IO的电平是1V8,而我们常用器件的电平以3V3的居多,比如我们用的FT4222 USBSPI芯片,SHT20温湿度检测传感器等。

     

    单片机最最小外围电路包括供电模块,晶振模块,复位电路模块,BOOT启动模块等。

     

    其他模块电路我们就不一一介绍了,等以后我们再展开分析。

    软件这块,我们打算依据硬件电路开发一些demo。这些demo主要分为三个板块,一个是睿思芯科RISCV单片机的外围驱动开发模块,主要包括GPIOUARTI2CSPI等接口的驱动开发;一个是鸿蒙系统Liteos-M模块的内核实验;再一个就是,利用外围电路我们我们要演示的一些demo,比如流水灯,蜂鸣器唱歌,红外信号检测,温湿度检测,外置SPI Flash读取等。

     

    软件的开发和编译是在Ubuntu 中进行的,会使用到一些简单的Linux命令。这里我们会尽可能详细的介绍清楚编译环境的搭建,以及调试过程。

     

    整个项目涉及到的硬件、软件等相关的东西比较庞杂,我们争取尽可能清晰完整地展现所有的细节。因此估计更新的时间会比较长,期待大家能够和我一起坚持到最后。久久为功,方能修成正果。一起加油!

     


    收藏 0 回复 0 浏览 136
  • 斜坡补偿的由来

    在开关电源中,有一个相对不容易解释清楚,但是对整个系统的稳定性又起到重要作用的知识点-斜坡补偿。我们打算后面用一系列文章来深入探讨一下这方面的知识,争取让大家能够对这块内容有相对深入的理解。


    我们首先需要回答的问题,就是开关电源系统为什么需要斜坡补偿,或者说斜坡补偿解决了哪方面的问题?从宏观上看,开关电源的调节系统可以分为两部分,一个是内环电流环,一个是外环电压环。之所以把电流环称之为内环,主要是因为它的调节速度更快,属于单周期调节。电压环,调节速度相对电流环肯定是更慢的,对于输出滤波电容来说,电压是电流的积分。电流环调节的结果要经过数十个周期之后,才能在电压信号上做出反应。


    当系统的输出电流或者说电感电流,因为负载变化或者输入电压变化产生扰动的时候,在电压环起到调节作用之前,有可能发生电感电流的次谐波震荡,或者说是电感电流的振铃现象。


    这里之所以说是有可能,主要是因为这个现象发生在CCM模式下,而且占空比大于50%的时候。当占空比小于50%的时候,扰动电流的震荡会自动趋于收敛。我们下面用图形化的方式给大家演示一下。

    image.png

    上图是占空比小于50%的时候,负载变化引起的电流扰动。大家可以看一下,这个扰动在几个周期后,会自动收敛。具体为什么会收敛呢?我们可以推算一下电流扰动量的变化公式。

    image.png


    大家可以看一下,当占空比小于50%的时候,Ton的时间内电流上升的斜率大于Toff时间内电流下降的斜率。那么这个电流抖动量的变化趋势和这两个斜率的比值很有关系。


    具体的推导公式,如上图所示。我们这里是分两个三角形来进行计算的。在θ0的三角形内,根据正切关系可以得到δIo和It(两个三角形的公共部分)比例关系式①。实际上这个正切关系本质上是不是就是斜率呀。同样的,在θ1这个三角形内,我们也可以得到式子②。这两个式子化简以后,就会得到关系式③。大家可以看一下,δI1是不是要比δIo要小呀,因为m2小于m1,对吧。当占空比小于50%的时候,是不是m2一定小于m1呀。那么经过几个周期的迭代,是不是扰动量慢慢变小后,系统也就收敛了。


    但是当占空比大于50%的时候,也就是m2大于m1的时候,这个扰动量是不是也来越大,结果也就会出现电感电流的震荡,如下图所示。

    image.png

    对于控制系统的开关芯片而言,Ton的时间也就会出现波动,也就是会出现所谓的大小波交替现象的发生。这个波动的电流对系统的稳定性是无益的,需要想办法解决掉。那么该怎么解决呢?这个也就是斜坡补偿的由来:既然这种情况下m2大于m1,我们能不能通过斜坡补偿的方式使得整体的斜率大小关系发生改变呢?


    下篇文章,将会对这个问题进行更深入的分析。


    收藏 0 回复 0 浏览 126
  • RISC-V开发板SPI通信模块调试1(项目连载4)

    我们这块开发板使用的是W25Q128FVSG这个Flash进行外部存储的,这个Flash和单片机之间的通信方式是SPI通信。Flash模块焊接完成之后,一直通信不成功,我们在这个地方的调试花费了非常长的时间。有不少经验值得总结分享。

    还是先上实物图和原理图,给大家一个感性的认识。

    图片1.jpg

    1  W25Q128FVSG连接电路

    上图是SPI Flash实物接口电路,红框中的就是W25Q128FVSG芯片。黄框里面的是1.8V3.3V双向电平转换芯片。为什么需要这个电平转换芯片呢,主要是因为我们单片机的IO接口输入输出是1.8V的电平,然而这个存储Flash的工作电压是3.3V。这个1.8V的芯片IO输出电压,在实际使用的单片机中是比较少见的,我们这款单片机某种程度上应该算是一种原型机,1.8V的电压是芯片内部的电压。

    图片2.jpg


    2 SPI接口电路原理图

    关于SPI接口电路图的原理部分,我们在这里就先不做详细介绍了,整体也比较简单,具体的接线方式,我们可以查看一下datasheet引脚的对接口的描述方式。然后按照datasheet的接线要求来接就可以了。

    比如datasheet中,对WP引脚的描述,是这样的。

    图片3.jpg


    它说这个WPWrite Protect)是低有效的,也就是说这个引脚被拉低的时候,Flash存储芯片是没有办法写入数据的。我们自己的程序是需要往存储芯片写数据,那么这个引脚肯定是要被拉高的。

    再比如这个Hold引脚,datasheet中的描述如下,显然这个也是低有效,也就是说Hold引脚被拉低的时候,DO这个引脚是高阻抗状态,也就是说无法进行数据传输了。我们自己的程序肯定是需要数据传输的,所以这个引脚是要被拉高的。

    图片4.jpg

    上面两个部分的举例,主要是为了说明我们画原理图的时候,如何根据datasheet引脚进行端口确认。不少时候,我们可以直接拿到别人的原理图,进行参考。不过我个人的看法还是自己详细读一下datasheet,再进行一下确认,一是防止被别人带进坑里去,另外一个也能够让自己在调试的时候更有信心。

    我们的Flash读取程序是基于一个Linux内核SPI NOR框架,比如在linux5.2.0内核中,关于这个框架的说明在 “Documentation/mtd/spi-nor.txt”这个文档中。大家先对这个框架有所理解就行,等系列文章分享完成后,我这边会把所有的代码给大家共享。

    图片5.jpg


    在对FLASH存储模块存入、读取、擦除数据的操作实施之前,我们第一步是不是要先验证这个芯片是不是我们需要的芯片呀。那怎么验证呢?在程序中使用的办法,就是读取这个FlashID,看看芯片反馈回来的IDdatasheet说明的是不是一致。

    图片6.jpg

    在程序中,就是通过这一段代码来实现的。但是实际收取到的信息却是如下的,那说明读取不成功。

    图片7.jpg

    正确读取的时候,JEDEC id的结果应该是这样的。

    图片8.jpg

    那该怎么解决这个问题呢,SPI调试系列的第二篇文章,我会给大家详细的剖析一下调试过程。


    收藏 0 回复 0 浏览 125
  • RISC-V鸿蒙系统开发板源模块原理简介(项目连载6)

    电源是开发板能量的来源,一个稳定可靠的电源系统是开发板能够正常工作的先决条件。我们这个开发板电源系统相对来说比较复杂,主要是因为这个开发板上出现的电压种类比较多,而且个别器件对电压的精确度有非常高的要求。

    关于各个模块对电压的要求,我这边做一个简要的说明。

    首先开发板电源的输入是12VDC输入;第二,像红外、FT4222HQ、数码管等器件,需要5V的工作电压;第三,W25Q128FVSG存储、温湿度传感器等器件,需要的工作电压是3V3;第四,单片机IO输出的电平是1.8V;第五,这个芯片引脚内部有不少接口的工作电压是0V8;第六,对于芯片的锁相环,需要输入的电压是0V9。从0V80V9这两个电压幅值就可以看出来,这个板子对电源电压幅值的精确度是比较高的。

    下图是我们开发板上的电源模块,可以直观地看出这个开发板的电源模块还是相对复杂的。

    image.png

    下面我分别介绍一下各个电源模块的设计要点。

    首先是12V的电源输入模块。

    image.png

     

    这个模块电路的设计要点,是D1这个二极管。这个二极管主要的作用其实是防止电源反接。当然这个二极管上的压降是越小越好。这个蓝色的LED主要是提供了人机交互的功能,当它发光的时候,可以提醒你已经上电了,你下面所有的操作都是带电操作。

     image.png

     

    上图是一个12V5Vbuck电路,输出是5V的直流电源。这个buck电路使用的是SY8113这款芯片实现的,关于这个片子详细的信息大家可以下载下来看一看。这个电路设计的要点,一个是电感的选择,一个是布局。电感的选择尽量是让电感工作在连续模式,电路布局的时候高频大电流的回路尽可能短,越短越好。这样干扰会越来越小,输出的电源也会更加平稳。这里高频电路有两个,一个是从电感到电容,然后再回到芯片内部地的大电流回路,绿色的那条;另外一个是那条红色的回路,输出电压的反馈回路,这条是信号回路。在电路布局的时候,两个电路按理说都是高频的,都应该最短。但是他们毕竟有冲突,芯片周边的空间就只有那么大,这个时候,我们只能优先考虑大电流的。

     image.png

    上图是5V3V3buck电路,主要的关注点和上面提到的差不多。只是这里我们把Buck芯片换成了SY8077。另外一个需要注意的是,电压反馈电阻的选择。SY8077 FB引脚上的电压0.6V,如何选择R29R30是要注意的,在满足电压配比的前提下,尽量选择常用的电阻。还有一个要注意的是,这里的电阻要选择1%精度的。

     image.png

    3V31V8的电源,我们使用的是一个线性电源,使用的芯片是RT9065GE。这个地方不涉及到高频信号,布局上相对来说也相对简单,这里就不多说了。为什么这个地方,会使用线性电源,而不是BUCK电源呢,主要还是3V31V8的之间的压差比较小,相对来说功率损耗比较低。

    image.png 

    上面两个电路是3V3产生0V80V9的电路,两个电路本质上没有太大区别,分压电路的选择上不太一样。其实这里不使用Buck电路也是可以的,毕竟单片机的功耗不是太大。相对难点还是分压电阻的选择这块,如何能够使用常用的电阻进行准确的电压配比。

    关于开发板电源的简介,我们就先到这里。


    收藏 0 回复 0 浏览 124
×
张角