个人成就
- 发布了43篇内容
- 获得了2次赞同
- 获得了5次收藏
个人简介
擅长领域
暂时没有设置哦~
-
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单片机的鸿蒙开发板项目简介(项目连载1)
大家好,我是张飞实战电子的张角老师。我目前正在做的一个项目是开发一块基于RISC-V架构单片机的鸿蒙系统开发板。
鸿蒙系统是华为公司开发的新一代物联网操作系统系统,RISC-V单片机是不同于ARM架构的单片机,目前形势一片大好。在美国对我国芯片以及操作系统等高新科技的疯狂打压的背景下,鸿蒙系统以及RISC-V架构单片机这两种产品的发展以及突破显得尤其重要。它们两个很大概率上会是电子信息领域我们突破美国技术封锁的两个突破口。
张飞实战电子,愿意在力所能及的情况下,为这两块产品的推广添砖加瓦,贡献自己的力量。为此,我们愿意把这块基于RISC-V架构单片机的鸿蒙系统开发板的实现过程,尽可能清楚的展现给大家,争取越详细越好,为大家以后进行相关的产品开发提供一些经验参考。
这块开发板使用的单片机是深圳睿思芯科的Pygmy-E系列的单片机,这是一款32位的面向IOT领域的单片机,具备超低功耗的特性以及丰富的外设接口。
开发板的硬件电路模块包括电源电路,电平转换电路,单片机最小电路,USB转SPI电路,USB转UART电路,温湿度检测电路,片外SPI Flash电路,红外模块检测电路,开关检测电路,蜂鸣器电路,流水灯电路。
电源电路包括12V电源接口电路,12V转5V Buck电路,5V转3V3 Buck电路,3V3 转1V8 LDO电路,3V3转0V9 buck电路,3V3转0V 8 buck电路。BUCK电源和LDO电源是我们做开发板的过程中非常常用的电源,在这个模块,我将和大家分享下BUCK以及LDO电路的设计方法。
电平转换电路主要是利用双向电平转换芯片TXS0104以及TXB0104等实现电平的双向转换。为什么我们需要电平转换芯片呢,主要是因为我们使用的这块单片机是还处于验证阶段,单片机IO的电平是1V8,而我们常用器件的电平以3V3的居多,比如我们用的FT4222 USB转SPI芯片,SHT20温湿度检测传感器等。
单片机最最小外围电路包括供电模块,晶振模块,复位电路模块,BOOT启动模块等。
其他模块电路我们就不一一介绍了,等以后我们再展开分析。
软件这块,我们打算依据硬件电路开发一些demo。这些demo主要分为三个板块,一个是睿思芯科RISCV单片机的外围驱动开发模块,主要包括GPIO、UART、I2C、SPI等接口的驱动开发;一个是鸿蒙系统Liteos-M模块的内核实验;再一个就是,利用外围电路我们我们要演示的一些demo,比如流水灯,蜂鸣器唱歌,红外信号检测,温湿度检测,外置SPI Flash读取等。
软件的开发和编译是在Ubuntu 中进行的,会使用到一些简单的Linux命令。这里我们会尽可能详细的介绍清楚编译环境的搭建,以及调试过程。
整个项目涉及到的硬件、软件等相关的东西比较庞杂,我们争取尽可能清晰完整地展现所有的细节。因此估计更新的时间会比较长,期待大家能够和我一起坚持到最后。久久为功,方能修成正果。一起加油!
-
斜坡补偿的由来
在开关电源中,有一个相对不容易解释清楚,但是对整个系统的稳定性又起到重要作用的知识点-斜坡补偿。我们打算后面用一系列文章来深入探讨一下这方面的知识,争取让大家能够对这块内容有相对深入的理解。
我们首先需要回答的问题,就是开关电源系统为什么需要斜坡补偿,或者说斜坡补偿解决了哪方面的问题?从宏观上看,开关电源的调节系统可以分为两部分,一个是内环电流环,一个是外环电压环。之所以把电流环称之为内环,主要是因为它的调节速度更快,属于单周期调节。电压环,调节速度相对电流环肯定是更慢的,对于输出滤波电容来说,电压是电流的积分。电流环调节的结果要经过数十个周期之后,才能在电压信号上做出反应。
当系统的输出电流或者说电感电流,因为负载变化或者输入电压变化产生扰动的时候,在电压环起到调节作用之前,有可能发生电感电流的次谐波震荡,或者说是电感电流的振铃现象。
这里之所以说是有可能,主要是因为这个现象发生在CCM模式下,而且占空比大于50%的时候。当占空比小于50%的时候,扰动电流的震荡会自动趋于收敛。我们下面用图形化的方式给大家演示一下。
上图是占空比小于50%的时候,负载变化引起的电流扰动。大家可以看一下,这个扰动在几个周期后,会自动收敛。具体为什么会收敛呢?我们可以推算一下电流扰动量的变化公式。
大家可以看一下,当占空比小于50%的时候,Ton的时间内电流上升的斜率大于Toff时间内电流下降的斜率。那么这个电流抖动量的变化趋势和这两个斜率的比值很有关系。
具体的推导公式,如上图所示。我们这里是分两个三角形来进行计算的。在θ0的三角形内,根据正切关系可以得到δIo和It(两个三角形的公共部分)比例关系式①。实际上这个正切关系本质上是不是就是斜率呀。同样的,在θ1这个三角形内,我们也可以得到式子②。这两个式子化简以后,就会得到关系式③。大家可以看一下,δI1是不是要比δIo要小呀,因为m2小于m1,对吧。当占空比小于50%的时候,是不是m2一定小于m1呀。那么经过几个周期的迭代,是不是扰动量慢慢变小后,系统也就收敛了。
但是当占空比大于50%的时候,也就是m2大于m1的时候,这个扰动量是不是也来越大,结果也就会出现电感电流的震荡,如下图所示。
对于控制系统的开关芯片而言,Ton的时间也就会出现波动,也就是会出现所谓的大小波交替现象的发生。这个波动的电流对系统的稳定性是无益的,需要想办法解决掉。那么该怎么解决呢?这个也就是斜坡补偿的由来:既然这种情况下m2大于m1,我们能不能通过斜坡补偿的方式使得整体的斜率大小关系发生改变呢?
下篇文章,将会对这个问题进行更深入的分析。
-
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鸿蒙系统开发板源模块原理简介(项目连载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电路也是可以的,毕竟单片机的功耗不是太大。相对难点还是分压电阻的选择这块,如何能够使用常用的电阻进行准确的电压配比。
关于开发板电源的简介,我们就先到这里。