7 通信接口设计.docx
《7 通信接口设计.docx》由会员分享,可在线阅读,更多相关《7 通信接口设计.docx(54页珍藏版)》请在冰豆网上搜索。
7通信接口设计
7通信接口设计2
7.1串行接口2
7.1.1串行通信概述2
7.1.2串行接口设计实例3
7.2I2C接口6
7.2.1I2C接口概述6
7.2.2I2C接口设计实例7
7.3Ethernet以太网接口12
7.3.1Ethernet接口概述12
7.3.2以太网控制器RTL801914
7.3.3Ethernet接口设计实例15
7.4USB接口20
7.4.1USB接口概述20
7.4.2USB接口设计实例22
7通信接口设计
计算机与外界的信息交换称为通信。
基本的通信方式有两种,即并行通信和串行通信。
并行通信是指数据的各位同时进行传送(发送或接收)的通信方式。
串行通信指数据是一位一位按顺序传送的通信方式。
构造基于网络的嵌入式应用,不仅仅是为了提供信息传送,还要实现信息的共享、分布式处理等功能。
7.1串行接口
许多I/O接口器件与CPU交换信息或计算机与计算机之间交换信息,都是通过一对导线或通信来传递信息,这时数据时一位一位进行传输的,每一位都占据一个规定长度的时间间隔,这样数据一位位顺序传递的通信方式称为串行通信。
完成串行通信任务的接口称为串行通信接口。
计算机在处理数据时总是以并行方式进行数据处理,而外部设备如果是串行通信方式,那么就需要将串行信息转变为并行信息,而计算机想要将信息传送给外设也必须将并行数据转换成串行数据。
这样就需要一个转换信息的接口即串行接口。
与并行接口相比较,串行接口应用更为广泛。
本节首先介绍串行通信中的一些基本概念及串行通信接口的设计方法。
7.1.1串行通信概述
1.数据传送方式
串行通信时,数据在两个站(或设备)A与B之间传送,按数据流方向的不同可分为单工、半双工、全双工和多工等几种传送方式。
如图7.1所示.
单工(Simplex)方式只允许数据按一个固定的方向传送。
采用这种方式时,就已经确定了通信双方中的一方为接收端,另一方为发送端。
这种确定方式是不可以改变的。
如图7.1(a)现在把这种通信方式称为单向通信。
半双工(HalfDuplex)通信是指信息的发送和接收要同时公用一条线,在半双工方式中,数据可在两个设备之间任一个方向传输,但两个设备之间只有一根传输线,故同一时间内只能在一个方向上传输数据,不能同时收发,故在通信换向时接口部分要靠电路转换,如图7.1(b)。
无线电对讲机就是半双工传输的一个例子,一个人在讲话的时候,另一个人只能听着,因为一端在发送信息时,接收端的电路是断开的。
全双工(FullDuplex)通信是指接口对接收和发送的信息用不同的通道供信息的发送和接收可同时进行,这就意味着工作于全双工方式下的串行通信信息的传递要用两条线即发送线、接收线,如图7.1(c)。
采用全双工的系统可以同时发送和接收数据,电话系统就是一个全双工传输数据的例子。
计算机的主机和显示端(它由带键盘的CRT显示器构成)进行通信时,通常也采用全双工方式,一方面,键盘上敲入的字符可以送到主机内存,另一方面主机内存的信息可以送到显示器终端。
在键盘上敲入一个字符后,并不立即显示出来,而是等计算机收到该字符后,再会送给终端,由终端将该字符显现出来。
这样,对主机而言,前一个字符的回送过程和后一个字符的输入过程是同时进行的,并通过不同的线路进行传送,即系统工作于全双工方式。
多工方式下采用的多路复用技术主要有时分复用TDM和频分复用FDM两种。
前者将共用的物理线路分成若干时间片,轮流为各信号占用,其特点是电路简单,抗干扰性强;后者利用频率调制原理将要发送的信号搬移到不同频段后同时或不同时地发送,其特点是效率高,但电路复杂,抗干扰能力弱。
在计算机串行通讯中主要使用半双工和全双工方式。
图7.1串行通信的单工、半双工、双工及多工传送方式
2.异步通信和同步通信方式
串行通信可分为两种:
一种为同步通信(Asynchronous);一种为异步通信(Synchronous)。
同步通信是将所要发送信息组成一个信息组(通常称为帧),在每帧信息的开始要有同步字符(1~2)个,在数据线上要保持连续的字符,没有信息时也要填上专用空字符,因为同步传输不允许在传输一帧信息时出现间隙。
同步通信特点:
传送信息量大,数度高,适宜于快速传递,灵活性差。
异步通信时,在字符开始要有起始位,一个字传输的结束要用间隔位进行字间隔。
通常一组数据由多个字符组成,而字符是若干数码位的集合。
本方式一次传送一个字符,若要传送一批字符,则需要反复调用该方式。
各字符出现于数据场中的相对时间是随意的,没有专门的时钟控制。
异步通信的特点:
灵活性好,便于处理实时性强的串行数据;速度低,仅适宜于中低速率传输。
3.波特率和传输速率
随着计算机在各个领域的广泛利用,不但要解决人机通信的问题还要解决计算机之间,计算机与通信设备之间的通信问题。
因此为了供通信双方相互衔接,人们就建立了在通信过程中收发双方共同遵守的标准,标准包括:
传输率、电特性、信号名称及接口标准。
并行通信中通常以每秒传送的字节数来表示传送速率,而串行通信中通常以每秒传送的比特数(比特率)来表示传送速率。
(1)传输速率
串行通信中,可用传速率衡量通信设备传输数据快慢,传输速率定义为每秒钟传输的字符帧数。
由于不同格式的字符帧,每帧字符数据长度不同,用传输速率不能直观表达通信口传输数据速度的快慢。
在微处理机系统的串行通信中,常采用波特率表示。
(2)波特率
串行中每秒钟传送二进制数码的位数称为波特率。
波特率的单位bps,即位/秒(BitperSecond)。
波特率主要用以表征数据的传输速度,波特率越高,数据传输速度越快。
串行口的波特率与通信接口的标准以及通信线路的质量好坏有关,例如采用RS-232C标准接口方式,其波特率一般在300~19200bps之间,最高速率不超过20kbps。
此时,其最大通信距离为15m;若适当降低速率,其最大传送距离可增大到60m。
这种标准接口方式只能用于较低波特率和近距离通信。
而用RS-422A标准接口方式,其最大速率可达10M,此时的最大传输距离可达120m;如果适当降低速率,则RS-422A的最大传送距离可增加到数千米。
数据传送中每位数的传输时间定义为波特率的倒数。
若波特率为2400bps,则每位数的传输时间为Tb=1/2400=04165ms。
4.出错校验
在数据通信中,可能会因为各种原因而导致接收数据出错,为了保证传输数据的正确性,在数据传送过程中常需数据校验。
在单片机系统的数据通信中常用的校验方法有奇偶校验、累加和校验以及CRC冗余校验(CyclicalRedundancyCheck)。
(1)奇偶校验
奇偶校验是通过检验被传送的二进制数据中0或1位数的奇偶性,来判断数据在传送过程中是否出错。
在发送数据时,将该数据与其奇偶标志组成一帧数据一起发送,接收方收到这帧数据后将计算出接收数据的奇偶标志位与接收到的标志位相比较,若不同,则传送数据有误。
(2)累加和校验
奇偶校验法通常对每一个传送的字节数据进行校验,如果要对有n个字节的数据块进行校验,则可以采用累加和校验方法。
累加和校验是在传送数据之前先对n个字节进行加法运算,得到累加和。
把累加和附在第n个字节后面传送,接收方收到n个字节后也按同样方法进行n个字节求和,然后把两个累加和进行比较,如果不同,表示数据块传送出错。
在微处理器中,累加和的加法运算可以采用逻辑加,即用异或操作指令完成;也可以用算术加法指令按算术加法得到累加和。
(3)CRC循环冗余校验
奇偶校验以及累加和校验法虽然简单,但校验功能有限,在奇偶校验中如果同时有两位数据出错,就无法检验出来,累加和校验虽然可以发现几个连续位的差错,但不能检出数据之间的顺序错误码率,即数据交换位置时累加和不变,因此在重要数据传送时经常采用较为复杂的CRC循环冗余校验。
循环冗余校验的基本原理是将一个数据块看成一个很长的二进制数。
例如把一个128字节的数据块看作是一个1024位的二进制数,然后用一个特定的数去除它,将得到的余数作为校验码附在数据块的后面一起发送;在接收到该数据块和校验码之后,对它作同样的运算,所得的余数应为0;如果计算结果不为0,就表示接收有错。
5.电气特性
RS-232C是由美国电子工业协会EIA于1969年制定并采用的一种串行通信接口标准,后来被广泛采用,发展成为一种国际通用的串行通信接口标准。
表7.1即为RIA制定的传送电气规格。
表7.1RIA制定的传送电气规格
状态
L(Low)
H(High)
电压范围
-25V~-3V
+3V~+25V
逻辑
1
0
名称
SPACE
MARK
RS-232C所用的驱动芯片通常以±12V的电源来驱动信号线,但是实际上,因为传输线的连接状态及接收端负载阻抗的影响,均会造成电压的下降,但最低仍不得低于±15V以下。
RS-232C标准采用的接口是9芯或25芯的D型插头为例,各引脚定义如表7.2所示。
表7.29芯D型插头引脚信号描述
引脚
名称
功能描述
1
DCD
数据载波检测
2
RXD
数据接收
3
TXD
数据发送
4
DTR
数据终端准备好
5
GND
地
6
DSR
数据设备准备好
7
RTS
请求发送
8
CTS
清除发送
9
RI
振铃指示
7.1.2串行接口设计实例
串行接口电路连接特性的定义目前已有行业标准,通常就称为串行接口标准,如RS-232标准RS-423标准、RS-485标准等。
其中RS-232标准最初是为远程通信连接数据终端设备(DTE)和数据通信设备(DCE)而制定的,它一般用于异步串行通信中。
和其它几个标准相比RS-232性能较差,但因其简单、经济而获得了非常广泛的应用。
目前RS-232标准已成为微机串行通信接口中广泛采用的一种标准,如用于计算机(视为DTE)和调制解调器(视为DCE)之间的连接。
为了支持串口通信作这个常用接口,很多处理器以及一些外围芯片都采用串口进行通信。
例如几大厂家都生产串行通信的AD、DA等数字芯片,很多LED驱动器器也采用串口与主机通行。
本实例介绍S3C4510B与PC机的串行通行接口的设计方法。
通过MAX232芯片可以建立串口通行的物理连接,S3C4510通过此串口可以与PC机间接受和发送数据,而且还可用于接受PC机的调试命令。
由于RS-232C标准所定义的高、低电平信号与S3C4510B系统的LVTTL电路所定义的高、低电平信号完全不同,LVTTL的标准逻辑“1”对应2V~3.3V电平,标准逻辑“0”对应0V~0.4V电平,而RS-232C标准采用负逻辑方式,标准逻辑“1”对应-5V~15V电平,标准逻辑“0”对应+5V~+15V电平。
显然,两者间要进行通信必须经过信号电平的转换,目前常使用的电平转换电路为MAX232,其引脚分布如图7.2。
图7.2MAX232引脚分布
关于MAX232更具体的内容可参考MAX232的用户手册。
图7.3为MAX232的常见应用电路图,C1、C2、C3、C4用于电平转换,其典型值为0.1uF。
通过此MAX232电路,S3C4510B的UART0与PC机的串口1建立连接,S3C4510B的UART1与PC机的串口2建立连接。
在具体设计时,经常通过两个跳线选择S3C3410B的UART0或UART1只与PC机的串口1连接,同时设计数据发送与接收的状态指示LED。
当有数据通过串行口传输,LED闪烁,便于用户掌握其工作状态以及进行软、硬件的调试。
图7.3MAX232的常见应用电路图
S3C4510B的UART单元特性包括:
●波特率可编程
●支持红外发送与接收
●1~2个停止位
●5、6、7或8个数据位
●奇偶校验
每一个异步串行通信口都具有独立的波特率发生器、发送器、接收器和控制单元。
波特率发生器可由片内系统时钟MCLK驱动,或由外部时钟UCLK(Pin64)驱动;发送器和接收器都有独立的数据缓冲寄存器和数据移位器。
待发送的数据首先传送到发送缓冲寄存器,然后拷贝到发送移位器并通过发送数据引脚UATXDn发送出去。
接收数据首先从接收数据引脚UARXDn移入移位器,当接收到一个字节时就拷贝到接收缓冲寄存器。
可通过软件控制工作模式的选择、状态和中断产生。
当使用UART的发送中断功能时,应在初始化UART之前先写一个字节数据到UART的发送缓冲寄存器,这样,当发送缓冲寄存器空时就可以产生UART的发送中断。
以下的编程示例完成S3C4510B通过串行口UART0向PC机发送数据,并从其接收数据的编程。
首先使用InitUART()函数设置串口控制寄存器的初始化,设置它的波特率、数据位、停止位、奇偶校验等。
其次使用TxUART()函数发送字符串,依次将每个字符写入发送寄存器等待发送完成。
然后使用RxUART()函数接受数据字符,等待接受寄存器满后在将其存入字符串直到全部完成。
该示例使用S3C4510B的串口UART0设置为19200波特、8位数据、1位停止、无校验。
并向PC机循环发送字符串"CommuncationTestting!
\r\n"。
打开CodeWarriorforARMDeveloperSuite(或ARMProjectManager),新建一个项目,并新建一个文件,名为main.c,具体内容如下:
//*************************************************************
//FileName:
main.c
//Description:
//Date:
//*************************************************************
#defineULCON0(*(volatileunsigned*)0x03FFD000)//UARTchannel0linecontrolregister
#defineUCON0(*(volatileunsigned*)0x03FFD004)//UARTchannel0controlregister
#defineUSTAT0(*(volatileunsigned*)0x03FFD008)//UARTchannel0statusregister
#defineUTXBUF0(*(volatileunsigned*)0x03FFD00c)//UARTchannel0transimit
//holdingregister
#defineURXBUF0(*(volatileunsigned*)0x03FFD010)//UARTchannel0recievebufferregister
#defineUBRDIV0(*(volatileunsigned*)0x03FFD014)//Baudratedivisorregister0
#defineULCON1(*(volatileunsigned*)0x03FFE000)//UARTchannel1linecontrolregister
#defineUCON1(*(volatileunsigned*)0x03FFE004)//UARTchannel1controlregister
#defineUSTAT1(*(volatileunsigned*)0x03FFE008)//UARTchannel1statusregister
#defineUTXBUF1(*(volatileunsigned*)0x03FFE00c)//UARTchannel1transimit
//holdingregister
#defineURXBUF1(*(volatileunsigned*)0x03FFE010)//UARTchannel1recievebufferregister
#defineUBRDIV1(*(volatileunsigned*)0x03FFE014)//Baudratedivisorregister1
voidInitUART(intPort,intBaudrate);
voidTxUART(intPort,char*s);
char*RxUART(intPort,char*s);
intMain()
{
InitUART(0,0x500);//19200bpsCPU工作频率50MHz0=COM1;1=COM2
for(;;)
{
TxUART(0,"CommuncationTestting!
\r\n");
}
return(0);
}
voidTxUART(intPort,char*s)
{
if(Port==0)
for(;*s!
='\0';s++)
{
for(;(!
(USTAT0&0x40)););
UTXBUF0=*s;
}
if(Port==1)
for(;*s!
='\0';s++)
{
for(;(!
(USTAT1&0x40)););
UTXBUF1=*s;
}
}
char*RxUART(intPort)
{
char*s;
if(Port==0)
{
for(;(!
(USTAT0&0x20));s++);
*s=UTXBUF0;
*s='\0';
}
if(Port==1)
{
char*s;
if(Port==1)
{
for(;(!
(USTAT1&0x20));s++);
*s=UTXBUF1;
*s='\0';
}
returns;
}
voidInitUART(intPort,intBaudrate)
{
if(Port==0)
{
ULCON0=0x03;
UCON0=0x09;
UBRDIV0=Baudrate;
}
if(Port==1)
{
ULCON1=0x03;
UCON1=0x09;
UBRDIV1=Baudrate;
}
}
保存main.c,并添加到新建的项目。
此时可对该项目进行编译连接,生成可执行的映象文件,当可执行的映象文件运行时,会不停的向UART0发送字符串“CommuncationTestting!
”。
7.2I2C接口
构造分布式嵌入式系统的网络协议有许多种,如RS-485、I2C总线协议、CAN总线协议、以太网协议等。
实际应用时,根据需要选取所需的协议,来构成嵌入式系统的网络。
本节主要介绍I2C总线技术。
7.2.1I2C接口概述
I2C总线是嵌入式系统中常用的网络接口,它常用于将微控制器连接到系统的总线。
I2CBus(Inter-IntegratedCircuitBus,IIC)是飞利浦公司在20世纪80年代开发出的用于内部I2C器件控制的一种简单两线双向串行总线。
与SPI、MICROWIRE/PLUS接口不同,它是以两根连线实现了完善的全双工同步数据传送,可以极方便地构成多面系统和外围器件扩展系统。
I2C总线采用了器件地址的硬件设置方式,通过软件寻址完全避免了器件的片选线寻址方法,从而使硬件系统具有最简单而灵活的扩展方法。
按照I2C总线规范,总线传输中的所有状态都生成相对应的状态码,系统中的主机能够依照这些状态码自动进行总线管理。
用户只要在程序中装入这些标准处理模块,根据数据操作要求完成I2C总线的初始化,启动I2C总线就能自动完成规定的数据传送动作。
总线上主和从(即发送和接收)的关系不是一成不变的,而是取决于此时数据传送的方向。
I2C总线的数据传送速率在标准工作方式下为100Kbps,快速方式下最高传送速率达400Kbps。
1.I2C总线数据传送格式
在I2C总线上传送信息时的时钟同步信号是由挂接在SCL时钟线上的所有器件的逻辑“与”完成的。
SCL线上由高电平到低电平的跳变将影响到这些器件,一旦某个器件的时钟信号下跳为低电平,则将使SCL线一直保持低电平,使SCL线上的所有器件开始低电平期。
当所有器件的时钟信号都上跳为高电平时,低电平期结束,SCL线被释放返回高电平,即所有的器件都同时开始它们的高电平期。
其后,第一个结束高电平期的器件又将SCL线拉成低电平,这样就在SCL线上产生一个同步时钟。
可见,时钟低电平时间由时钟低电平期最长的器件确定,而时钟高电平时间由时钟高电平期最短的器件确定。
在I2C总线技术规范中,开始和结束信号(也称做启动和停止信号)的定义如图7.4所示。
图7.4开始和结束信号的定义
当时钟线SCL为高电平时,数据线SDA由高电平跳变为低电平,定义为“开始”信号。
当SCL线为高电平时,SDA线发生低电平到高电平的跳变,定义为“结束”信号。
开始和结束信号都是由主器件产生的。
在开始信号以后,总线即被认为处于忙状态;在结束信号以后的一段时间内,总线被认为是空闲的。
在I2C总线开始信号后,送出的第一个字节数据是用来选择从器件地址的。
其中前7位为地址码,第8位为方向位(R/W)。
方向位为“0”表示发送,即主器件把信息写到所选择的从器件;方向位为“1”表示主器件将从从器件读信息。
在I2C总线上每次传送的数据字节数不限,但每一个字节必须为8位,而且每个传送的字节后面必须跟一个认可位(第9位),也叫作应答位(ACK)。
2.I2C总线数据传送过程
I2C总线传送数据时,每次都是先传送最高位,通常从器件在接收到每个字节后都会做出响应,即释放SCL线返回高电平,准备接收下一个数据字节,主器件可继续传送。
如果从器件正在处理一个实时事件而不能接收数据时(例如,正在处理一个内部中断,在这个中断处理完之前就不能接收I2C总线上的数据字节),则可以使时钟SCL线保持低电平,从器件必须使SDA保持高电平,此时主器件产生1个结束信号,使传送异常结束,迫使主器件处于等待状态。
当从器件处理完毕时将释放SCL线,主器件继续传送。
通常被寻址的接收器在接收到的每个字节后,除了用CBU地址开头的报文,必须产生一个响应。
当从机不能响应从机地址时(例如它正在执行一些实时函数不能接收或发送),从机必须使数据线保持高电平。
主机然后产生一个停止条件终止传输或者产生重复起始条件开始新的传输。
如果从机接收器响应了从机地址但是在传输了一段时间后不能接收更多数据字节,主机必须再一次终止传输。
这个情况用从机在第一个字节后没有产生响应来表示。
从机使数据线保持高电平,主机产生一个停止或重复起始条件。
如果传输中有主机接收器,它必须通过在时钟的最后一个字节从机不产生响应来向从机发送器通知数据结束。
从机发送器必须释放数据线,允许主机产生一个停止或重复起始条件。
所有进入I2C总线系统中的器件或MCU都带有I2C总线接口,具有符合I2C总线电气规范的特征,因此不需要另外设计I2C接口,极大地简化了系统的硬件设计。
在I2C总线系统中,每连接的一个I2C接口为1个节点。
节点的数量受两个因素制约:
一是总线电容不得大于400pF,二是节点地址容量。
总线电容过大会造成信号传送失真,最终导致数据传输失败。
3.总线竞争和仲裁机制
总线上可能挂接有多个器件,有时会发生两个或多个主器件同时想占用总线的情况。
当多个主器件同时想占用总线时,如果某个