最近由于找到的工作是偏于嵌入式方向,因此又重新开始学习已经丢弃两年的知识。新手学习知识感觉有一个通病:喜欢收集各种各样的视频、资料,网盘里收藏一大堆,但是却从没有打开看过,到头来还是个小白,只听说过几个概念,而实际却是不知所云,这就是所谓的"学习综合征"。而我也是其中的一员,最近痛定思痛,就准备根据一套资料沉下心学习下去,不再进入收集资料的大军。市场上关于嵌入式方面的视频或资料有很多,比如国嵌、韦东山、华清远见、朱有鹏等等,各有千秋但是最后还是殊途同归,以我之见把其中一套吃透也算是入门,之后的成长还是要靠工作中的沉淀,看源码,做项目才能提高。
现在准备根据韦东山老师的视频写一下自己学习的体会,这一次写的主要是关于如何看原理图,主要分为以下几个部分:GPIO和门电路,协议类接口(UART/I2C/SPI/NAND)、内存类接口。
一、GPIO和门电路原理图
General Purpose Input Output(通用输入/输出)简称为GPIO,或总线扩展器。通常GPIO寄存器可以分为三类:
控制寄存器:为输入、输出、或其它特殊功能
数据寄存器:1或0
上拉寄存器:设置IO的输出模式是高阻,还是带上拉的电平输出,或者不带上拉的电平输出
上图所示,可以配置按键所以对应引脚控制寄存器为输入功能,LED引脚为输出功能,那么就通过按键控制LED灯的亮与灭。上拉(下拉)电阻是将不确定的信号通过一个电阻钳位在高(低)电平,电阻同时起限流作用。
上图所示的电阻作用就是分别对应上拉电阻,与下拉电阻。引脚输出高电平,但由于后续电路的影响,输出的高电平不高,就是达不到VCC,影响电路工作,所以要接上拉电阻。下拉电阻情况相反,让芯片引脚输出低电平,结果由于后续电路影响输出的低电平达不到GND,所以接个下拉电阻。
门电路用以实现基本逻辑运算和复合逻辑运算的单元电路。常用的门电路在逻辑功能上有与门、或门、非门、与非门、或非门、与或非门、异或门等几种。如下图所示:
二、协议类接口
协议类接口电路分为两个方面:硬件电路的搭建与引脚工作的时序。协议类接口主要实在两个设备之间进行通信,类比两个人的对话,就要解决两个问题:
1、你说的话别人要能听懂(两个设备之间约定好相同的信号协议)
2、双方说话的语速不能太快,要不然别人反应不过来(双方满足相同的时序要求)
- UART
这里以UART、I2C、SPI、NAND Flash四个个通信协议说明协议类接口的硬件原理图与时序图。通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种异步收发传输器,是电脑硬件的一部分。它将要传输的资料在串行通信与并行通信之间加以转换。在TQ2440中串口电路如下:
由于UART传输过程,为了保证信号的有效性和传输距离,采用的是负逻辑电平,即逻辑"1"用-3~-12V表示,逻辑"0"用3~12V表示,因此2440输出的信号需要进行电压转换,上图即为电压转换的原理图。在UART的协议中,没有统一的时钟,依靠起始位和停止位标识一帧数据。其帧格式起始位1位(低电平),数据位5-8位,校验位0-1位,停止位有(1、1.5、2 高电平表示)几种。
- I2C
I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。SDA(串行数据线)和SCL(串行时钟线)都是双向I/O线,接口电路为开漏输出.需通过上拉电阻接电源VCC.当总线空闲时.两根线都是高电平,连接总线的外同器件都是CMOS器件,输出级也是开漏电路.
在I2C总线上,发送到SDA 线上的每个字节必须为8 位,每次传输可以发送的字节数量不受限制。每个字节后必须跟一个响应位。首先传输的是数据的最高位(MSB),如果从机要完成一些其他功能后(例如一个内部中断服务程序)才能接收或发送下一个完整的数据字节,可以使时钟线SCL 保持低电平,迫使主机进入等待状态,当从机准备好接收下一个数据字节并释放时钟线SCL 后数据传输继续。数据传输的开始条件为:时钟保持高电平时,数据由高电平变为低电平;结束条件为:时钟保持高电平时,数据由低电平变为高电平。
其数据传输格式为:
- SPI
SPI是串行外设接口(Serial Peripheral Interface)的缩写。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,如今越来越多的芯片集成了这种通信协议,比如AT91RM9200。在TQ2440中,没有专门引出SPI总线的外设接口,但是查看2440芯片手册可以知道,该芯片支持4中SPI工作方式。其总线构成可以用下图表示:
各引脚表示的含义为:1)MOSI – Master数据输出,Slave数据输入 2)MISO – Master数据输入,Slave数据输出 3)SCK – 时钟信号,由Master产生 4)/CS – Slave使能信号,由Master控制。
SPI接口在Master控制下产生的从器件使能信号和时钟信号,两个双向移位寄存器按位传输进行数据交换,传输数据高位在前,低位在后(MSB first)。如上图所示,在SCK的下降沿上数据改变,上升沿一位数据被存入移位寄存器。
- NAND Flash
Nand-flash存储器是flash存储器的一种,NAND结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。下图为一块NAND Flash芯片,除去不用引脚与电源引脚外,主要有数据引脚线、片选、写、读等引脚,个引脚功能可从芯片手册上查到。
在Nand Flash芯片,一块芯片称为一个device,一个device又可以分为多个Block,一个Block可以分为多页,因此要读取指定区域的数据时,要分多次传输地址。
以上介绍了四个协议类接口,其具体的使用与编程在以后再作总结。
三、内存类接口
内存类接口主要有SDRAM、NOR Flash等芯片,这类芯片信号传输可以分为片选、地址信号、数据信号三大类。对于这类设备的访问,首先选定其片选信号,其次确定地址,在读取数据。在2440中,其内存控制分为8个区域,每个区域为128M,下图为TQ2440中,sdram的电路图,这是由两块16位的SDROM组成一个32位SDROM。由图可以知道其片选信号接到2440的nGCS6,在2440的内存映射图中nGCS6的起始地址为0x30000000,这也是为什么我们刚开始学习ARM裸机编程时,老师让我们将程序烧录到0x30000000。在图中,地址线接到2440的ADD2-ADD14,而没有接ADD1、ADD0那是因为,2440的字宽为32位,即4个字节,最少读取数据与写入数据的单元为4个字节。那么,想要处理一个字节数据也是只有先取出4个字节,再从中拆除需要的数据,处理的数据必然是4的整数倍,因此最低两位地址线可以不接。
2440中内存地址映射图。