发帖数

43

原创数

43

关注者

16

阅读数

9333

点赞数

2

张角

  • RISC-V鸿蒙开发板单片机简介3(项目连载10)

    我们今天继续RISC-V I2C接口的介绍。上篇文章,我们大体比较了新思科技的I2C接口与STM32F030XXI2C接口之间宏观上的区别。整体上,我们可以感觉新思科技的I2C接口使用起来相对来说比较麻烦。好在新思科技给出了最初版本的驱动程序设计,我们可以在他们的基础之上进行适当的改动,就可以把I2C通信的功能建立起来,同时在使用中可以加深对这些接口模块的理解。

    image.png

    上图的代码是程序中对I2C接口的初始化部分,和STM32的寄存器配置基本是一样的。主要是对寄存器的配置,通过在寄存器那里设定给定的值以后,I2C模块就可以按照指定的方式进行工作。

    我们先从架构上来分析一下,首先代码中的reg_i2c这个变量,是I2C相关寄存器的基地址。红色字体寄存器的名字其实表示的是相关寄存器的偏移地址,这里也是采用“基地址+偏移地址”的方式进行寻址的。

    上图中红框部分的描述,应该比较容易理解,相应的位配置好以后,写到DW_IC_CON(控制寄存器)里面去,就可以实现相应的功能了,比如选择FAST_SPEED模式、MASTER模式以及进行RESTART等等。

    大家可以看一下,对于不同的速率,I2C接口模块会配置不同的时钟信号值。从数据上就能够看出来Slow模式和Fast模式,单周期内占用的时钟个数是不一致的,SLOW模式使用的时钟个数更多,不管是HCNThigh counter)还是LCNTlow counter)。这样的配置也是相对来说容易理解的,信号传递的速度越高,时钟频率肯定就会越大,那么时钟的HIGHLOW部分肯定占据了更少的时间。从寄存器上来看,对于低速(SS)、快速(FS)和高速(HS)配置的时候,使用的是不同的寄存器,而不是在同样的寄存器中使用不同的位来配置。

    image.png

    image.png

    上面两个函数是计算时钟的公式,具体这些计算方法和参数的设置应该是新思科技结合自己的硬件特性给出的。我们不要过于深究。

    image.png

    相比之下,STM32F030xx这款芯片中,对于时钟的配置就要简单的多。Reference Mannual中,对于不同的速率,只需要在SCLSDA中配置相应的值就可以了,而且系统给出了推荐值,是不是简化了不少?不过它这样的表述,从另一方面来看,也掩盖了许多硬件实现的细节。这些细节,对于我们从硬件层面上更加深刻的去理解I2C协议,肯定比较有帮助。只不过我们实际使用的过程中,一般不需要了解得这么细致。当然,从本质上讲,两者实现的思路肯定是一样的。

    时钟信号配置完以后,下一步就是要对SDA和中断系统进行配置了。

    image.png

    大家可以看一下,IC_SDA_HOLD这个位的解释,就是SCL由高到低变化后,SDA这个位还需要保持多少时间。我们说I2C的协议里面是不是定义了,在SCL为高的时候,SDA的数据信号是不是不能变化的呀。怎么能够实现不能变化呢?是不是就是要把SDA的信号延时一部分时间再变化,是不是就可以了呀。这个寄存器就是实现这个功能的。

    image.png

    最后一个是关于SPKLEN的,这个是一个保护设计,为了防止电压或者电流冲击对信号造成影响的。我们按照默认的配置写就可以了。

    image.png

    image.png

    今天关于I2C初始化部分介绍,我们就先到这里。后续的内容,我们会在文章中持续更新。


    收藏 0 回复 0 浏览 316
  • RISC-V鸿蒙开发板单片机简介2(项目连载9)

    这篇文章我们来简要的介绍一下Pygmy-E单片机使用的I2C通信接口,主要内容是通信协议的描述,框图的讲解,以及相关寄存器的介绍等等。本文介绍的时候,尽量把它和主流的STM32单片机对比,这样大家可以对两个I2C的外设都有更清晰的认识。其中红色框框选出来的关键字属于Pygmy-E单片机支持的I2C绿色框框选出来的属于STM32F030C8T6这款单片机

    1. 传输速度

    主流的STM32单片机一样,Pygmy-E系列的单片机的I2C接口,一样支持不同的传输速度,从而适配不同的外设和场景诉求。

    image.png

    image.png

    2. 组成框图

    从框图上来看,两种类型的I2C接口组成单元是类似的。要实现I2C协议相关的信息收发功能,首先必须要有这些相应的功能;再一个,按照这样的模块进行对整个功能模块进行切分,可能在电路设计上相对最为简单。但是整体上,还是STM32这款单片机对I2C各个组成模块及其相互之间的关系描述得更加清晰。

    image.png

    image.png

    image.png

    image.png

    3. 开始信号和信号传输信号

    I2C通信协议,开始信号和结束信号,是在SCLK为低的时候,通过SDA这个引脚的变化来产生的。 SDA由高到低的时候,是start信号;SDA由低到高的时候,是STOP信号。那么既然这两个信号是开始和终止信号,那么在信号传输的过程中一定要避免这样的信号出现。那么从协议上看,在数据传输的过充中,数据信号的采样(保持不变)只能是在SCL为高电平的时候,数据信号的改变只能是在SCL电平为低的时候。另外为了避免,在SCL为高的时候,万一SDA的信号发生了变化,可以适当配置SDA和相对于SCLK信号的先发和延后时间。这个误识别的诱发因素会很多,比如布线的时候,如果不是等长线,就有可能导致默认配置的先发和延后时间失去作用。Pygmy-E单片机和STM32单片机都提供了相应的寄存器来配置这个时间。

    从这个方面上来看,两款I2C电路基本是一致的,只是配置延时时间的寄存器可能是不一样的。


    image.png

    4. 寄存器

    下面是配置两款I2C接口时所使用的寄存器,大家从图上可以看出,Pygmy-E系列的单片机I2C接口所需要配置的寄存器非常复杂,总计有68个寄存器需要配置。相比之下,STM32单片机所需要配置的寄存器就要少很多,明显感觉易用性更好。Pygmy-E单片机的I2C接口使用这么多的寄存器好处也当然是有的,它可以帮助我们对I2C接口模块有相对更为深入的理解。但是需要我们对I2C通信协议以及相关的应用非常熟悉才行,否则这么多的寄存器相当容易把开发者搞晕。

    image.pngimage.png

    image.pngimage.png

    image.png

    5. 从地址

    两个I2C接口模块,都支持7位和10位地址协议。接口的通用性上都差不多。具体的通信内容的格式,这里就不在进行比较了。

    对上述几个关键的方面进行比较后,我们基本上可以感觉到,相比STM32f030C8T6这款单片机,Pygmy-E单片机的I2C接口使用起来难度相对较高。但是它数量庞大的寄存器,同时增强了使用它时的灵活度。两款接口应该是各有所长,但是从通用性上而言,STM32I2C接口可能会更加友好。




    收藏 0 回复 0 浏览 172
  • RISC-V鸿蒙开发板单片机简介(项目连载8)

    我们使用的单片机是深圳睿思芯科公司出品的Pygmy-E系列的单片机,它是面向IOT超低功耗32SOC,内含睿思独立设计的ORV32 RISC-V内核,实现了RV32IMC标准指令扩展。主要用于IOT终端设备的感知、控制、连接等领域,如智能家居、智能控制、智慧工业、智慧园区等。

    image.png

    这款单片机主频可以高达100Mhz。在存储方面,一级缓存8KB,二级缓冲256KB,存储容量还是比较大的。同时它支持丰富的外设接口,比如GPIOUARTSPIIIC等,可以实现复杂的通信及控制功能。

    在低功耗方面,Pygmy-E拥有极低的功耗表现,通过对CPU极致的低功耗微架构设计和对SoC系统层级进行深度优化设计,动态功耗远优于同等计算性能的ARM芯片,并且实现的uW级别的SOC待机功耗。

    整个处理器的框架图,是如下这个样子,供大家参考。

    image.png

    我们后面会分几个模块来介绍这款单片机,比如GPIO接口、I2C接口、SPI接口以及中断系统等等。这篇文章里面,主要介绍系统时钟以及GPIO接口的一个关键点,介绍这个的时候,我会尽可能的和ARM架构的单片机进行比较,在对比中把这款单片机架掌握得更加深刻。

    1. 时钟

    整个系统主频和外设的频率(SysTick定时器,UARTI2CSPI等)是可以自己设置的,不过从目前我这边拿到的资料来看,在时钟树这块,它的架构不像ARM内核那样可以通过对RCC寄存器的配置来统一对时钟进行管理。

    不过这并不影响单片机的使用,只是在配置时钟这块需要对各个外设寄存器有更加深入的了解,因为外设时钟信号的配置更多是在这里进行的。

    我们这里外部使用的是20Mhz的有源晶振,实际系统中的主频也就配置成了20Mhz

    image.png

    1. GPIO

    这款芯片的外设使用的是新思科技的模块,对GPIO口复用的配置主要是通过各个接口的SELDIR两个寄存器来实现的。SELDIR寄存器的值都为0的时候,使用的是复用模块的功能;SELDIR寄存器中的值均为1的时候,单片机使用的是GPIO口模块的功能。但是每个接口模块,只能有一个复用功能,这个地方不同于我们经常使用的STM32单片机。在STM32单片机中,大部分接口都会支持好几个功能模块的复用。

    image.png

    从上图中,大家可以看出来每一个端口目前只有一个复用功能,我们在实际进行端口配置的时候,灵活度相对来说要小不少。

    大家可以看一下GPIO模块的通用框图。

    image.png

    从这个通用框图,可以看出来,GPIO输入和输出值的改变,是通过D触发器完成的。用硬件原理上来说,如果GPIO接口的模块没有时钟信号,那么这个模块就不能够工作。我们可以直接通过控制时钟模块就可以控制响应接口是不是处于工作,这样就可以达到控制整个芯片功耗的目的。但是我们在一般的ARM单片机提供的参考手册中看不到这样的框图,这个框图中对D触发器的解释相应地来说,会更加清晰。


    收藏 0 回复 0 浏览 472
  • 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
  • RISC-V鸿蒙系统开发板SPI通信模块调试3(项目连载6)


    大家好,我们继续SPI通信接口部分的调试分析。

    上篇文章我们提到CLK的波形幅值最高处只有2.2V,远远没有达到3.3V这一芯片工作电压。同时CLK波形的底部也不是0V。我们因此怀疑RISC-V单片机发出的CLK波形,存储芯片有可能分辨不出来。应该说这个怀疑是合理的。如果大家想从最基础的原理上去辨别出来这个波形的正确性,需要仔细去研读单片机和Flash存储芯片的datasheet。因为我们这块板子是参考睿思芯科一块老的开发板来进行设计的,在他们原有的开发板上这个Flash存储芯片是可以正常读取的。那么我们可以先测试一下原有板子这个引脚处的CLK波形是什么样子的,对比一下就知道,CLK的这个波形是不是正确的。

    下图是我们实际测试到的他们原有开发板上CLK引脚处的波形,大家可以看一下这个波形。这个波形的幅值和频率和我们现有开发板上的波形是一致的,那换句话说我们这个我们板子上的CLK信号也是可以让存储芯片正常工作的。

    图片13.jpg

    既然CLK波形是没有问题,那为什么还收不到数据呢?那我们看一下MOSIMISO的波形,看一看到底是哪里出问题了。如果单片机这一侧能够发送控制信号到W25Q128这一侧,按理说应该是MOSI这条回路是没有问题的。如果MISO这条回路,在单片机侧能够收到波形,那说明MISO这条信号传输回路没有问题;某种意义上它还可以说明,存储芯片W25Q128FVSG收到单片机指令之后,进行了响应。

    图片14.jpg

    大家看一下这个波形,这个是MOSI回路在W25Q128这一侧测到的波形。这个至少可以说明了刚才我们提到的结论:单片机成功给W23Q128发送了信号。

    图片15.jpg

    大家看一下这个波形,这个是MISO回路在芯片这一侧的波形。如果使用示波器的捕获功能,同时使用两个通道来捕获波形,一个是MISO,一个是CLK,那么截取的波形就是下面这个样子。

    图片16.jpg

    同样地,这个图片也说明了一个结论,那就是W25Q128确实收到了单片机发出的指令,并且进行了响应,只是波形不对。那问题出在哪了呢?大家看一下MISO的波形,这个信号也出现了“高”没有“高”上去,有些地方“低”却没有“低”下来的情况。波形看起来比较奇怪,看不出来,这个到底是什么数据。

    问题卡在这里了,那到底是哪里出错了呢?

    首先引起怀疑的就是时钟信号的频率有点太高了,以至于MISO这根线上相应的器件响应速度根本反应不过来,或者是发生了震荡,所以才导致了这种高不高、低不低的情况发生。

    解决这个问题的办法,一般是在发送引脚和接收引脚之间串联一个电阻,用以防止震荡的发生,但是因为我们这个电路已经画好了,已经没有办法再增加电阻。目前能够尝试的办法就是降低信号发送的频率了。降低信号的频率之后,震荡自然也就不会发生了。

    图片17.jpg

    调试的方向明确了,我们要从软件上把通信时钟的频率降低下来,这里要做三处更改。因为SPI接口读取Flash的程序是使用Linux kernel里面的框架来写的,改动起来相对来说比较复杂。

    主要修改的地方有三处,我们在这里耽误了不少时间,主要的原因是这个kernel框架比较复杂。SPI1_CLK_DIV_DWH是一个宏,我们可以通过更改这个宏的值,来改变系统时钟分频的系数。

    图片18.jpg

    图片19.jpg

    图片20.jpg


    不过,比较悲催地是,频率降低以后,MISO的波形依然是不对的,还是这种不高不低的样子。那就奇怪了,这到底是什么原因引起的呢?实在是有点难以理解呀。信号传输的电路都是通的,而且都有波形出来,只是波形不对,难道是存储芯片坏了?不应该呀。实在是不应该出现这样的错误。

    那读取W25Q128 ID的波形具体应该是什么样子的呢?根据W25Q128这个芯片的datasheet,读取它的ID时,MISO返回的数据应该是这样的。

    图片21.jpg

    调试到这个时候,实在是已经没有可怀疑的了。只能是怀疑睿思芯科提供的参考原理图是错误的(芯片刚刚出来,资料不齐全,这个也是可以理解的),经过仔细的引脚比对,果不其然,他们提供的原理图接口顺序是不对的。我的天!在这里,来来回回调试了一周的时间,最后的结果竟然是原理图错了!!!虽然都是用的这四个引脚,但是接线顺序是不对的,唯一正确的就是CLK!!!

    把接线顺序调整后,实测MISO的波形,如下。

    图片22.jpg

    高位在前,低位在后,大家是不是可以判断出这个波形表示的数据是(EFh)呀。

    读取ID的指令只要能够发送成功,那么其他指令自然也是可以发送成功的。程序模块中对Flash芯片的数据擦除、写入也就成功了。

    现在需要总结的一个问题是,为什么刚一开始的时候,我没有怀疑到它的原理图可能是错误的呢?我总结一下,可能有两个原因。第一是,芯片本身的资料是不全的,引脚核对工作不是那么方便;第二是,他们提供了一个参考的板子,这个板子上的SPI Flash芯片是可以正常读取的,这个现象在一定程度上,打消了我对他们接线图的怀疑。这个事情告诉我们,对于不成熟的东西,一定要仔细根据最可靠的文档来核对自己的电路是不是正确。因为不成熟,大家都比较容易犯错,以至于以讹传讹。

    希望我分享的相关调试经验,能够给大家带来一些帮助。


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