个人成就
- 发布了43篇内容
- 获得了2次赞同
- 获得了5次收藏
个人简介
擅长领域
暂时没有设置哦~
-
RISC-V 开发板 Buck电源调试记录(项目连载3)
基于RISCV单片机的鸿蒙开发板
Buck电源部分调试记录
1. 起因
这个开发板前期demo板的焊接,我这边焊接了两块电路板,主要是方便对比调试。前期的焊接都还比较顺利。各个模块(包括电源,LED灯,温湿度检测以及单片机最小系统等)测试都可以正常工作。
等到两个开发板都焊接到红外模块的时候,两个板子同时出现了问题,程序再也烧录不进去了。没有开发板可以进行程序调试,问题就严重了。
图1: 红色部分为红外探头
出现这个事情的原因,很有可能是因为红外这个模块是射频模块,功率比较大或者有射频干扰,导致电路板上其他模块的工作出现异常。
只所以能够得到这个结论,是基于以下两个判断:①两个板子同时出现焊接问题的可能性很小,②红外模块本身原理图出现问题很小,我司其他类型的开发板已经验证过这个电路模块的可行性。
关于对红外模块的干扰处理,我们后面会有专文进行剖析,本文只做简要介绍。
出现这个问题之后,我们首先想到的就应该是把红外模块的外围电路去除,看看程序的烧录工作还能不能正常进行。
图2 红框中的电路即为红外模块的外围电路
可是拆除这些模块之后,烧录工作并不能正常进行了,两块手动焊接的开发都是这么一个情况。开发板中肯定有其他模块因为红外模块的焊接出现了损坏,那么到底是哪个模块出现了问题呢?整个开发板,那么多元器件,怎么才能够快速的锁定问题,是一件棘手的事情。
1. 解决问题的思路及注意事项
现在的情况是不知道哪个模块出现问题了,只能是进行地毯式的搜查。排查问题的顺序,最好是先从电源部分入手,依次往后看。先看看各个芯片工作的电压是不是正常。如果电压正常,那么就有可能是芯片本身已经被损坏了,就需要把芯片更换掉,再进行测试。如果电压不正常,那么就是电源坏掉了。
不断重复这个过程(以芯片的工作电压为抓手),最终锁定出问题的地方。
在这个过程中,芯片会被拆掉,重新焊接,对调试人员焊接元器件的能力是有比较高的要求的。这个要求主要有以下几点:①焊接过程本身对焊盘是用损伤的,多次的焊接很容易把焊盘搞掉。一旦焊盘被搞掉了,可能整个板子就会被废掉,前期所有的工作都白费了。所以烙铁头一定不能剐蹭焊盘。另外同时烙铁头的温度也不能太高,否则粘稠的锡也可能把焊盘带掉。②拆除和焊接芯片的工程中,很容易把芯片的外围器件移动掉,导致外围器件也需要重新焊接,使开发板调试是速度变慢。
2. 解决问题的过程
我们首先测量Buck电源能不能够正常工作,结果发现3V3的buck输出电压是3.5V。输出电压和实际的设计值之间差别巨大。
我们使用的Buck芯片是SY8077,这一款工作频率高达1.5Mhz的Buck芯片,电路工作时典型的拓扑结构如下图:
图3 SY8077芯片工作原理图
电路正常工作是FB引脚的反馈电压是0.6V,如下图所示。
图4 SY8077 FB接口引脚电压
但是实际测量时候,FB引脚的电压是0.65V。这就很奇怪了,是Buck芯片出问题了,还是Buck电路的外围芯片出问题了?
我们可以做出如下假设:
①芯片本身被损坏了,导致输出电压不正常,并且FB引脚电压也不正常。
②反馈电阻坏掉了,导致FB引脚的电压输出不正常。
但是更换一个新的SY8077 Buck芯片之后,输出依然是3.5V。同时替换下了新的反馈电阻,FB引脚的电压依然是0.65V,Buck电路依然没有能够正常工作。难道SY8077更换上去后,只要上电立即就坏掉了?至少到目前是有这个可能的。
那这是哪里出问题了呢?问题一下子又复杂化了。
这个Buck电路的输出电压不正常,那输出电流是什么样子呢?我们可以查看一下输出电流的波形,进一步确定buck电路的工作状态。
图3 Buck电路电流测试电路
图4 电流探头
我们把这个电感竖起来,用一根白色的线延长电感的线路。这样把电流探头套到这根线上,就可以查看流过电感的电流波形,从而确定这个电感是工作在什么状态,是断续模式、临界连续模式还是连续模式状态?
可是把电流探头套到这根线上之后,实测电流波形如下:
图5 输出电流及电压波形
图中蓝色部分的波形是输出电流的波形,可以看到电流在上电之后,出现了一个波动,然后电流就归于0了。也就是说,5V转3.3V的这个buck电路并没有电流输出。
Buck电流的输出电压不正常,而且输出电流为0;同时SY8077这个芯片以及外围电路已经更换过,应该也是没有问题。那么影响这个buck电路不能正常工作的因素只能是负载了,3V3这个输出电压的负载如果有短路的话,是不是会导致SY8077出现这样的情况呢?如果是负载的原因,那是哪个负载呢?
确实一下很难猜出是哪个负载导致的,这个时候有两个办法一个是一个个拆解,看看拆掉哪个负载后,buck电路可以正常工作了;另外一个办法是,先把所有的负载拆掉,然后一个一个往电路上添加,如果添加到某一个负载时,buck电路不能工作了,那说明就是这个负载出了问题。
我们上面还留有了一个疑问,是不是新换的buck芯片SY8077上电之后就坏掉了?我们需要首先验证一下buck电路是不是可以正常工作。要验证这个buck电路是不是可以正常工作,只有先把所有的负载先拆除掉,只留一个阻性负载或者选择电子负载用作测试。
结合上面的因素,我们选择先把所有3V3的负载先全部拆掉。拆掉之后,重新查看电感的电流波形,发现电流是有输出的。而且随着电子负载的加重,电感的工作模式实现了从断续模式到连续模式的转变。这个测试结果说明SY8077这个芯片并没有损坏,同时SY8077这个芯片在自我保护的时候,其输出电流是0,FB脚的电压是0.65V。具体为什么会是这么一个机制,SY8077的datasheet并没有说清楚。
后面就是不断把3.3V的负载(各个芯片,比如温湿度传感器SH20、电平转换芯片、电平逻辑芯片等等,只要供电电压是3.3V的,都算是3V3电源电压的负载)往电路板上添加。添加的过程一定要注意,最好是使用风枪吹,这样对周边焊接元器件的影响是最小的,可以加快调试板子的速度。
等到添加FT4222HQ这个SPI转Flash的时候,发现Buck电路电流又变成0了,也就是说Buck电路不能正常工作了。经过漫长的分析与调试,终于找到被损坏的芯片了!!!
更换上新的FT4222HQ之后,Buck电源的输出就正常了,自然程序的烧录也就正常了。
-
RISC-V开发板SPI通信模块调试1(项目连载4)
我们这块开发板使用的是W25Q128FVSG这个Flash进行外部存储的,这个Flash和单片机之间的通信方式是SPI通信。Flash模块焊接完成之后,一直通信不成功,我们在这个地方的调试花费了非常长的时间。有不少经验值得总结分享。
还是先上实物图和原理图,给大家一个感性的认识。
图1 W25Q128FVSG连接电路
上图是SPI Flash实物接口电路,红框中的就是W25Q128FVSG芯片。黄框里面的是1.8V转3.3V双向电平转换芯片。为什么需要这个电平转换芯片呢,主要是因为我们单片机的IO接口输入输出是1.8V的电平,然而这个存储Flash的工作电压是3.3V。这个1.8V的芯片IO输出电压,在实际使用的单片机中是比较少见的,我们这款单片机某种程度上应该算是一种原型机,1.8V的电压是芯片内部的电压。
图2 SPI接口电路原理图
关于SPI接口电路图的原理部分,我们在这里就先不做详细介绍了,整体也比较简单,具体的接线方式,我们可以查看一下datasheet引脚的对接口的描述方式。然后按照datasheet的接线要求来接就可以了。
比如datasheet中,对WP引脚的描述,是这样的。
它说这个WP(Write Protect)是低有效的,也就是说这个引脚被拉低的时候,Flash存储芯片是没有办法写入数据的。我们自己的程序是需要往存储芯片写数据,那么这个引脚肯定是要被拉高的。
再比如这个Hold引脚,datasheet中的描述如下,显然这个也是低有效,也就是说Hold引脚被拉低的时候,DO这个引脚是高阻抗状态,也就是说无法进行数据传输了。我们自己的程序肯定是需要数据传输的,所以这个引脚是要被拉高的。
上面两个部分的举例,主要是为了说明我们画原理图的时候,如何根据datasheet引脚进行端口确认。不少时候,我们可以直接拿到别人的原理图,进行参考。不过我个人的看法还是自己详细读一下datasheet,再进行一下确认,一是防止被别人带进坑里去,另外一个也能够让自己在调试的时候更有信心。
我们的Flash读取程序是基于一个Linux内核SPI NOR框架,比如在linux5.2.0内核中,关于这个框架的说明在 “Documentation/mtd/spi-nor.txt”这个文档中。大家先对这个框架有所理解就行,等系列文章分享完成后,我这边会把所有的代码给大家共享。
在对FLASH存储模块存入、读取、擦除数据的操作实施之前,我们第一步是不是要先验证这个芯片是不是我们需要的芯片呀。那怎么验证呢?在程序中使用的办法,就是读取这个Flash的ID,看看芯片反馈回来的ID和datasheet说明的是不是一致。
在程序中,就是通过这一段代码来实现的。但是实际收取到的信息却是如下的,那说明读取不成功。
正确读取的时候,JEDEC id的结果应该是这样的。
那该怎么解决这个问题呢,SPI调试系列的第二篇文章,我会给大家详细的剖析一下调试过程。
-
RISC-V鸿蒙系统开发板SPI通信模块调试2(项目连载5)
上篇文章中,我们提到了使用读取SPI Flash ID这个程序段,来测试SPI的通信是不是成功。
目前程序运行的结果,是无法正确读取Flash 芯片的ID的。那问题出现在哪里呢?如何去分析这个问题,或者说去尝试解决这个问题呢?
在进行波形分析之前,我们首先要做的就是查看一下芯片有没有虚焊,还有选用的SPI Flash芯片是不是我们需要的。
经过仔细比对,确认我们购买的W25Q128芯片,就是睿思芯科公司提供的例程所使用的芯片。那么在芯片的选型上应该没有问题。
那芯片有没有虚焊呢?这里总共涉及到3块芯片,一个是我们的单片机,一个1.8V转3.3V的电平转换芯片,另外一个就是SPI Flash芯片。因为单片机引脚之间距离只有0.2mm,芯片重新焊接的难度太大。所以,我这边就重新把电平转换芯片和SPI Flash芯片吹下来,重新焊接了一次。确保电路的焊接是没有问题的。
芯片焊接的重新焊接的过程中,发生了一件非常可怕的事情,电平转化芯片TXB0104的焊盘被整体损坏掉了。如果不是有同事帮忙调试焊接,这块板子有可能就废掉了。
如果是个别焊盘损坏掉,还可以飞线进行操作,现在整排焊盘都掉了,该怎么办呢?
实际调试的过程中,对焊盘的修复,我们使用的办法是把损坏掉的焊盘附近的铜线上过油刮掉,使用裸露的铜线作为新“焊盘”进行焊接。然后,再使用非常细小的铜丝把芯片的引脚和板子上的铜线连接起来。如下所示,这个操作过程比较麻烦,需要有娴熟的焊接功底才行。
但是现在有一个重要的事情需要总结,为什么焊接的过程中,自己会把这个电平转换芯片的焊盘一整排全部搞掉?自己确实没有在给焊盘加锡的过程中,使用烙铁头去剐蹭焊接。最后的总结是,在给焊盘加锡的过程中,烙铁头的温度过高,同时由于烙铁头使用的时间太长了之后,氧化严重。上面两个因素导致了烙铁头上的锡非常粘稠,同时温度非常高。那么在加锡的过程中,很容易就会把焊盘带掉。而且因为是加锡的过程,会同时对很多焊盘进行操作,所以一掉就是一整排!!!
这块开发板,在实际焊接芯片引脚的过程中,我们设定的烙铁温度,高达450度,如下图所示。
我们为什么会使用到这么高温度的呢?主要是我们这个板子是四层板,TOP层和BOTTOM层之间的两层,进行了大量的敷铜。导致散热非常快。把烙铁头的温度调高,可以增加焊锡的流动性。如果按照平时300-350度左右的温度来焊板子,我们所熟悉的拖锡动作是没有办法实现的,锡一下子就凉掉了。
但是如果有芯片压在焊盘上,使用这么高的温度进行拖锡,并不会造成焊盘的脱落!
在这块,我们调试的经验就是,给电路板的焊盘进行加锡的过程中,一定不能把温度调节得太高,否则会造成一排焊盘脱落的人间悲剧!这种情况下,大概率,这块板子就废掉了。
上面也提到了,电平转换芯片TXB0104和SPI Flash重新焊接之后,SPI通信依然没有成功。那说明大概率并不是芯片虚焊的问题。那个单片机的引脚,我们目前只能假设它的焊接是完全成功的(太难焊了,拆下重焊成本太高)。那么接下来,只能是先对波形详细分析了。
首先,我们需要做的就是去查看CLK这个引脚的波形,看看CLK的波形输出是不是合理的。SPI,需要在一定的频率范围内才能正常工作。如果频率太高的话,MOSI和MISO这两个接口的波形,可能还没有达到芯片规定的“高”或者“低”,时钟沿就进行了下一次的跳变,这种情况下,很显然单片机和SPI Flash之间是无法进行通信的。
先给大家看一下,我这边第一次抓到的CLK引脚的波形。
大家看到这个波形的时候,是不是觉得有点奇怪。在这个波形中,猛一看CLK的频率信号只有60Hz左右。而实际上,我们的CLK的频率至少要是几Mhz呀。那这个频率是怎么回事呢?
后来分析得到结论,上面图中的高脉冲应该是程序的延时之间的间隔,也就是两个测试程序之间的时间间隔,或者是两次发送数据之间的间隔。真正的CLK波形,需要使用单片机的触发功能,去捕获相应的波形。所谓的触发功能,就是可以设定一个比较值,如果输出信号的波形大于了这个值,示波器就会显示出来这个信号的波形。这里有一个信号比较的过程存在。
通过示波器,捕获出来真正的CLK信号之后,它的波形是如下形状的。
大家看一下,这个波形的频率高达12Mhz。这个12Mhz是怎么来的呢,我们前面提到了这个单片机的时钟晶振是24Mhz,那么这个SPI的通信速率12Mhz应该是时钟信号24Mhz二分频之后得到的。现在,我们就有一个怀疑,SPI通信的失败是不是由于这么高频的通信速率导致的呢?
还有一个问题,大家有没有发现这个CLK的波形,它的最小值并没有到参考地。同时它的最大幅值,我们使用示波器测量之后,只有2.2V。可是SPI这边的工作电压是3.3V呀,而且我们的电平转换芯片输出的电压也是3.3V。那是不是这个CLK信号,本身就是有问题呀?或者说在这个电压幅值区间,Flash芯片能不能识别CLK信号呢?
我们这片文章,就先分析到这里。下一篇,我们继续SPI通信的调试。
-
RISC-V鸿蒙系统开发板SPI通信模块调试3(项目连载6)
大家好,我们继续SPI通信接口部分的调试分析。
上篇文章我们提到CLK的波形幅值最高处只有2.2V,远远没有达到3.3V这一芯片工作电压。同时CLK波形的底部也不是0V。我们因此怀疑RISC-V单片机发出的CLK波形,存储芯片有可能分辨不出来。应该说这个怀疑是合理的。如果大家想从最基础的原理上去辨别出来这个波形的正确性,需要仔细去研读单片机和Flash存储芯片的datasheet。因为我们这块板子是参考睿思芯科一块老的开发板来进行设计的,在他们原有的开发板上这个Flash存储芯片是可以正常读取的。那么我们可以先测试一下原有板子这个引脚处的CLK波形是什么样子的,对比一下就知道,CLK的这个波形是不是正确的。
下图是我们实际测试到的他们原有开发板上CLK引脚处的波形,大家可以看一下这个波形。这个波形的幅值和频率和我们现有开发板上的波形是一致的,那换句话说我们这个我们板子上的CLK信号也是可以让存储芯片正常工作的。
既然CLK波形是没有问题,那为什么还收不到数据呢?那我们看一下MOSI和MISO的波形,看一看到底是哪里出问题了。如果单片机这一侧能够发送控制信号到W25Q128这一侧,按理说应该是MOSI这条回路是没有问题的。如果MISO这条回路,在单片机侧能够收到波形,那说明MISO这条信号传输回路没有问题;某种意义上它还可以说明,存储芯片W25Q128FVSG收到单片机指令之后,进行了响应。
大家看一下这个波形,这个是MOSI回路在W25Q128这一侧测到的波形。这个至少可以说明了刚才我们提到的结论:单片机成功给W23Q128发送了信号。
大家看一下这个波形,这个是MISO回路在芯片这一侧的波形。如果使用示波器的捕获功能,同时使用两个通道来捕获波形,一个是MISO,一个是CLK,那么截取的波形就是下面这个样子。
同样地,这个图片也说明了一个结论,那就是W25Q128确实收到了单片机发出的指令,并且进行了响应,只是波形不对。那问题出在哪了呢?大家看一下MISO的波形,这个信号也出现了“高”没有“高”上去,有些地方“低”却没有“低”下来的情况。波形看起来比较奇怪,看不出来,这个到底是什么数据。
问题卡在这里了,那到底是哪里出错了呢?
首先引起怀疑的就是时钟信号的频率有点太高了,以至于MISO这根线上相应的器件响应速度根本反应不过来,或者是发生了震荡,所以才导致了这种高不高、低不低的情况发生。
解决这个问题的办法,一般是在发送引脚和接收引脚之间串联一个电阻,用以防止震荡的发生,但是因为我们这个电路已经画好了,已经没有办法再增加电阻。目前能够尝试的办法就是降低信号发送的频率了。降低信号的频率之后,震荡自然也就不会发生了。
调试的方向明确了,我们要从软件上把通信时钟的频率降低下来,这里要做三处更改。因为SPI接口读取Flash的程序是使用Linux kernel里面的框架来写的,改动起来相对来说比较复杂。
主要修改的地方有三处,我们在这里耽误了不少时间,主要的原因是这个kernel框架比较复杂。SPI1_CLK_DIV_DWH是一个宏,我们可以通过更改这个宏的值,来改变系统时钟分频的系数。
不过,比较悲催地是,频率降低以后,MISO的波形依然是不对的,还是这种不高不低的样子。那就奇怪了,这到底是什么原因引起的呢?实在是有点难以理解呀。信号传输的电路都是通的,而且都有波形出来,只是波形不对,难道是存储芯片坏了?不应该呀。实在是不应该出现这样的错误。
那读取W25Q128 ID的波形具体应该是什么样子的呢?根据W25Q128这个芯片的datasheet,读取它的ID时,MISO返回的数据应该是这样的。
调试到这个时候,实在是已经没有可怀疑的了。只能是怀疑睿思芯科提供的参考原理图是错误的(芯片刚刚出来,资料不齐全,这个也是可以理解的),经过仔细的引脚比对,果不其然,他们提供的原理图接口顺序是不对的。我的天!在这里,来来回回调试了一周的时间,最后的结果竟然是原理图错了!!!虽然都是用的这四个引脚,但是接线顺序是不对的,唯一正确的就是CLK!!!
把接线顺序调整后,实测MISO的波形,如下。
高位在前,低位在后,大家是不是可以判断出这个波形表示的数据是(EFh)呀。
读取ID的指令只要能够发送成功,那么其他指令自然也是可以发送成功的。程序模块中对Flash芯片的数据擦除、写入也就成功了。
现在需要总结的一个问题是,为什么刚一开始的时候,我没有怀疑到它的原理图可能是错误的呢?我总结一下,可能有两个原因。第一是,芯片本身的资料是不全的,引脚核对工作不是那么方便;第二是,他们提供了一个参考的板子,这个板子上的SPI Flash芯片是可以正常读取的,这个现象在一定程度上,打消了我对他们接线图的怀疑。这个事情告诉我们,对于不成熟的东西,一定要仔细根据最可靠的文档来核对自己的电路是不是正确。因为不成熟,大家都比较容易犯错,以至于以讹传讹。
希望我分享的相关调试经验,能够给大家带来一些帮助。
-
RISC-V鸿蒙系统开发板源模块原理简介(项目连载6)
电源是开发板能量的来源,一个稳定可靠的电源系统是开发板能够正常工作的先决条件。我们这个开发板电源系统相对来说比较复杂,主要是因为这个开发板上出现的电压种类比较多,而且个别器件对电压的精确度有非常高的要求。
关于各个模块对电压的要求,我这边做一个简要的说明。
首先开发板电源的输入是12V的DC输入;第二,像红外、FT4222HQ、数码管等器件,需要5V的工作电压;第三,W25Q128FVSG存储、温湿度传感器等器件,需要的工作电压是3V3;第四,单片机IO输出的电平是1.8V;第五,这个芯片引脚内部有不少接口的工作电压是0V8;第六,对于芯片的锁相环,需要输入的电压是0V9。从0V8和0V9这两个电压幅值就可以看出来,这个板子对电源电压幅值的精确度是比较高的。
下图是我们开发板上的电源模块,可以直观地看出这个开发板的电源模块还是相对复杂的。
下面我分别介绍一下各个电源模块的设计要点。
首先是12V的电源输入模块。
这个模块电路的设计要点,是D1这个二极管。这个二极管主要的作用其实是防止电源反接。当然这个二极管上的压降是越小越好。这个蓝色的LED主要是提供了人机交互的功能,当它发光的时候,可以提醒你已经上电了,你下面所有的操作都是带电操作。
上图是一个12V转5V的buck电路,输出是5V的直流电源。这个buck电路使用的是SY8113这款芯片实现的,关于这个片子详细的信息大家可以下载下来看一看。这个电路设计的要点,一个是电感的选择,一个是布局。电感的选择尽量是让电感工作在连续模式,电路布局的时候高频大电流的回路尽可能短,越短越好。这样干扰会越来越小,输出的电源也会更加平稳。这里高频电路有两个,一个是从电感到电容,然后再回到芯片内部地的大电流回路,绿色的那条;另外一个是那条红色的回路,输出电压的反馈回路,这条是信号回路。在电路布局的时候,两个电路按理说都是高频的,都应该最短。但是他们毕竟有冲突,芯片周边的空间就只有那么大,这个时候,我们只能优先考虑大电流的。
上图是5V转3V3的buck电路,主要的关注点和上面提到的差不多。只是这里我们把Buck芯片换成了SY8077。另外一个需要注意的是,电压反馈电阻的选择。SY8077 FB引脚上的电压0.6V,如何选择R29和R30是要注意的,在满足电压配比的前提下,尽量选择常用的电阻。还有一个要注意的是,这里的电阻要选择1%精度的。
3V3转1V8的电源,我们使用的是一个线性电源,使用的芯片是RT9065GE。这个地方不涉及到高频信号,布局上相对来说也相对简单,这里就不多说了。为什么这个地方,会使用线性电源,而不是BUCK电源呢,主要还是3V3到1V8的之间的压差比较小,相对来说功率损耗比较低。
上面两个电路是3V3产生0V8和0V9的电路,两个电路本质上没有太大区别,分压电路的选择上不太一样。其实这里不使用Buck电路也是可以的,毕竟单片机的功耗不是太大。相对难点还是分压电阻的选择这块,如何能够使用常用的电阻进行准确的电压配比。
关于开发板电源的简介,我们就先到这里。