作者:fjh
前言: 这次的牵涉到的内容比较多,有些我用过已经很久了,记得不是太清楚,估计有错,大家边看边挑。
外设接口精彩纷呈。经典串口UART,同步串口SPI,基于ADC输入的触摸屏接口,用于短距离互连的总线I2C,USB,用于SD和MMC卡的媒介接口,ATA硬盘接口,DOC电子盘接口,微型打印机口,以太网接口,CAN总线,lin总线,或者红外IrDA、蓝牙、wifi模块、GSM/GPRS模块接口,等等。上面提到的大部分接口都很独立,参考各自的数据手册和应用手册就能轻松上手。下面简单写一下我对它们的印象。
4.1 经典串口UART
没有哪款CPU会没有这个接口,可见其经典。实际应用中常见的是3线串口(只用收、发和GND三根线)和9线串口(用于modem通讯)。然后根据传输过程的电气规范,又可分为RS232、RS485、RS422等。
使用UART需要收发双方设置好相同的波特率、起始停止位数、奇偶校验位。MCU TO MCU的通讯不存在电平转换问题,MCU TO PC则要使用电平转换芯片,MAX232(5V)、MAX3232(3.3V) 最常用。UART口到目前为止还是最常用的调试程序的打印信息输出口,STC系列的51单片机更是一律需要通过UART口编程。
在MCU侧设置波特率时是根据UART口的时钟源来算分频系数的。如果发现MCU的串口有输出数据但接收端收到的数据值不对,十有八九是波特率寄存器值没设对,剩下的百分之一可能是没处理好数据位数(7位还是8位)和奇偶校验位。
另外,UART串口xx可以用IO口模拟。
4.2 同步串口SPI
四根信号引脚:SCLK、MISO、MOSI、CE(片选)。之所以称为同步是因为收发双方是严格按照SCLK的节奏来动作的。因此数据速度可以到达10Mbps,但传输距离就不能远了,几米范围内。
数据收发是主从式的,主发,从收。在时序上需要注意的是主在发送一字节数据后,需要接着发送一字节的哑数据(dummy data)以维持SCLK线上的同步时钟脉冲,因为从机要接受该字节数据就依赖于这个哑字节所带来的SCLK脉冲的持续。通常哑字节是0x0或者0xff。具体看器件的数据手册。
4.3 I2C总线
这个乏善可陈,仔细研究一下周立功网站上针对它的显示芯片7290的用C51写的例子即可,{wy}值得注意的是,这种总线中,同一类器件的地址是预指定的(由飞利浦公司为该类器件的生产商预制定,例如周立功的LED与键盘控制芯片7290)。很多EEPROM、ADC、DAC都是I2C接口的。
4.4 USB
参考我写的USB host 实现一文。Host都熟悉了,device就手到擒来。在我的21ic 笔记上有得下载。地址是:http://blog.21ic.com/user1/1025/index.html
4.5 SD和MMC卡接口
2410和2440有此接口。没仔细看过程序,保持缄默。
4.6 ATA硬盘、DOC电子盘接口
没搞过。
4.7 微型打印机接口
跟PC的打印机口是一样的。关键控制引脚就是Busy、Error、STROBE。时序也非常简单。有兴趣的朋友编个DOS下的C程序,调用outportb()函数往PC打印机口的0x378地址写数据、往0x37a写控制信号,调用inportb()函数从0x379读打印机状态,就可以驱动打印机了。当然还需要了解一下简单的打印机控制命令。使用热敏式微型打印机的时候需要注意设计好电源,要有足够的能力,因为热敏打印时要求的持续电流比较大,我用过伟煌的热敏打印机,需要用一片LM2576来对之供电,打印效果才好。
4.8 CAN总线接口
类似于以太网的CSMA/CD的总线冲突检测机制,但是与以太网不同,CAN网络使用标识符(其实即CAN节点的地址)来进行按位仲裁以解决访问冲突,数值高的标识符自动获得总线控制的优先权。CAN是一个广播类型的总线,所有节点都接收总线上的数据,硬件上的过滤机制决定消息是否提供给该接点用。
在嵌入式应用中使用CAN总线,可以直接使用带CAN总线控制器(controller)的CPU,如DSP 2407,然后外加一片CAN收发器(Tranceiver)如82C250或者MCP2551。假如CPU没有CAN控制器,也没问题,可以用SPI口外挂一片MCP2515,然后再加一片收发器。CAN 控制器芯片再加上收发器可以完成CAN通讯网络的物理层和MAC层功能,能反馈报文发送或接收过程的错误与状态,用起来不会比用UART更复杂。所以说硬件电路是很简单的。关键在于通讯网络中应用层的协议。这是软件的工作了。
4.9 以太网接口
早年刚流行时常用8019芯片来实现基于IEEE802.3标准的MAC层和PHY层收发,现在流行CS8900等。用于单片机控制网络中的以太网从硬件上乏善可陈,主要工作量在软件上,stack的实现,需要了解802.3的协议,以及更高层的协议,如TCP/IP协议族,这些都是软件方面的工作了,不表。
4.10 功能模块
红外、蓝牙、wifi、GSM/GPRS、CDMA等无线通信功能通常是以一个模块的方式提供,提供跟MCU的接口不外乎是UART、SPI、并行总线、USB这些,只要掌握了前面的各种接口,就没有半点问题。
4.11 显示器件
嵌入式系统的显示器件很多,从数码管到各种形状可定制的液晶模组到点阵式液晶模组到伪彩STN屏到真彩TFT LCD都有。数码管和LED的应用可以很简单也可以很复杂,不在本文讨论范围之内。主要讲讲常用的点阵式液晶模组以及STN屏的嵌入式系统接口。
4.11.1 点阵式液晶模组LCM
如果用过98年开始流行的IC卡电话,应该记得电话机上那个泛着黄绿色底光的显示屏,那种就是点阵式液晶模组,称为LCM。那时候好像用的是1602或者12232。1602的字库只支持ASCII码,1602的意思是只有两行,每行最多只能显示16个英文字符。12232支持二级汉字库,也是只能显示两行,每行最多显示8个汉字或16个ASCII字符。12864也渐渐用的多起来,支持显示四行,每行最多8个汉字。
1602我只见过接口是8位并行总线的,即跟SRAM一样,像访问SRAM一样访问1602即可。
12232和12864的接口有选择,有些是如1602是8位的并行总线接口,有些是跟UART一样,是一收一发的串行接口。IO口紧张的情况下,当然用串行接口的模组要省脚了,只需要两个IO。
在硬件接口上,需要注意的有两点。LCM一般有一个引脚叫“液晶显示偏压”信号,LCM采集该引脚上的电压值(0~5V),根据电压值的大小调节LCM的显示亮度。调试程序时如果发现屏上一片白或一片黑,看不到字,也许就是该脚的电压给的不对,我记得大概在4V左右会比较合适,记不清了,多年前做过。一般用两只电阻分压,如果想可调,上个电位器,但是成本高了。
另一点,背光工作电流在5mA左右,需要串联限流电阻以调节背光强度,太强的背光会缩短背光LED的寿命。如果要做到背光的亮灭可控,只要在背光电路中串联一只三极管,如8050,用MCU或者逻辑电路来控制三极管基极通断。
LCM模组内部,其实确有一块RAM的(所以难怪接口类似SRAM),编程的时候,直接写RAM的相应地址,屏上相应的位置就会出现字符了。如果需要做动画等效果,就需要程序直接控制到某个像素点。
4.11.2 STN屏
早期使用的STN彩色屏很多是sharp公司的屏,具有代表性,典型分辨率是320×240。其接口信号线定义如下:
序号 引脚符号 描述
1 YD 帧同步信号
2 LP 行数据锁存信号
3 XCK 行数据时钟信号
4 DISP 控制屏是否显示的信号
5 VDD 电源
6 VSS 地
7 VEE 背光电源
8 D0~D7 8位显示数据
写满一屏的数据称为1帧,YD是帧同步数据,也即是由YD脉冲启动新一帧数据的写入。两个YD脉冲之间的时间长度显然就是帧周期,也即LCD刷屏的周期,其倒数是我们熟悉的刷新率,对于这款Sharp LCD屏,频率一般70~80Hz。
LP是行(共240行)数据输入锁存信号,也就是行同步脉冲信号。该信号启动新一行数据的写入,所以显然每帧中包含240个LP脉冲。
XCK是行数据输入信号,是每行中每一像素点数据传输的时钟信号,每8个字节的数据在XCK的下降沿出被锁存。
DISP控制屏是否显示,如果L电平 ,那屏幕就不显示,类似于显示器被关了。
在硬件上STN和TFT屏的驱动偏置电压产生电路与背光电路比LCM复杂很多。
STN/TFT LCD的驱动需要正电压或者负电压偏置,而大多数嵌入式子系统都是5V电源,因此需要DC-DC变换电路。我使用过ANDORIN专为LCD负电压偏置而设计的adp05c24,是产生-24V的可调DC变换器。或者采用如MAX680、摩托的34063等DC-DC芯片也可做到正负电压电源。
LCD背光,中大点阵的STN型与TFT型LCD,多为白色(红绿蓝色调)CCFL背光,一般为25kHz~100kHz、300V以上交流驱动。该交流驱动目前多使用外加一块拇指大小的驱动板,特征是其上有个小变压器,实现5V输入,300V以上交流驱动的输出。或者用成品的背光模块,如森宝的VET-N1210-01 CCEL模块,用IC器件搭建背光电路,可以紧凑设计结构并降低成本。
以上是LCD屏的电路接口,幸运的话CPU这边有对应的LCD控制器接口,譬如44b0,就有STN屏的接口,外部接口信号一般跟屏是对应的,如44b0,VFRAME跟YD对应,VLINE跟LP对应,VCLK跟XCK对应,VM跟DISP对应,等等。
LCD控制器的工作概括起来就是把显示缓冲区的LCD图像数据送到外部LCD屏去。一般的特征为:支持色彩深度xx位,支持xx 扫描方式的屏,支持虚拟屏(可硬件方式地水平和垂直滚动),支持多种像素的屏,等等。
4.11.3 TFT屏
虽然现在的产品在用,但不是我搞的,不敢胡说。欢迎指点,我也好学习学习。