异步串行接口

2024-10-10

异步串行接口(精选9篇)

异步串行接口 篇1

0 引言

串行通信接口在CPU和外部设备或者微处理器与外设进行通信之间扮演着十分重要的角色。其主要基本功能是在系统总线和I/O设备之间传输信号, 提供缓冲作用, 以满足接口两边的时序要求。传统的异步串行通信接口一般采用专用的接口芯片实现。例如串行通信接口8251A, 而在现代数字系统设计中要求相对较少的芯片的数量以减少其硬件开销、缩小系统体积、降低能源消耗、提高系统的性能和可靠性。因此CPLD的出现, 为异步串行通信接口的设计提供了一种新的途径。CPLD具有高速、成本低廉、设计周期短和应用灵活等特点, 可以实现专用集成电路。本设计通过VHDL语言在CPLD上进行编程实现异步串行接口, 实验表明正确可靠, 灵活性强。

1 异步串行接口的CPLD设计及实现方法

数据传输的通信协议是对数据传输的约定, 包括定时、控制、格式化和数据表示法。串行通信是指数据是一位一位按顺序传送的通信方式, 其突出优点是只需要一对传输线 (利用电话线就可作为传输线) , 这样就大大降低了传送成本, 特别适用于远距离通信。其缺点就是传送速度较低。异步传输是把每个字符看作以个独立的信息, 并且字符出现在数据流中的相对时间是任意的。然而在每个字符中的各位以预定的固定时钟传送。因此其实质是在字符内部是同步的, 而在字符间是异步的。

1.1 CPLD简介

复杂可编程逻辑器件CPLD是一种用户根据各自需要而自行构造逻辑功能的数字集成电路, 其基本设计方法是借助EDA软件, 用原理图、状态机、布尔表达式、硬件描述语言等方法, 生成相应的目标文件, 用编程器和下载电缆用目标器件实现设计的数字系统。在互连特性上, CPLD采用连续互连方式, 即用固定长度的金属线实现逻辑单元之间的互连。这种连续式的互连结构能方便的预测设计的时序同时保证了CPLD的高速性能。CPLD的集成度一般可达数千甚至数万门, 能够实现较大规模的数字逻辑电路集成。其前期设计仿真及配置可以在软件平台上完成, 在很大程度上缩短了电路设计周期。本设计采用的芯片是ALTERA公司的MAX7000系列的EPM7256AETC144-10。

1.2 功能模块的划分

许多外设与计算机或者微处理器是按照串行方式进行通信的, 也就是说数据是按照1位1位进行传输的, 在传输过程中, 每1位数据都占据一个固定的时间长度, 这种情况下, 就要用串行接口把这个外设连接到总线上。具体的说一个接口完成的功能主要包括以下几个方面:寻址、输入/输出、数据转换、联络、中断管理、复位、可编程和错误检测功能。同时在接口设计中, 常常要考虑对错误的检测问题, 包括传输错误和覆盖错误。根据这些特点将其分为六部分:接收移位寄存器、输入锁存器、输入控制逻辑、发送移位寄存器、输出锁存器、输出控制逻辑。其功能框图如图1所示。

其中输入锁存器总是和接收移位寄存器配对使用的, 在输入过程中, 数据1位1位从外设进入接口的移位寄存器, 当接收完1个字符以后, 数据就从移位寄存器送到输入锁存器, 同时发出中断和进行错误检测, 通知微处理器来取走数据和是否发送传输错误。这些都是通过输入控制逻辑来控制完成的。输出过程和输入过程类似, 其输出锁存器和发送移位寄存器配对使用, 当微处理器往输出锁存器中输出1个数据后, 数据便传输到移位寄存器, 然后1位1位的通过输出线送到外设, 同时在输出中加入了起始位、校验位和停止位, 这些都是通过输出控制逻辑控制完成。由此可见发送移位寄存器完成了并/串变换, 而接收移位寄存器完成了串/并变换。

1.3 用VHDL语言设计实现异步串行接口

VHDL语言是超高速硬件描述语言, 其优点:具有更高的抽象级别, 它不仅可以从物理上描述电路, 更可以从逻辑上描述电路的功能。VHDL能支持逻辑单元的重用, 支持类属和带参数过程的函数, 当需要改变电路规模时, 只需要改变类属和参数值即可。VHDL可读性好、可移植性强。这种设计方法的引入使系统硬件的升级实现了软件化。

异步串行的数据格式是第一位为起始位 (低电平) , 接下来为5-8个信息位 (由低到高排列) , 信息位后面是校验位, 可设置成奇校验或偶校验。最后的数位为1, 作为停止位。

按照自上而下的设计方法可以将此异步串行接口划分成两个功能模块:接收模块和发送模块。接收模块主要完成将串行的输入数据变成并行的数据, 然后通知微处理器将其读走。在接收线上未出现下降沿时, 接收模块一直处于空闲状态, 一旦出现下降沿, 接收模块进入捕获状态, 寻找正确的起始位, 如果检测到起始位, 则进入移位模式, 如果没有找到正确的起始位, 则返回空闲状态。在接收数据的同时进行奇偶校验和错误检测。当接收到一个完整的数据帧时, 接收模块又返回到空闲状态。复位信号可使接收模块进入空闲状态。因此整个接收过程可分为三个状态:空闲、捕获和移位。

在空闲状态时, 接收移位寄存器全部置1, 接收模块一直在检测输入线是否有表明有新数据帧的下降沿。为了确保不接收到错误的数据, 内部波特率时钟产生器被禁止。在捕获状态时, 当输入数据线出现下降沿, 接收模块开始寻找正确的起始位, 为了正确的采样起始位和接下来的数据位, 应该在其各自的中点进行采样。从而阻止了在接收过程中噪声的干扰。一旦找到了起始位, 则内部波特率时钟开始计数, 产生接收时钟rxclk, 其上升沿同步于起始位的中点。在移位状态时, 在rxclk上升沿的控制下, 数据从接收线上移位进入接收移位寄存器, 并且进行奇偶校验, 当起始位进入移位寄存器第0位时, 下一个rxclk的上升沿将使接收模块进入空闲状态, 并且不产生rxclk。移位完而进入空闲状态后, 移位寄存器中的内容被加载到输入锁存器中, 并产生rxrdy信号以通知锁存器中有新数据, 微处理器可来读取。当接收的数据帧的停止位不为1时, 就会产生帧错误信号frameerr。当接收移位寄存器移入新数据而输入锁存器中的数据仍未被读出时, 就会产生覆盖错误信号, 其数据不会被加载到锁存器中。

发送模块主要完成将并行的数据转换为串行的数据输出, 并加上起始位、校验位和停止位。其过程可分为:空闲、加载和移位。在空闲状态时, 串行输出线输出为高电平状态, 发送模块等待将新数据写入输出锁存器。一旦传输完成和要发送的数据准备好后, 发送模块进入加载模式。在加载模式时, 锁存器中的数据被加载到移位寄存器。同时移入标志位以监视数据的发送过程。起始位首先被输出到输出线上, 当移位寄存器被成功加载时, 会发出中断txrdy, 表明开始传输并且输出锁存器中又可以写入新数据。在移位状态时, 在发送时钟上升沿的控制下数据由移位寄存器发送至输出线。而移位寄存器由0来填充。同时产生校验位。

按照上述对接收和发送模块的状态描述, 通过VHDL语言编程设计出如图2所示的功能模块。

2 仿真结果

本设计采用了波特率因子为16, 即其主时钟的频率是串行速率的16倍。其仿真结果如图3所示。测试时, 接收的数据用来发送。假设接收的第1个数据为F5h, 其在串行线上的格式为:“01010111101”, 采用了偶校验, 则其校验位应为0, 发送是“01010111101”即数据位为F5h, 并且奇偶校验输出上未出现高电平, 即没传输错误。同时在数据接收完时, rxrdy变为高电平, 用来向微处理器发出中断, 通知其可来将数据读走。当微处理器发出read信号时, rxrdy又置于低电平。假设第2个接收数据为F0h, 其在串行线上的格式为应为“01111000001”, 而此接收为“01111000011”, 因此在parityerr上出现了高电平, 出现了传输错误。在发送时, 当微处理器发出写 (write) 信号时, txrdy变为高电平, 当输出线tx上开始发送时, txrdy变为低电平, 表明又可以向输出锁存器中写入数据。最后通过编程下载到芯片中, 从而完成了设计。

3 结论

采用CPLD可编程芯片实现异步串口功能, 取代了专用的异步串口芯片, 使电路设计更加灵活、方便、简洁。减少其硬件开销、缩小系统体积、降低功耗、提高系统的性能和可靠性。因此CPLD的出现, 为异步串行通信接口的设计提供了一种新的途径。S

参考文献

[1]徐飞.EDA技术与实践[J].清华大学出版社, 2011.

[2]罗苑棠.CPLD/FPGA常用模块与综合设计实例精讲[M].电子工业出版社, 2007.

异步串行接口 篇2

摘 要 本文说明了异步串行通信(RS-232)的工作方式,探讨了查询和中断两种软件接口利弊,并给出两种方式的C语言源程序。

的I/O通道之一,以最简单方式组成的串行双工线路只需两条信号线和一条公共地线,因此串行通信既有线路简单的优点同时也有它的缺点,即通信速率无法同并行通信相比,实际上EIA RS-232C在标准条件下的最大通信速率仅为20Kb/S。

尽管如此,大多数外设都提供了串行口接口,尤其在工业现场RS-232C的应用更为常见。IBM PC及兼容机系列都有RS-232的适配器,操作系统也提供了编程接口,系统接口分为DOS功能调用和BIOS功能调用两种:DOS INT 21H的03h和04h号功能调用为异步串行通信的接收和发送功能;而BIOS INT 14H有4组功能调用为串行通信服务,但DOS和BIOS功能调用都需握手信号,需数根信号线连接或彼此间互相短接,最为不便的是两者均为查询方式,不提供中断功能,难以实现高效率的通信程序,为此本文采用直接访问串行口硬件端口地址的方式,用C语言编写了串行通信查询和中断两种方式的接口程序。

1.串行口工作原理

微机串行通信采用EIA RS-232C标准,为单向不平衡传输方式,信号电平标准±12V,负逻辑,即逻辑1(MARKING)表示为信号电平-12V,逻辑0(SPACING)表示为信号电平+12V,最大传送距离15米,最大传送速率19.6K波特,其传送序列如图1,平时线路保持为1,传送数据开始时,先送起始位(0),然后传8(或7,6,5)个数据位(0,1),接着可传1位奇偶校验位,最后为1~2个停止位(1),由此可见,传送一个ASCII字符(7位),加上同步信号最少需9位数据位。

@@T8S12300.GIF;图1@@

串行通信的工作相当复杂,一般采用专用芯片来协调处理串行数据的发送接收,称为通用异步发送/接收器(UART),以节省CPU的时间,提高程序运行效率,IBM PC系列采用8250 UART来处理串行通信。

在BIOS数据区中的头8个字节为4个UART的端口首地址,但DOS只支持2个串行口:COM1(基地址0040:0000H)和COM2(基地址0040:0002H)。8250 UART共有10个可编程的单字节寄存器,占用7个端口地址,复用地址通过读/写操作和线路控制寄存器的第7位来区分。这10个寄存器的具体功能如下:

COM1(COM2) 寄存器

端口地址 功能 DLAB状态

3F8H(2F8H) 发送寄存器(写) 0

3F8H(2F8H) 接收寄存器(读) 0

3F8H(2F8H) 波特率因子低字节 1

3F9H(2F9H) 波特率因子高字节 1

3F9H(2F9H) 中断允许寄存器 0

3FAH(2FAH) 中断标志寄存器

3FBH(2FBH) 线路控制寄存器

3FCH(2FCH) MODEM控制寄存器

3FDH(2FDH) 线路状态寄存器

3FEH(2FEH) MODEM状态寄存器

注:DLAB为线路控制寄存器第七位在编写串行通信程序时,若采用低级方式,只需访问UART的.这10个寄存器即可,相对于直接控制通信的各个参量是方便可靠多了。其中MODEM控制/状态寄存器用于调制解调器的通信控制,一般情况下不太常用;中断状态/标志寄存器用于中断方式时的通信控制,需配合硬件中断控制器8259的编程;波特率因子高/低字节寄存器用于初始化串行口时通信速率的设定;线路控制/状态寄存器用于设置通信参数,反映当前状态;发送/接收寄存器通过读写操作来区分,不言而喻用于数据的发送和接收。

UART可向CPU发出一个硬件中断申请,此中断信号接到中断控制器8259,其中COM1接IRQ4(中断OCH),COM2接IRQ3(中断OBH)。用软件访问8259的中断允许寄存器(地址21H)来设置或屏蔽串行口的中断,需特别指出的是,设置中断方式串行通信时,MODEM控制寄存器的第三位必须置1,此时CPU才能响应UART中断允许寄存器许可的任何通信中断。

2.编程原理

程序1为查询通信方式接口程序,为一典型的数据采集例程。其中bioscom函数初始化COM1(此函数实际调用BIOS INT 14H中断0号功能)。这样在程序中就避免了具体设置波特率因子等繁琐工作,只需直接访问发送/接收寄存器(3F8H)和线路状态寄存器(3FDH)来控制UART的工作。线路状态寄存器的标志内容如下:

第0位 1=收到一字节数据

第1位 1=所收数据溢出

第2位 1=奇偶校验错

第3位 1=接收数据结构出错

第4位 1=断路检测

第5位 1=发送保存寄存器空

第6位 1=发送移位寄存器空

第7位 1=超时

当第0位为1时,标志UART已收到一完整字节,此时应及时将之读出,以免后续字符重叠,发生溢出错误,UART有发送保持寄存器和发送移位寄存器。发送数据时,程序将数据送入保持寄存器(当此寄存器为空时),UART自动等移位寄存器为空时将之写入,然后把数据转换成串行形式发送出去。

本程序先发送命令,然后循环检测,等待接收数据,当超过一定时间后视为数据串接收完毕。若接收到数据后返回0,否则返回1。

若以传送一个ASCII字符为例,用波特率9600 b/s,7个数据位,一个起始位,一个停止位来初始化UART,则计算机1秒可发送/接收的最大数据量仅为9600/9=1074字节,同计算机所具有的高速度是无法相比的,CPU的绝大部分时间耗费在循环检测标志位上。在一个有大量数据串行输入/输出的应用程序中,这种消耗是无法容忍的,也不是一种高效率通信方式,而且可以看到,在接收一个长度未知的数据串时,有可能发生遗漏。

程序2是一组中断方式通信接口程序。微机有两条用于串行通信的硬件中断通道IRQ3(COM2)和IRQ4(COM1),对应中断向量为OBH和OCH,可通过设置中断屏蔽寄存器(地址21H)来开放中断。置1时屏蔽该中断,否则开放中断。硬件中断例程必须在程序末尾往中断命令寄存器(地址20H)写入20H,即

MOV AL, 20H

OUT 20H, AL用以将当前中断服务寄存器清零,避免中断重复响应。

每路UART有4组中断,程序可通过中断允许寄存器(3F9H)来设置开放那路中断。这4组中断的位标志如下:

第0位 1=接收到数据

第1位 1=发送保持寄存器为空

第2位 1=接收数据出错

第3位 1=MODEM状态寄存器改变

第4~7位为0

在中断例程中检查UART的中断标志寄存器(3FAH),确定是哪一组事件申请中断。该寄存器第0位为0时表示有中断申请,响应该中断并采取相应措施后,UART自动复位中断标志;第2,1位标志中断类型,其位组合格式如下:代码 中断类型 复位措施11接收出错读线路状态寄存器10接收到数据读接收寄存器01发送寄存器空输出字符至发送寄存器00MODEM状态改变读MODEM状态寄存器这4组中断

的优先级为0号最低,3号最高。

在本组程序中,函数setinterrupt()和clearinterrupt()设置和恢复串行通信中断向量;cominit()初始化指定串行口并开放相应中断;sendcomdata()和getcomeomdata()用于发送和接收数据串;com1()和com2()为中断例程,二者均调用fax2()函数,fax2()函数为实际处理数据接收和发送的例程。明确了串行口的工作原理,就不难理解其具体程序。

3.结论

上述程序采用C语言编写,在BORLAND C++2.0集成环境中调试通过,为简单起见,只考虑了使用发送/接收两条信号线的情况,并未考虑使用握手信号线。

在实际应用中这两组程序尚有一些可修改之处。比如,中断接收程序中的缓冲区可改为循环表,以防数据溢出,尽可能保留最新数据。由于笔者水平所限,文中不足疏漏之处尚希行家指正。

程序1:

static int receive_delay=10000;

int may(unsigned par,char *comm,char *ss)

{int cs=0,j=0;

char *p;

bioscom(0,par,0); //com1

loop:p=comm;

inportb(0x3f8); //reset

do{ while((inportb(0x3f8+5)&0x20)==0); outportb(0x3f8,*p++);

}while(*p); //send command

os=0;j=0;

do{ if((inportb(0x3fd)&0x01)==0)

if(os〉receive_delay) break;

else { cs++;

continue; } ss[j++]=inportb(0x3f8); cs=0;

}while(l);

ss[j]=';

if(j) return 0;

else return 1;

程序2:

#include

#include

#include

#include

#inolude

#define maxsize 4096

#define SEND 2

#define RECEIVE 1

#define COM1 0

#define COM2 1

static unsigned char Hardinterrupt=0;

struct ComInterrupt

{int portadd;

int intbit;

char buf[maxsize],*comm;

int bufh,recount,sendcount;

}com[2]={{0x3f8,0x0c,”“,”“,0,0,0},

{0x2f8,0x0b,”“,”“,0,0,0} };

void static interrupt (*old_com[2])(void);

vold interrupt coml(vold);

void interrupt com2(void);

void fax2(int comnum);

void setinterrupt(int comnum);

void clearinterrupt(int comnum);

void cominit(int comnum, int para, int interruptmark);

void sendcomdata (int comnum,char *command);

int getcomdata (int comnum, char *buf);

void interrupt com1(void)

{fax2(0);}

void interrupt com2(void)

{fax2(1);}

// set cominterrupt, comnum 0=com1, 1=com2

void setinterrupt (int comnum)

{

old_com[comnum]=getvect(com[comnum].intbit);

if (!oomnum)

setvect(com[comnum].intbit,coml); //com1

else

setvect(com[comnum].intbit,com2); //com2

//set hard int

Hardinterrupt = inportb(0x21);

if(comnum)

outportb(0x21,Hardinterrupt&0xf7); //com2 ,0

else

outportb(0x21,Hardinterrupt&0xef); //com1 0,

}

void clear interrupt(int comnum)

{

if(comnum)

outportb(0x21,Hardinterrupt | 0x08); //COM2

else

outportb(0x21,Hardinterrupt|0x10); //COM1

setvect(com[comnum].intbit,old_com[comnum]);

for( i=0;i

com[comnum].sendcount=com[comnum].recount=com[comnum].bufh=0;

outportb(com[comnum].portadd+1,0);

outportb(com[comnum].por tadd+4,0x0);

}

void fax2(int i)//i=o,com1; i=1, com2

{ unsigned char mark;

mark=inport(com[i].portadd+2);

do

{

if(mark&0x4)// receive data

{ if (com[i].bufh==maxsize)

com[i].bufh=0; com[i].buf[com[i].bufh++]=inportb(com[i].portadd); com[

i].recount++;}

else if(mark&0x2)// send command

{ if(*com[i].comm)

outportb(com[i].p

ortadd,*com[

i].comm++);

com[i],sendcount++;}

else

outportb(com[i].portadd+1,1);

}

}while ((mark=inport([1]. portadd+2))!=1);

outportb(ox20,0x20); //hard int return

}

// interruptmark 1= reoeive, 2=send, 3=rec&send

void comint(int com, char para, int interruptmark)

{

bioscom(0, par, com);

//open com interrupt

outportbv (com[comnum]. portadd+4,0x8;

outportb (com[comnum].portadd+1,interruptmark);

}

void sendcomdata(int comnum,char * command)

{ unsigned char interruptmark;

com[comnum],comm=command;

com[comnum],sendcount=0;

//set send interrupt

interruptmark=inportb (com[comnum].portadd_1);

outportb (com[comnum].portadd+1.(interruptmark|2));

}

//get com_receivedate and clear com_receivebuf,

int getcomdata (int comnum, char * buf)

{ int result=com[comnum]. recount,i:

if(buf)

strncpy(buf,com[comnum].buf,com

[comnum].bufh);

buf[com[comnum].bufh]=" ;

com[comnum].recount=com [comnum].bufh=0;

retun(result);

基于CPLD的异步串行通信设计 篇3

由于许多微处理器都没有异步串行口, 为了实现异步串行通信, 需要使用专用串行通信芯片, 电路设计比较复杂。随着复杂可编程逻辑器件 (CPLD) 的发展, 按照异步串行通信的协议, 采用VHDL语言编程, 可以将异步串行通信功能集成到CPLD内, 也就是用软件的方法实现硬件的功能, 既减少了元器件数量、简化了电路, 又提高了设计的可靠性。软件编程采用的VHDL硬件描述语言, 设计灵活, 调试简单, 可以先通过计算机进行仿真, 再投入实际使用, 可大大降低设计的风险性。

1 异步串行通信基本原理

所谓异步串行通信是指具有不规则数据段传送特性的串行数据传输。异步通信数据帧的第一位是起始位, 在通信线上没有数据传送时处于逻辑“1”状态。当发送设备要发送一个字符数据时, 首先发出一个逻辑“0”信号, 这个逻辑低电平就是起始位。起始位通过通信线传向接收设备, 当接收设备检测到这个逻辑低电平后, 就开始准备接收数据位信号。因此, 起始位所起的作用就是表示字符传送开始。当接收设备收到起始位后, 紧接着就会收到数据位。数据发送完之后, 可以发送奇偶校验位。奇偶校验位用于有限差错检测, 通信双方在通信时需约定一致的奇偶校验方式。就数据传送而言, 奇偶校验位是冗余位, 但它表示数据的一种性质, 这种性质用于检错, 虽有限但很容易实现。在奇偶位或数据位之后发送的是停止位。停止位是一个字符数据的结束标志。

2 复杂可编程逻辑器件 (CPLD)

复杂可编程逻辑器件—CPLD (Complex Programmable Logic Device) , 是从PAL的GAL器件发展出来的器件, 相对而言规范大, 结构复杂, 属于大规模集成电路范围。是一种用户根据各自需要而自行构造逻辑功能的数字集成电路。其基本设计方法是借助集成开发软件平台, 用原理图、硬件描述语言等方法, 生成相应的目标文件, 通过下载电缆将代码传送到目标芯片中, 实现设计的数字系统。

3 VHDL语言

VHDL的英文全名是Very-High-Speed Integrated Circuit Hardware Description Language, 诞生于1982年。1987年底, VHDL被IEEE和美国国防部确认为标准硬件描述语言。VHDL主要用于描述数字系统的结构、行为、功能和接口。除了含有许多具有硬件特征的语句外, VHDL的语言形式、描述风格和句法十分类似于一般的计算机高级语言。

4 异步串行通信设计

4.1 总体框图

本设计规定的数据帧格式为:1位起始位, 8位数据位, 1位停止位, 无校验位;波特率为9600bps;系统时钟频率为1.8432MHz。程序主要包括波特率发生器、发送电路和接收电路三个部分。程序的功能框图如图1所示。

4.2 波特率发生器

波特率发生器实际上就是一个分频器, 主要是根据要求的串行口波特率, 将系统时钟进行分频, 分别产生发送时钟和接收时钟。发送时钟的频率与串行口波特率相同。由于串行数据帧与接收时钟是异步的, 为了实现接收时钟与接收数据帧的同步, 需要采用高速率时钟对接收数据进行采样, 一般选择16倍于波特率的时钟频率作为接收时钟。本设计中, 系统时钟 (1.8432MHz) 12次分频后得到接收时钟 (153600Hz) , 再将接收时钟16次分频后得到发送时钟 (9600Hz) 。

4.3 发送电路

4.3.1 发送电路原理

发送电路相对比较简单, 当有发送请求时, 按照发送时钟的时序, 在上升沿时刻依次发送起始位、8位数据和停止位。需要说明的是, 8位数据的发送顺序是先发送低位后发送高位。发送电路的时序图如图2所示。

4.3.2 发送电路设计

发送电路采用Moore型状态机的方式设计, 包括:空闲、发送起始位、发送数据位和发送停止位四个状态。发送电路的状态图如图3所示。

空闲状态:初始状态为空闲状态, 只有在空闲状态下, 才能检测是否有发送请求, 当检测到有发送请求时, 将8位数据装入发送移位寄存器, 进入发送起始位状态。

发送起始位状态:发送一位起始位, 进入发送数据位状态。

发送数据位状态:依次发送8位数据, 当8位数据全部发送完成后, 进入发送停止位状态。

发送数据位状态:发送一位停止位, 表示一帧数据发送完成, 再次进入空闲状态。

4.4 接收电路

4.4.1 接收电路原理

接收时钟在每个时钟周期都对接收数据进行采样, 当检测到当前数据位为“0”而前一个数据位为“1”时, 即表示检测到了起始位。为了保证读取数据的可靠性, 每个数据位均在中间点进行采样, 在检测到起始位后, 延迟8个接收时钟周期, 开始依次读取起始位、数据位和停止位, 两次读取的间隔为16个接收时钟周期。为了能够接收连续两帧数据中的后一帧, 读取到停止位的下一个时钟周期 (而不是延迟8个时钟周期) 即开始检测起始位。接收电路的时序图如图4所示。

4.4.2 接收电路设计

接收电路同样采用Moore型状态机的方式设计, 包括:空闲、接收起始位、接收数据位和接收停止位四个状态。接收电路的状态图如图5所示。

空闲状态:初始状态为空闲状态, 不断对数据进行采样, 检测起始位, 一旦检测到起始位, 即进入接收起始位状态。

接收起始位状态:接收一位起始位, 并对起始位的有效性进行判别, 若为虚假起始位, 则返回空闲状态, 若确认起始位有效, 则进入接收数据位状态。

接收数据位状态:依次接收8位数据, 当8位数据全部接收后, 进入接收停止位状态。

接收停止位状态:接收一位停止位, 表示一帧数据接收完成, 将8位数据送接收缓存, 再次进入空闲状态。

5 结语

本文对异步串行通信的工作原理、电路设计进行了分析, 采用VHDL语言编程, 在CPLD上实现了异步串行通信功能。该设计为固定波特率和数据帧结构, 无需微处理器进行额外设置, 操作简单, 使用方便。在实际工程应用中, 还可以根据需求, 在此基础上增加波特率设置、数据帧结构设置、地址译码等电路, 实现多路、波特率和数据帧结构可设置的异步串行通信。

摘要:异步串行通信技术在电子通信设备中被广泛使用。随着复杂可编程逻辑器件 (CPLD) 的发展, 按照异步串行通信的协议, 采用VHDL语言编程, 可以将异步串行通信功能集成到CPLD内, 也就是用软件的方法实现硬件的功能, 既减少了元器件数量、简化了电路, 又提高了设计的可靠性。

异步串行接口 篇4

关键词:串行Flash存储器接口AT45DB161B

1概述

Flash存储器按其接口可分为串行和并行两大类。串行Flash存储器大多采用I2C接口或SPI接口进行读写;与并行Flash存储器相比,所需引脚少、体积小、易于扩展、与单片机或控制器连接简单、工作可靠,所以串行Flash存储器越来越多地用在各类电子产品和工业测控系统中。

DataFlash是美国Atmel公司新推出的大容量串行Flash存储器产品,采用NOR技术制造,可用于存储数据或程序代码,其产品型号为AT45DBxxxx。此系列存储器容量较大,从1Mb~256Mb;封装尺寸小,最小封装型式(CBGA)尺寸为6mm×8mm;采用SPI接口进行读写,硬件连线少;内部页面尺寸较小,8Mb容量的页面尺寸为264字节,16Mb和32Mb容量的页面尺寸为512字节,64Mb容量的页面尺寸为1056字节,128Mb容量和256Mb容量的页面尺寸为2112字节。另外,AT45DBxxxx系列存储器内部集成了两个与主存页面相同大小的SRAM缓存,极大地提高了整个系统的灵活性,简化了数据的读写过程。此外,AT45DBxxxx系列存储器工作电压较低,只需2.7~3.6V;整个芯片的功耗也较小,典型的读取电流为4mA,待机电流仅为2μA。所有这些特点使得此系列存储器非常适合于构成微型、低功耗的测控系统。笔者就使用AT45DB161B存储器和PIC16LC73B单片机及微型压力传感器构成了用两片纽扣电池驱动的微型压力测量装置,其外形尺寸仅为φ10mm×20mm。

2芯片简介

2.1引脚排列和功能

AT45DB161B为DataFlash系列中的中档产品,单片容量为16Mb。其引脚排列如图1所示,引脚功能如表1所列。

表1AT45DB161B引脚功能

引脚名称功能描述CS片选SCK串行时钟SI串行输入SO串行输出WP页面写保护RESET复位RDY/BUSY准备好/忙NC未使用

2.2芯片内部逻辑结构

AT45DB161B的内部逻辑结构分为三个部分:存储器页阵列(主存)、缓存与I/O接口。AT45DB161B的存储页面大小为528字节,整个存储器共分为4096页,片内集成了两个528字节的SRAM缓存,内部逻辑结构如图2所示。

3存储器读写接口

3.1SPI接口及操作模式

AT45DB161B存储器采用SPI接口进行读写。SPI接口是一种通用串行接口总线,字长为8位,用来与外部设备(例如EEPROM、A/D转换器等)进行通信。SPI接口利用SCK、SI和SO三根线进行数据的读/写。其中,SCK为时钟信号,SI和SO为数据输入和输出线。AT45DB161B的SCK引脚的时钟信号必须由外部单片机或控制器输入,读/写命令字由SI引脚输入,数据由SO引脚输出。

SPI接口共有四种操作模式,分别为0、1、2和3。SPI操作模式决定了设备接收和发送数据时的时钟相位和极性,即决定了时钟信号的上升和下降沿与数据流行方向之间的.关系,如图3所示。

DataFlash系列存储器仅支持使用得最为广泛的SPI模式0和3。在这两种模式下,SCK信号的上升沿触发数据输入,下降沿触发数据输出。二者的区别是SCK信号的起始电平不同。

3.2存储器命令接口与状态机

除了基本存储单元外,DataFlash系列存储器内部还包括命令用户接口CUI(CommandUserInterface)和状态机。CUI接收用户软件的操作命令,将其翻译成状态机内部操作码并进行命令的有效性检验。状态机控制存储器所有的内部操作,包含一个8位的状态寄存器(statusregister),用来指示设备的操作状态。向存储器输入读状态寄存器命令可将状态寄存器的数据从最高位开始依次读出。状态寄存器各位的意义如表2所列。

表2状态寄存器各位定义

位7位6位5位4位3准备好/忙比较容量位2位1位0将来使用

3.3存储器操作命令及其模式

微处理器串行Flash接口设计 篇5

在微处理器系统中使用Flash存储器,可以有效地将微处理器系统的灵活性和大容量存储的特性结合起来[1],用简单的设计完成复杂的任务。8位微处理器需要一种高效的数据总线来完成它与Flash之间的大量数据传送,SPI总线由于占用的接口总线少,通信效率高并且大部分处理器芯片都支持,因而通过它实现通信是一种理想的设计方案。目前的工作,多是针对于自带SPI接口的单片机与Flash的通信,还有一部分是针对不带SPI接口的微控制器,利用微控制器的I/O口结合软件模拟SPI时序实现了微控制器[2]与Flash之间的通信。基于这种情况,该文提出了微处理器串行Flash接口设计,利用微处理器的外部RAM结合软件控制来模拟SPI时序,实现Flash存储器和微处理器之间的通信。结果证明,这种方案使两者之间通信更简便迅捷。

1 系统介绍

整个系统由8位微处理器[3,4]、SPI串行总线接口、外围设备Flash组成,8位微处理器发起Flash的读写指令及地址、SPI工作使能信号和时钟,因此在系统中起着核心控制作用。

SPI总线是一个同步串行接口的数据总线,它具有全双工、信号线少、协议简单等优点,由于串行总线的信号线比并行总线更少更简单,越来越多的系统放弃使用并行总线而采用串行总线。SPI总线最典型的应用就是主机与外围设备(如Flash、RAM、A/D转换器、LED显示器、实时时钟等)之间的通信。串行外围接口一共有4种操作模式,这些模式决定了利用时钟信号的哪个沿来控制数据传送,这些模式由CPU来设置[5]。SST25系列的Flash支持SPI模式0和3,该文中SPI采用模式0,在时钟信号的上升沿捕获数据,下降沿移出数据。SPI接口一般使用4条线:串行时钟线SCK、主机输入/从机输出数据线SI、主机输出/从机输入数据线SO和低电平有效的从机选择线SCS,其时序图如图1所示。

本系统中Flash采用的是SST25系列SST25VF064C串行Flash,该片具有与工业标准SPI接口兼容的外部引脚,工作电压为2.7-3.6v,它通过SCK、SO、SI、CE等四个管脚作为数据的读写,可以减少控制IO的数量。

2 系统结构及设计

2.1 结构框图

系统的结构框图如图2所示。

8位微处理器与SPI之间有7根信号线连接,分别是exram_cs、exramaddr、exramrd_enb、exramwr_enb、rstb、osc、databus,它们的定义如下。

exram_cs:外部数据RAM片选信号,低有效;

exramaddr:外部数据RAM地址口;

exramrd_enb:外部数据RAM读使能,低有效;

exramwr_enb:外部数据RAM写使能,低有效;

rstb:8位微处理器输出的复位信号,低有效;

osc:8位微处理器时钟;

databus:数据总线。

SPI与Flash之间有5根信号线,分别是SO、SI、SCK、RST、SCS,它们的定义如下。

SCK:同步时钟信号,用来同步SPI和Flash的数据传输,由SPI控制输出,Flash在SCK的边沿接收和发送数据;

SO:SPI输出Flash输入信号,主机在下降沿通过该信号线发送数据给Flash,Flash在上升沿通过该信号线接收该数据;

SI:SPI输入Flash输出信号,Flash在下降沿通过该信号线发送数据给SPI,SPI在上升沿通过该信号线接收该数据;

SCS:Flash片选信号,由主机控制输出,低有效。

2.2 硬件设计

2.2.1 SPI接口系统框图

考虑到SPI的数据传输速度和8位微处理器总线速度不同,为了与8位微处理器总线速度匹配,对应发送和接收功能各需要一个FIFO模块[6],用于读写操作时缓存数据,一个发送FIFO(TxFIFO)和一个接收FIFO(RxFIFO)。发送数据时,TxFIFO将CPU发送的数据作缓存,然后通过SPI接口的SO线发出去,接收数据时,RxFIFO把接收SI的数据作缓存,再通过8位微处理器指令来读取RxFIFO的数据。用TxFIFO的原因是8位微处理器的速度比SPI快,需要把8位微处理器发出的数据做缓存。用RxFIFO是为了匹配8位微处理器指令的时序,8位微处理器指令有固定的时序周期,用8位微处理器指令从Flash取数据时,把RxFIFO假设成外部RAM并分配相应的地址,这样就能顺利取出数据。SPI接口系统框图如图3所示。

2.2.2 SPI的作用

本系统中SPI作为主机与Flash之间的媒介实现了8位微处理器与Flash连接。系统中SPI主要完成以下工作:1)将8位微处理器发送的八位并行数据存放在发送FIFO(TxFIFO)中,当TxFIFO非空时取出TxFIFO中的数据,并转换成串行数据发送给Flash;2)接受Flash传送过来的串行数据,将其转换成并行数据存放于接收FIFO(RxFIFO)中,等待8位微处理器用指令取走;3)产生Flash所需要的输入信号,时钟SCK,片选SCS。

2.2.3 各个模块的实现

TxFIFO和RxFIFO的设计完全一样,采用的是深度为128,位宽为8的FIFO。每一次写操作使写指针加1,每一次读操作使读指针加1。FIFO非空就可以进行读操作,非满时就可以进行写操作。FIFO的设计图如图4。

SPI主要是一个状态机,本设计采用5个状态,传输的数据位数是8位数据。在数据串并转换的过程中,用到两个移位寄存器来存放临时数据,1个发送寄存器txreg,1个接收寄存器rxreg。在SPI总线中,每发送1个数据位则发送寄存器多出1个空闲位,正好可以在半个周期后用来接收1个数据位。状态机如图5所示。

状态机中,sel_SPI信号控制状态机运行,ena对时钟进行分频,ena有效,SCK取反,clkcnt是对主机时钟的分频计数器。复位时在idle状态,当检测的TxFIFO非空时就进入load_data状态,在load_data状态移位寄存器txtreg从TxFIFO中取出第一个八位数据,开始在Spi_tx和Spi_rx状态交替,按照SPI时序进行发送和接受数据,同时还设了两个计数器,用来控制移位寄存器在Spi_rx状态载入数据。

2.3 软件程序设计

8位微处理器给SPI分配了三个外部ram地址,分别为18H,19H,20H三个地址,其中18H分配给TxFIFO,20H分配给RxFIFO,19H用来控制SPI_core状态机的运行,19H中存入00H表示状态机开始工作,存入ffH状态机停止工作,存入01H表示要对Flash进行读操作。

SST25VF064C的内部设计用指令进行读写操作,每一条命令执行都是先输入八位的操作码,然后地址、数据,地址和数据根据指令要求输入。写使能指令WREN必须在任何写之前执行。指令的执行是以片选信号SCS拉低作为开始,SCS拉低以后在每个SCK的上升沿接受一位数据输入,指令以SCS拉高作为结束标志。对SST25VF064C进行读写操作时,地址指针会以输入地址为基址自动递增。

假设要往Flash地址000001H写入66H,000002H中写入55H两个数据,应先设定外部ram地址18H,即把数据存入到TxFIFO中,然后往TxFIFO中依次存入写使能指令06H、写操作码02H,地址000001H,数据66H、55H。写操作程序如下:

程序中wait1的作用是等待写使能指令WREN执行完,SPI状态机停止工作,把SCS拉高。wait2作用是再次开启状态机开始写操作,wait3作用是等待写指令执行完,通过控制状态机把SCS拉高。

假设要从Flash地址000001H、000002H读出两个数据,应先设定外部ram地址18H,即把数据存入到TxFIFO中,然后往TxFIFO中依次存入读指令03H,地址000001h。等把数据读到RxFIFO以后再通过8位微处理器指令把数据从RxFIFO中读到微处理器的acc寄存器中。读操作程序如下:

wait4的作用为开启SPI状态机,wait5的作用是等待所需的66H、55H读出以后结束读指令。

3 设计实现及其仿真波形

通过编写测试平台,并使用Mentor Graphics公司的仿真工具ModelSIm SE 6.5c对该系统进行仿真,得到的仿真波形如图6所示。

从图中可以看到写指令执行完,把数据66H、55H写到Flash中,读指令执行完把数据66H、55H读到了CPU的寄存器中。综合以上分析,SPI的设计是正确的。

4 结束语

该文中的接口设计能够完成微处理器对Flash读写操作,说明该接口电路与软件设计是成功的。数据量和运算量的增大已成为各种微机控制系统面临的共同挑战,在不改变原有体系结构的基础上,采用大容量存储器,在当前是一种简便可行的办法。该文中的微处理器串行Flash接口设计,可用于扩展系统存储容量满足信息时代频繁的信息集成与交互,还可通过复制微处理器发送的数据到验证发送到外围器件的数据正确性,同时还对不带接口的单片机读写芯片提供一定的参考。

参考文献

[1]刘文洲,王贤勇,任纪川,等.Flash存储器及其MCS-51系统中的应用[J].长春工程学院学报:自然科学版,2005(1):57-60.

[2]夏宇闻.Verilog数字系统设计教程[M].北京:北京航空航天大学出版社,2008.

[3]何立民.单片机应用系统设计[M].北京:北京航空航天大学出版社,1990.

[4]窦振中.单片机外围器件实用手册:存储器分册[M].北京:北京航空航天大学出版社,2000.

[5]何最红,张辉.TMS320C5402与单片机SPI串口通信的实现方法[J].国外电子测量技术,2005,24(2):4-6.

异步串行接口 篇6

在工业控制领域中,串行通信以其传输距离长,数据可靠性高、便于总线化等优点,一直是设备与上位机或者设备与设备间通信的主要接口。传统的上位机和工控设备之间的串行通信主要是依靠开发环境的串行通信控件来实现的,而这些控件是封装好的,在使用简便的同时却失去了操作的灵活性,或者单独使用复杂的WindowsAPI 函数。那么这两者对多线程串行通信都是不理想的,为此本文讨论了基于VC开发环境的异步串行通信动态链接库的开发、设计过程,基于本文的动态链接库,在开发的监控安防项目中上位机访问组网的控制器时,工作良好。

1 DLL原理

动态链接库是一种基于Windows的模块化的程序[1],它不但包含可执行的程序代码,并且还有数据,各种资源,因而扩大了库文件的应用领域。在进行大型程序设计时,利用DLL可将系统程序分解成一系列的主程序和DLL,进而减少开发工作量的工作环境;而且由于程序复用模块的减少,那么访问的速度可以得到大幅度的提高;另外,若基层程序的某个部分改变了,上层应用程序不用改动,只修改相应的DLL文件就可以了。

当应用程序使用DLL文件时,并不是将库代码里的DLL文件复制,而是在应用程序中记录动态链接库文件函数的入口点和接口,当应用程序执行到DLL文件时,才将DLL里面的文件代码载入内存,不管多少应用程序用DLL,内存中只加载一个DLL文件,当没应用程序使用DLL时,系统就将它从内存中清除,进而回收资源。

另外,DLL和其应用程序的链接是独立的,应用程序调用DLL的地址转换是在DLL加载时才实现,这样有利于DLL的故障查找和修改,不必重新编译其应用程序。

2 Win32串行通信的实现

使用Win32API函数CreatFile()打开串口资源,而后使用SetCommState()对DCB(Device Control Block)数据结构里的参数设置,例如波特率、停止位、数据位、校验位等[2];SetComm( )函数实现读写缓冲区的设置。GetCommTimeouts()和SetCommTimesout()函数重新设置读写的超时函数,以此时间判断串口通信的成功与否。初始化串口资源后,使用CreatEvent()函数建立通信事件,而后调用WaitCommEvent()监控通信事件,在Windows环境下,串口通信的访问操作和文件的读写操作一样,用函数ReadFile()和函数WriteFile()对串口数据的读写是在用户事先定义的读写缓冲区中进行。通信完毕,断开串行通信连接,用函数CloseHandle()关闭通信函数的句柄、清除通信事件,释放通信资源。其流程如图1所示[3]。

3 多线程编程异步串行通信的实现

在多线程的串口I/O通信编程中,将对串口的读、写操作视为同一进程的2个不同任务,创建读线程和写线程分别完成对串口的读写操作;由于工业控制领域异步串行通信事件发生的随机性和传输的实时性,要求通信线程优先于主线程被处理,所以在读写线程的中用SetThreadPriority(handle[0],THREAD_PRIORITY_HIGHEST)来完成读写线程优先级的设置。

在PC机上,创建辅助串行通信监测线程来实时监测串口资源的通信状态,按照监测到的通信状态,向主线程输送相应的通信状态消息,然后主程序分析处理其通信状态消息。能够主动探测到数据的接收与发送是利用多线程实现串行通信的突出特点[4]。辅助通信线程一旦探测到数据已经发送到串口上,辅助通信线程就会自动接收数据。数据接收完毕,其就向主线程发送数据接收的消息,串口通信数据的读线程也是如此。应用程序通过对通信辅助线程发送来消息的分析,来处理通信串口通信的数据。

采用多线程技术编程,从MFC的线程对象CThread类[5],建立辅助线程串口读线程(sc_readthread)和写线程(sc_writethread),实现串口通信的操作,以此监测和管理串口通信数据的输入和输出。读线程实现从通信串口读取数据并输送给主线程,写线程接收主线程发送来的数据,并将其输送到串行通信端口输出。主线程除完成串口资源的打开、参数配置的部分工作外,还要完成读写辅助通信线程的创建以及关闭、多线程的协调、数据的中间处理等工作。

程序的串口通信结构流程如图2所示,串口程序写线程的流程如图3所示,串口读线程的流程如图4所示。

临界区对象具有同步线程迅速[6],便于数据访问控制的特点,为此编程时使用临界区(Critical Setion)同步技术来同步线程串行通信中的各线程,防止串行通信多线程间的冲突和死锁。临界区对象的作用是保护主线程与读写线程之间的共享数据,每次只允许一个线程有权访问被保护的数据。InitializeCriticalSection( )函数初始化临界区对象,分配临界区对象资源,使用EnterCriticalSection( )和LeaveCriticalSection( )函数来进入和退出数据保护状态[7]。

依据以上思路,把监控安防系统中,上位机需要访问网络控制器的串行通信函数全部做成一个动态连接库文件。但是在发布上位机应用程序时,需要把此动态连接库一起发布。

4 动态链接库函数的VB 调用

由于监控安防系统的人机交互界面是使用VB开发的,本设计的动态连接库的调用是,在VB开发环境的标准.BAS模块中,定义该DLL函数的调用方式,并且把开发好的动态连接库文件复制到建立的工程里面,就可以使用了[8,9]。本设计的部分动态链接库函数在VB里的声明如下:

Public Declare Function init_port Lib "all" (ByVal com_port As Integer) As Integer

Public Declare Function exit_port Lib "all" (ByVal com_port As Integer) As Integer

Public Declare Function sc_setdate Lib "all" (ByVal com_port As Integer,ByVal iodata As String) As Integer

5 结 语

针对串行通信控件的不灵活性和WinAPI函数的代码利用率低的特点,提出了利用动态链接库实现串口的通信,既能实时监测串口和灵活的传输通信数据,又提高了代码的效率。基于本文思想设计的动态链接库,在开发的监控安防系统中,比较理想地实现上位机和控制器之间的通信。

参考文献

[1]RICHTER J,NASARRE C.Windows核心编程[M].葛子昂,周靖,廖敏,等译.5版.北京:清华大学出版社,2008.

[2]胡东海,李升亮.Visual C++编程学习捷径[M].北京:清华大学出版社,2003.

[3]PETZOLD C.Windows程序设计[M].北京:北京大学出版社,2004.

[4]欧阳琳.基于多线程技术和自定义消息编程实现Win-dows9X异步串行通信[J].计算机与数字工程,2005(9):15-17.

[5]佚名.Microsoft Corporation MFC与Windows编程(影印版)[M].北京:北京大学出版社,2000.

[6]王苓,苏维军.基于多线程技术的多串口通信[J].微计算机信息,2006(8):56-58.

[7]MSDN.Microsoft Corporation[R].USA:MSDN,1975.

[8]李威,王春燕.VB6.0直接调用EXE文件的一种方法[J].交通与计算机,2000(3):103-105.

[9]EVJEN B,HOLLIS B.Visual Basic2008高级编程[M].詹正茂,译.5版.北京:清华大学出版社,2009.

异步串行接口 篇7

为了解决这些问题,在原系统保留射频模块和主要功能不变的基础上,需要对系统进行数字化改造。新系统以基于Linux的ARM11 多媒体处理平台为核心,实现视频数字化采集和压缩处理以及收发处理,实现彩色LCD视频播放; 采用异步串行传输方式,减少开发的难度和周期; 采用mmap和多线程方式,优化了视频数据读取的实时性,保证了视频的流畅性。采用中频CP-FSK调制方式,实现高速视频传输。新的数字视频系统以简单的结构、低廉的成本,易实现的技术完成了高速视频的采集、压缩处理、数字传输和实时回放,达到了设计目标。

1 系统方案

1. 1 视频采集与发送端方案

保留原有微波发射电路的中频以上部分电路不变,采用中频FSK调制器,以中频频率60 MHz为中心,实现高速FSK调制,调制速率设计为1 Mbaud。FSK调制采用灵活配置的DDS芯片AD9854 实现。视频采集与处理模块采用基于ARM11 的Linux嵌入式系统,完成图像采集、H. 264 压缩处理以及视频数据的发送,采用触摸屏显示采集到的视频。视频数据经过压缩和成帧处理后送到FSK调制器,发送方案如图1 所示。

串行数据传输有同步和异步两种方式。同步方式性能好,但收发处理复杂,软硬件成本高,而异步方式实现简单、方便、成本低。综合考虑各种因素,方案采用UART异步串行方式。由于现有嵌入式平台UART所支持的最大速率为115. 2 kbit /s,无法满足设计要求,因此采用USB转UART方式,提升串口传输速率。采用单片CP2102 实现USB转UART,速率最高可达1 Mbit /s,且具有硬件电路简单,成本较低等特点。

视频采集与处理模块可以采用三星公司的多媒体处理器S3C6410。S3C6410 处理器集成了视频处理子系统MPEG-4 / H. 263 / H. 264 协处理器和ARM内核以及多种外设。开发平台前期选用广州友善之臂计算机公司生产的Tiny6410 开发板,支持USB摄像头输入,支持彩色触摸屏,满足各项技术要求[1]。

1. 2 视频接收端与回放方案

保留原有微波接收电路的中频以上部分电路不变,采用中频FSK解调器,以中频频率38 MHz为中心,实现速率1 Mbit /s FSK解调。FSK解调采用集成PLL芯片NE564,单片直接完成FSK解调,接收方案如图2 所示。

与发送端相同,视频接收与处理模块亦采用基于ARM11-S3C6410 的Linux嵌入式系统,完成视频接收和H. 264 解码处理以及LCD视频回放。

2 硬件设计

2. 1 高速异步串行接口设计

串行传输接口采用的USB转UART方式,使用CP2102 作为桥接器,外围电路器件较少。S3C6410 平台通过USB实现与CP2102 数据交换,经过转换后通过UART接口实现异步串行发送。该芯片集成了USB收发器和时钟,USB控制器符合USB2. 0 规范,内部集成48 MHz时钟发生器,发送缓冲640 byte,接收缓冲为576 byte,波特率最高可达到1 Mbaud[2]。

2. 2 FSK调制电路设计

FSK调制方案采用亚德诺( Analog Devices) 半导体公司高性能DDS芯片AD9854,其工作时钟可以高达300 MHz,支持FSK,BPSK,PSK,CHIRP,AM等5 种工作模式[3],串行通信速度达10 Mbit /s。

在FSK模式下,DDS的输出频率是频率调谐字寄存器1、频率调谐字寄存器2 和引脚29( FSK/BPSK/HOLD)逻辑电平的函数,引脚29 的逻辑低电平选择频率f1,逻辑高电平选择频率f2。DDS系统框图如下图3 。

AD9854 输出的模拟信号经过D / A处理,含有高次谐波分量,需进行低通滤波改善频谱纯度。为此,采用Elliptic函数,设计输入输出阻抗为50 Ω,通带截止频率61 MHz,阻带截止频率80 MHz,阻带损耗60 d B,带内波动为1 d B的7 阶的LC低通滤波器。设计中采用了村田公司提供的实际电感电容模型替换ADS仿真设计出的理想模型,并不断对LC参数进行调整后得到了较为满意的仿真结果。滤波器结构和特性见图4、图5。

2. 3 FSK解调电路设计

采用单片锁相环芯片NE564[4]只需外接少量的辅助电路即可方便构成如图3 所示的FSK解调电路,解调波形如图6 所示。

NE564 解调电路的电路参数可设计如下:

NE564 的l2 / l3 端的定时电容CT决定着压控振荡器的固有频率,如式( 1)

中心频率为38 MHz时,计算得CT= 11. 96 p F,那么就可以选6. 8 p F和10 p F的可调电容来调节VCO的中心频率。

环路滤波电容的选定: 当规定环路的 ξ =0. 5,芯片供电电压为5 V,且调节2 脚电位器使2 脚对应电流I2为200 μA后,4、5 脚的电容大小,可用如下式子计算得到4、5 脚电容约为5 p F。

3 软件设计

3. 1 系统软件架构设计

考虑到Linux操作系统的开源、可移植和裁剪,选用Linux-OS平台。在ARM11 + Linux平台上,为了实现既定目标,需要开发底层的USB/UART驱动、USB摄像头驱动、LCD驱动和MFC驱动,以及视频采集和回放、H. 264硬编解码、异步串行收发、LCD显示与人机界面等应用软件。为保证视频采集、压缩、传输和解码、回显的实时性,采用了多线程方式设计。系统软件架构如图7 所示。

3. 2 视频采集及处理软件设计

3. 2. 1 视频的采集模块的设计

V4L2( Video for Linux 2) 是Linux下开发视频采集设备驱动的一套规范,为驱动程序的开发提供了清晰的模型和统一的接口。应用程序使用统一的API函数来进行操作,视频采集流程如图8。

1) 使用open函数只读模式打开摄像头设备文件。接着调用V4L2 接口函数设置视频设备采集格式,采集视频分辨率320 × 240 等。相关参数保存在结构体struct v4l2_format fmt中。

2) 向驱动申请4 个帧缓冲。

3) 将申请到的帧缓冲映射( mmap) 到用户空间,用户可直接获取帧数据。

4)使用命令VIDIOC _QUERYBUF将申请到的缓冲区入采集消息队列,系统返回每个缓冲区的首地址和长度,这些参数保存在结构体struct V4L2_requestbuffers中。

5) 开始采集视频,当采集到完整一帧视频后,使用命令VIDIOC_DQBUF控制缓冲出消息队列,用户依据地址和帧长度就可以获得采集到的视频数据。

6) 将帧缓冲重新入队列,实现循环采集。

S3C6410 H. 264 压缩处理单元进行H. 264 压缩编码时要求输入原始数据格式必须为YUV420。本文中USB摄像头采集到的图像数据格式是JPEG,需要进行格式转换。配合使用S3C6410 MFC-JPEG处理单元和Post Processor,可以将采集的图像格式转换成YUV420。

3. 2. 2 视频的编码与解码

S3C6410 编解码单元具有高性能的H. 264 视频编解码功能,它还能同时处理图像的压缩和解压,也能同时对不同格式的图像进行处理。编解码单元包括BIT处理器和视频编解码模块,BIT处理器能处理比特流和控制视频编解码硬件。编解码单元可以达到全双工720 ×480,30 f/s( 帧/秒)压缩和解压的性能。

1) 本文采用H. 264 编码格式,对YUV420 格式的数据进行压缩以减小其传输所需要的带宽。H. 264 硬件压缩方式,效率高且占用CPU时间少。经测试使用该编码器可以压缩掉90% 以上原始数据,编码顺序如图9。

2) H. 264 视频格式的解码同样采用S3C6410 H. 264硬件解码器,解码后的数据格式是YUV420,需要将该YUV420 格式转换成RGB格式后才能在LCD屏上预览,流程如图10 所示。

3.2.3视频数据发送与接收帧处理

1)视频数据帧格式

压缩后对数据进行拆分,组帧发送,依据驱动buffer大小,以每次发送1 024 byte对数据进行划分,并定长1 029 byte发送。划分的每一组数据加入一些标志位进行组帧,帧头2 byte,数据大小2 byte,帧尾1 byte,拆分组帧如图11。

在进行数据划分时要考虑两种情况: 一是编码后的数据可以分成n整数帧,二是编码后的数据不能整数划分,能分成n帧和余下不足1 024 byte的数据帧m。

2) UART配置及收发流程

串口参数包括控制模式,波特率,起始位停止位数量等参数,串口主要参数设置是在Linux提供的一个标准接口temios中,该接口在头文件temios. h中定义。需要注意的是本文使用串口来传递二进制数据,所以要关闭软件流控,发送模式设置为非规范模式,输入的数据不会被合成一行,不对数据进行加工处理。本设计在此设置串口主要参数如下:

配置好这些关键参数后,串口的运行环境就准备就绪了,这时就可以调用write函数将要发送的数据写入串口设备。

串行数据经过调制过后送如发射机无线传输。处理流程见图12、图13。

3) 数据接收处理流程

接收机收到数据经过低噪声放大,下变频到中心38 MHz频率和中频放大之后送入解调模块恢复出串行数据。在接收上采用中断方式,当串行接收缓冲区接收到1 029 byte数据通过软中断信号告知应用程序读取,并把数据存在环形缓存区1 内。

应用程序读取接收的数据后,通过一些标志位获得视频数据,并将视频流拷贝到一个视频暂缓存区域Buf进行数据的拼接,数据的拼接按照接收顺序和上一帧数据的大小来偏移本次存视频的地址实现。

当完整的接收到一帧视频数据后,将完整的数据转到共享缓冲2,解码线程调用MFC提供的接口函数将接收的视频数据解码并在LCD上显示。因为接收线程,数据处理线程和解码线程是同时运行的,而且共享同一缓冲区进行数据的交互,因此必须采用信号量机制实现同步。进行实际操作之前,进程( 或线程) 先检查信号量的值,如果当前值大于0,则进行P操作( P操作使信号量值减1) ,否则休眠,等待其他进程( 或线程) 在该信号量上V操作( V操作使信号量值加1)[7]。解码操作流程和函数如图14。

3. 2. 4 视频数据读取和实时性优化

在数据采集压缩端,主要有两个处理任务,一是采集的视频本地回显,二是将采集的视频数据格式转换后进行H. 264 压缩并发送,如图15 所示。考虑到视频数据流向较为复杂,对实时性要求很高,需要进行优化处理。

因此,视频数据读取和实时性优化采用了如下措施:

1) 视频采集时采用mmap方式,其具体功能就是直接将物理内存直接映射到用户虚拟内存,使用户空间可以直接对物理空间操作,相比较在用户控件和内核空间互相拷贝数据,效率更高。

2) 视频本地回显,压缩和解码数据流交互采用共享环形缓冲区和多线程机制。在采集视频端主线程负责视频采集和LCD本地回显,子线程实现数据的转换和H. 264压缩与传输。在接收端除接收主线程之外,开辟了一个数据拆帧和数据拼接线程,一个解码显示线程,组成了一个类似于三级流水线形式的处理流程,保证了画面的流畅。

4结束语

采用了高速串行异步通信方式,实现视频的无线传输和接收,硬软件实现较为经济。设计中采用了ARM +Linux平台,可以根据需要进行软硬件裁剪,解调采用了NE564,即可在中频阶段实现数据的恢复,在发送接收端采用了多线程,实时性得到了提高,经系统级联实验测试,在分辨率为320 × 240 情况下,可以较稳定的传输接收并解码显示,色彩保持度较好,平均帧率在10 f /s以上,达到了设计要求。

摘要:基于Linux操作系统,以ARM11嵌入式处理平台为核心,采用异步串行传输和FSK调制解调方式,设计了一种视频采集、处理与无线高速传输系统。采用USB摄像头实现数字视频的采集,S3C6410处理器对视频进行H.264硬件编解码,并利用FSK调制解调模块和射频模块完成视频的无线传输与接收。经实验测试,系统达到设计要求。

异步串行接口 篇8

单片机的系统扩展包括并行扩展和串行扩展,串行扩展占用I/O口少、电路简单,从而能有效缩小硬件体积、降低功耗,近年来得到了广泛应用。除了早期传统的UART串行口以外,后来陆续出现了I2C、SPI、1-WIRE等标准串行总线和用于单片机的CAN和USB标准串行总线[1],另外还出现了一些专用非标准的三线串行总线。51系列单片机的串行系统扩展通常采用串行同步传输方式,用几个并行I/O口虚拟串行口的时序和运行状态,在单片机上构建模拟的串行口,亦即严格遵循数据传输时序设计数据传输子程序,设计时常用到软件延时方法,一定要精确设计延时时间[2]。三线串行总线器件一般使用时钟信号线、数据I/O线和片选/复位线进行半双工串行数据传输,但不同器件传输时序各不相同,没有统一标准,编程时需要分别对待。

2 三线串行总线时钟芯片DS1302

时钟芯片DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路[3],它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8bit的用于临时性存放数据的RAM寄存器。

2.1 DS1302的结构和引脚功能

DS1302结构如图1所示,引脚功能简介如下:

(1)VCC2:主电源。

(2)VCC1:后备电源,在主电源关闭的情况下保持时钟的连续运行,主电源打开时DS1302由Vcc1或Vcc2两者中的较大者供电。

(3)X1、X2:振荡源,外接32.768KHz晶振。

(4)GND:电源地。

(5)RST:复位/片选线,置高电平启动数据传送,允许地址/命令序列送入移位寄存器,在传送过程中RST置低时终止数据传送,I/O引脚变为高阻态。上电运行时,在Vcc≥2.5V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。

(6)I/O:串行数据输入输出端(双向)。

(7)SCLK:时钟信号输入端。

2.2 DS1302的读写时序

除了电源和接地,DS1302只有三根线SCLK、I/O和RST和单片机连接。每进行一次读写操作最少需要读写两个字节,第一个字节是控制字,第二个字节是要读、写的数据。读写数据时按从低位到高位的顺序进行。

向DS1302写一个字节数据的时序如图2所示:先将RST置高、SCLK置低,然后单片机将控制字的位0放到I/O线上,当I/O线的数据稳定后,将SCLK置高电平,DS1302检测到SCLK的上升沿后就将I/O线上的数据读取,然后单片机将SCLK置低,再将控制字的位1放到I/O线上,如此反复,将一个字节控制字的8个位传给DS1302。接下来就是传一个字节的数据给DS1302,当传完数据后,单片机将RST置为低电平,操作结束。

从DS1302读一个字节数据的时序如图3所示。读操作开始写控制字的过程和上面的写操作一样,但是单字节读操作在写控制字的最后一个位,SCLK还在高电平时,DS1302就将数据放到I/O线上,单片机将SCLK置为低电平后数据锁存,单机机就可以读取I/O线上的数据。如此反复,将一个字节的数据读入单片机。

读与写操作的不同在于:写操作在SCLK低电平时单片机将数据放到I/O线上,在SCLK置高的上升沿后,将数据写入DS1302;而读操作在SCLK高电平时DS1302把数据放到I/O线上,在SCLK置低的下降沿后,单片机从I/O线上读取数据。

2.3 DS1302的数据读、写子程序

(1)向DS1302写一个字节数据子程序wr1b

(2)从DS1302读一个字节数据子程序rd1b

3. D/A转换芯片TLC5615CP

3.1 TLC5615CP芯片的引脚

D/A转换芯片TLC5615CP是美国TI公司生产的8脚直插式串行10位DAC芯片[4],其引脚分布如图4所示,各引脚功能如下:

(1)DIN:串行二进制数据输入端。

(2)SCLK:串行时钟输入端,用于控制TLC5615CP的时序。

(3):片选端,低电平有效。

(4)DOUT:用于级联的串行数据输出,用于接另一个TLC5615CP的DIN引脚。

(5)AGND:模拟地。

(6)REFIN:基准电压输入端。

(7)OUT:DAC模拟电压输出端。

(8)Vcc:电源正极。

3.2 TLC5615CP主要技术参数

(1)工作电压:5V。

(2)分辩率:10位。

(3)转换时间:12.5us。

(4)输出类型:电压。

(5)通道数:1。

(6)外部输入基准电压:推荐2V~(VDD-2)。

(7)最大模拟输出电压:2×基准电压。

3.3 TLC5615CP的内部寄存器

(1)16位移位寄存器:存放串行输入的16位二进制数据,16位二进制数据的结构,如表1所示。

其中:最高4位虚拟数据任意且不用传送,最低2位填充数据任意但需要传送,所以,进行D/A转换时实际传送的数据为12位,高位在前。

(2)10位DAC寄存器:串行输入的12位二进制数据进入16位移位寄存器后,将其中10位有效数据送入DAC寄存器锁存,供DAC电路进行转换。

3.4 TLC5615工作时序

TLC5615的工作时序如图5所示,当为低电平时,在每一个SCLK时钟的上升沿将DIN输入的一位数据移入16位移寄存器(高位在前),在下降沿将该位数据送DOUT输出给另一个TLC5615CP的DIN引脚(如果有的话),12位数据移完后,在的上升沿将16位移位寄存器的10位有效数据锁存于10位DAC寄存器,供DAC电路进行转换(转换时间为12.5us)。注意,的上升和下降沿都必须发生在SCLK为低电平期间。

3.5 D/A转换子程序dac

把10位有效数据加任意2位填充位送TLC5615CP进行D/A转换。

4 A/D转换芯片TLC549CP

4.1 TLC549CP芯片的引脚

A/D转换芯片TLC549CP是美国TI公司(德州仪器公司)生产的8脚直插式串行8位ADC芯片[5],其引脚分布如图6所示,各引脚功能如下:

(1)REF+:基准电压正极。

(2)ANALOG IN:模拟量输入端。

(3)REF-:基准电压负极。

(4)GND:电源地。

(5):片选端,低电平有效。

(6)DOUT:数字量串行输出端。

(7)SCLK:串行时钟输入端,用于控制TLC549CP的时序。

(8)VCC:电源正极。

4.2 TLC549CP的主要技术参数

(1)工作电压VCC:3~6V。

(2)分辩率:8位。

(3)转换时间:17us。

(4)通道数:1。

(5)外部输入基准电压:REF+:2.5V~VCC+0.1,REF-:-0.1~2.5V。

(6)量程:0V~VCC,但输入≥REF+时转换为0FFH,输入≤REF-时转换为00H。

4.3 TLC549CP的工作时序

TLC549的工作时序如图7所示,先初始化:置高、SCLK置低;此后当变为低电平后等待1.4us以上,前次转换结果的最高有效位MSB自DOUT端输出,接着要求自SCLK端输入8个时钟信号,前7个时钟信号的下降沿输出前次转换结果的第6-0位并在第4个信号的下降沿后,片内采样/保持电路对输入模拟量开始采样,第8个时钟信号的下降沿使片内采样/保持电路进入保持状态并启动A/D转换,转换时间为36个系统时钟周期,最大为17us,在这段时间内,要求保持高电平或者SCLK保持低电平。

4.4 A/D转换子程序adc

摘要:在单片机的串行总线扩展中,时钟芯片DS1302、D/A转换芯片TLC5615CP、A/D转换芯片TLC549CP等是常用的三线串行总线器件,它们都使用时钟信号线、数据I/O线和片选/复位线进行半双工同步串行数据传输,但数据传输时序各不相同,在单片机上它们的虚拟串行接口需分别独立设计,设计时要严格遵循器件的数据传输时序。

关键词:单片机,串行总线,虚拟接口,DS1302,TLC5615CP,TLC549CP

参考文献

[1]欧伟明,等.单片机原理与应用系统设计[M].北京:电子工业出版社,2009.

[2]张江印.51系列单片机软件延时的计算方法[J].电脑编程技巧与维护,2011,8:82-84.

[3]姚德法,张洪林.串行时钟芯片DS1302的原理与使用[J].信息技术与信息化,2006,(13)1:45-49.

[4]http://focus.ti.com.cn/cn/lit/ds/symlink/tlc549.pdf.

异步串行接口 篇9

关键词:串行干扰消除,多址干扰,多址通信系统,码间干扰

SIC技术是3G、B3G及4G移动通信系统干扰抑制技术中的研究热点,该检测器由多级组成,其基本原理是在接收端估计每一用户的MAI,再于接收信号中部分或全部消除MAI[1]。SIC检测器对多个用户进行数据判决,逐步减去功率最大用户的干扰,再对判决出的每一检测级中的移动通信用户信息源进行估计,最终在信号接收端将估计结果用于接收信号负载信息的恢复与重构[2]。由于该处理方式优先处理大功率用户信号,需不断对信道中各用户按照负载功率大小重新进行由小到大排序[3],若排序出现错误,将导致后续串行检测级出现大功率用户湮没弱功率用户的问题,在实际复杂时变移动通信环境中,任一串行检测级出现判决错误,非但无法有效消除MAI,还会增加系统干扰造成检测判决误差扩散,导致后续各级性能及系统性能的恶化,甚至无法进行正常的通信业务[4],所以,第一级的判决精度将直接影响SIC检测器的干扰消除性能。

异步Schwarz算法可实现对信道信息及用户功率子域边值的有效控制,提高检测精度[5]。现将Schwarz算法应用于SIC单级检测结构中,通过对信道子域边值的实时估计抑制各级判决误差产生,以确保检测器的多用户检测精度。

1 多址移动通信系统信号模型分析

1.1 DS-CDMA系统信号模型分析

在一个在复合噪声激励下的异步DS-CDMA系统中[6],设定系统传输符号长为2P+1,系统时间序列为{-P,-P+1,…,-1,0,1,…,P-1,P},令K个用户进行异步信号发送,用户等效信道响应最大阶数为P,定义用户1为期望用户,对各用户信号分别做独立扩频加噪声处理,之后进行杂序扩频再处理并按用户顺序分别相加,K个用户经双扩频处理后采用S进制传输异步发送信号,用户kS进制信号为S={sk,0,sk,1,…,sk,S-1},对于系统中所有用户序号ki(ki)发送数据{bk(i)}均相互独立且为独立分布,各用户扩频处理结果经Schwarz单元[7]进行功率边值精确控制处理后,信号模型输出为

yk=0Τr(t)sk(t)dt=Akbk(i)+i=1,ikΚAibiρik+nk(t) (1)

式(1)中,bk(i)∈{-1,+1}为t∈[iT,(i+1)T]时刻内用户k的信号发射符号;ρik=T-1∫T0si(t)sk(t)dt为用户k扩频码间互相关系数;sk(t)为用户k的特征波形(‖sk‖2=∫0Τsk(t)dt=1);nk(t)=T-1∫0Τn(t)sk(t)dt为加性高斯白噪声(AGWN)相关输出,T为比特间隔;Ak为接收信号载波幅度。

常规的移动通信系统干扰抑制方案在处理MAI抑制问题时往往将MAI视为系统背景噪声进行处理,即直接对系统匹配滤波器输出进行判决

bk=sgn(yk); k=1,2,…,K (2)

该处理方式会导致系统容量降低,误码率增加。

t∉[0,T]时,sk(t)=0,且∫0Τsk2(t)dt=1。则用户k的特征波形为

sk(t)=l=0Ν-1sk,lΡΤC(t-lΤC)(3)

式(3)中:N为扩频处理增益;{sk,0,sk,1,…,sk,S-1}为用户k的归一化扩频序列(其值为±1/Ν);l={-L,L}(L为扩频序列周期);PTC为周期为TC的矩阵码片(TC=T/N),且ΡΤC|t[0,ΤC]=1/ΤC。将用户k的相应系统噪声ek(t)等效为nk(t)(均值为零,双边带功率谱密度为σ2 W/Hz,σ2为噪声方差)与有色噪声分量ζk(t)之和,即

ek(t)=nk(t)+hkζk(t) (4)

式(4)中,ek(n,i)=e(nL+i)为复合噪声序列,ζk(t)为零均值色噪声,hk为色噪声强度。

将信道中用户按相应负载信号载波幅度顺次递减以确保算法具有普适性,对滤波与加噪后的用户信号进行功率边值调制,将接收信号等效建模为

r(t)=k=1Κ{i=-[Akbk(i)sk(t-iΤ-τk)+pk(t-iΤ-τk)]cos(ωCkt)+ek(t)}(5)

式(5)中,pk为的扩频波形(±1);τk为用户k的延迟;ωCk为滤波器单元自适应权向量。

1.2 信号模型周期扩频序列等效变换

直扩系统信号模型通常使用短(周期)扩频序列,即:每一用户的扩频序列周期等于相应符号周期,但在实际DS-CDMA系统中,会出现扩频序列周期大于符号周期的情况[8](长扩频)。对1.1中信号模型结合长扩频序列进行推广:由于L/Ν=ΔQ>1,用sk,(i)Q(t-iT-τk)代替sk(t-iT-τk),式(5)所示接收信号模型为

sk,(i)Q(t)=l=0Ν-1sk,[i/Q]Ν+lΡΤC(t-lΤC)(6)

式(6)中:(i)Qi mod Q运算;[·]为底函数。

用户ik的时移特征波形互相关矩阵R(l)的元素为

Ri,k(l)|R(-l)=RΤ(l)=-si(t-τi)sk(t+lΤ-τk)dt=Δρik(l) (7)

R(l)|l∉{-1,0,1}=0。一个码元间隔T内可得L维异步系统基带接收信号模型向量r及输出向量y

r=k=1ΚAkbkskpk+e(8)

y=RAb+n=[y1,y2,…,yK]T (9)

其中:p=[p1,…,pK]T; A=diag[A1,…,AK]T;R=E[ppT]; E{nnT}=σ2R;pk=L-1[pk1,…,pkL]T;e为噪声零均值协方差矩阵。若max{τk}≤T,在任一传输相关间隔内对被传输用户信号比特符号进行估计,则可将该系统等效为一拥有2K-1≤L个用户的同步系统,且这2K-1个用户的扩频码线性无关。

2 Schwarz算法准则

2.1 Schwarz算法基本原理

对于一维边值控制(可等效功控过程)问题

{-ddx[k(x)dudx]=f(x),0<x<1u(0)=0,u'(1)=0(10)

式(10)中,u为下降函数u(x)的矩阵形式。令p=k(x)dudx,则有

{-dpdx=f(x),0<x<1p-k(x)dudx=0,u(0)=0,p(1)=0(11)

定义两个集合

L2(0,1)={q(x)|q(x),q(x)∈(0,1)} (12)

X={q(x)|q(x),q'(x)∈L2(0,1)} (13)

式中,q(x)为(0,1)上平方可积观测函数q(x)的矩阵形式,且q(1)=0。对任意函数v(x)∈L2(0,1)式(10)第一式的弱形式为

01(dpdx+f(x))vdx=0(14)

同理,式(11)第二式的弱形式为:

01(k-1(x)p-dudx)qdx=0(15)

对于分部积分边界条件u(0)=u'(1)=0得

01(k-1(x)pq+udpdx)dx=0(16)

式(15)、式(16)有利于进行有限元逼近。

2.2 连续型异步Schwarz算法实现

对连续型Schwarz算法,设边值问题[10]

{Lu|Ω=f,u|Ω=gu||Ω|min=f(x,y),u||Ω|min=g(x,y)(17)

式(17)中,ΩRn为有界开集。则微分算子为

Lu=-i,j=1Κxj(Aijuxi)+B(x)u(18)

式(18)中,B(x)≥0,当xΩAij一致正定。将有界开集Ω做非平均分解得

Ω__=Ui=1kΚΩ__i(19)

式(19)中,Ωi为开集,对每一个i均有ij使

ΩiΩjφ (20)

则选定并行Schwarz算法初始近似条件

{u0Ηg1(Ω)k=0(21)

式(21)中,Hg1(Ω)为边界最大近似矩阵。同时定义误差限为ε。对子域边值并行计算得:

{Luik+1|Ωi=fuik+1|Ωi=uki=1,2,,k(22)

Ωi上的最终解uik+1延拓至整个Ω

u¯ik+1={uik+1,(x,y)Ωiuk,(x,y)Ω/Ωi(23)

对所有子域解取平均值计算处理得

uik+1=1Κi=1kΚu¯ik+1(24)

当误差限εuk+1为近似解时满足条件

||uk+1-uk||≤ε (25)

3 S-SIC算法

S-SIC检测器中的SIC检测单元每一检测级包含一个传统SIC检测单元和一个Schwarz边值控制单元。图1为S-SIC检测器单级结构。

S-SIC算法不同于传统检测器的串行格局,算法引入了并行计算的设计思想,充分考虑了并行计算的特点,可随时根据信道中用户增体变量的最新信息来确定运算是否继续,无需等待数据重新输入,有利于工程实现。图1结构中滤波器实际输出向量为yk。对于相应用户数k=0,1,2,…,K

v(k)=d(k)-ωH(k)u(k) (26)

ω(k+1)=ω(k)+μu(kv(k) (27)

式中,v(k)为输入向量;u(k)为检测输入能量向量;d(k)为用户k的期望响应向量;μ为步长参数。

串行检测器双扩频处理后采用S进制传输异步发送信号的扩频码为Sk=[sk,0,…,sk,K-1]T,第m个检测级第k个用户信号输出为bm(k)=sign[STVvm(k)],最强用户为rmax(t)=argmaxmkΚ{|SkΤvm(k)|},vm(k)=r(t),检测后的信号bm(k)输出为

vm+1(k)=vm(k)-ωm(k)bm(k)Sm(k) (28)

用户信号经处理后的下级接收信号向量为

r(t)=S(t,Q)P(t,Q)+e (29)

式(29)中,QK×(2P+1)维信息矩阵边界条件,表示q1,q2,…,qk的映射,即Q中元素(k,i)为qk(i),则

{S(t,Q)=ik=1Κsk,q(i)(t-iΤ-τk)Ρ(t,Q)=ik=1Κpk,q(i)(t-iΤ-τk)r=ik=1ΚAkbk(i)skpk+ei(30)

m级迭代数据比特b估计、第m+1级信息比特为

{b(m)=[1b(m),b2(m),,bΚ(m)]Τbk(m+1)=arg{maxqk(+1,-1)qi=bk(i),k[2yΤb-bΤΗb]}=sgn[zk(m)](31)

式(31)中,hkq=∫0Τsk(t)pk(t)sq(t)pq(t)dt为互相关矩阵H的元素,zk(m)=yk-ikbi(m)hkq为第m次统计结果。

1.1中异步系统用户信号经功率边值控制处理后的接收向量为

r(t)=S(t,L)P(t,L)+n (32)

式(32)中,LK×(2P+1)维信息矩阵边界条件,表示l1,l2,…,lk的映射,即L中元素(k,i)为lk(i),则

S(t,L)=ik=1Κsk,l(i)(t-iΤ-τk)(33)

Ρ(t,L)=ik=1Κpk,l(i)(t-iΤ-τk)(34)

由式(33)、式(34)得接收端信号为

r=ik=1ΚAkbk(i)skpk+ni(35)

串行第m检测级迭代数据比特b估计值为

b(m)=[b1(m),b2(m),,bΚ(m)]Τ(36)

并行第m+1检测级第k个用户信息比特为

bk(m+1)=arg{maxlk(+1,-1)li=bk(i),k[2yΤb-bΤΗb]}(37)

式(37)可简化为

bk(m+1)=sgn[zk(m)](38)

式(38)中,zk(m)为第k个用户第m次统计结果

zk(m)=yk-ikbi(m)hkl(39)

式(39)中,hkl为互相关矩阵H的元素(k,l),即

hkl=∫0Τsk(t)pk(t)sl(t)pl(t)dt (40)

根据式(8),式(9)得

yk=∫0Τr(t)sk(t)pk(t)dt (41)

检测器第m+1检测级b的判决向量为

b(m+1)=sgn[z(m)]=sgn[y-(Η-E)b(m)] (42)

式(42)中,z(m)=[z1(m),z2(m),…,zK(m)]T,调制信号能量为对角矩阵E的对角元素,即

diag{E}={E1,E2,…,EK} (43)

由式(38)、式(41)、式(42)得

y=Hb+η=Eb+I(b)+η (44)

式(44)中,η为协方差矩阵为σ2H的零均值高斯白噪声。I(b)为MAI矢量,即

I(b)=(H-E)b (45)

检测器第m+1级b的估计值为

b(m+1)=sgn[z(m)]=sgn[Eb+Ι(b)-Ι(b(m))+η] (46)

以上过程即应用Schwarz-SIC检测器第m检测级b的估计值重新估计MAI,从y中消去最新MAI,得出第m+1级b的估计值。当信道中暂无新的移动通信用户信息加入时,串行检测判决处理过程终止。由于用户信号及无线通信参数是时变的,引入Schwarz单元可实现对单个用户信号功率的精确控制与跟踪,更好地跟踪信道变化,确保处理精度。

4 仿真分析

一复合噪声激励下拥有K个用户的DS-CDMA系统[11]中,在每一仿真步长(1 s)内每个用户对应发送一个信息码元,用K=100个P=31的m序列分别对K个用户信号做独立扩频加复合噪声处理并按用户顺序分别相加,在接收端和发送端用相同Km序列分别对信息码元进行解扩处理,再进行积分判决,完成用户码元恢复,发送时间与码元个数相等,最弱功率用户每一信息比特能量为A2kT/2,系统的扩频增益N=31,BPSK调制,步长为μ=0.000 5,采样速率等于码片速率。信道中功率最大用户与功率最小用户间功率差为11 dB[12]。在检测迭代600次时加入15个随机功率干扰用户,并在检测迭代1 200次时将全部干扰用户及9个随机原有用户撤出。定义用户用户k等效能量为ek(σ),误码率为Pk(σ)=Q[ek(σ)/σ2]1/2,系统流入话务量(用户信号发送数)与阻塞率的关系如图2所示:

图3所示两种算法的信噪比(SNR)曲线在干扰加入后均出现突降,S-SIC算法的SNR曲线在干扰还未撤出时即以较快速度开始恢复原状,并在干扰撤出后以高信噪比达到稳定,SIC算法的SNR曲线在干扰区内的SNR值始终低于干扰加入前的SNR值,且在干扰撤出后呈现不稳定扰动。这说明S-SIC算法的收敛性及动态跟踪能力优于于SIC算法。

图4所示S-SIC算法的剩余输出能量(ROE)在干扰加入时均出现突变性扰动,SIC算法的ROE值在干扰撤出后虽恢复衰减,但始终高于0.1 dB。S-SIC算法的ROE值,在整个处理过程中始终呈现稳定快速衰减,且在干扰加入后仍低于0.05 dB,在处理后期已接近理论0值。由于剩余输出能量定义为应用多用户检测算法时,为达到单用户误码性能,移动通信系统中用户信号经传输后的剩余能量,即算法的剩余能量输出衰减越迅速稳定,系统传输性能就越稳定。这说明S-SIC算法能够通过对用户信号负载能量子域边值的精确控制确保算法在复杂环境下均具有快衰减的剩余能量性能,且在衰减过程剩余能量无大的波动,有效提高抗干扰性能。

图5所示设定系统中用户k为功率最弱用户,每一个比特能量为A2kT/2。S-SIC算法的误码率(BER)曲线在整个检测过程中始终呈现快速稳定下降,且BER值始终低于SIC算法。这说明S-SIC具有更好的抗干扰能力。

图6所示在相同检测迭代2000次实验中,S-SIC算法的误差平方均值曲线始终低于单一SIC算法。这说明S-SIC算法的检测精度在整个检测处理过程中始终高于SIC算法。

5 结论

本文结合Schwarz算法提出了一种多址移动通信系统异步Schwarz-SIC算法。新算法通过对无线多址移动通信系统中用户信号功率子域边值的精确控制实现了对复杂环境时变信道进行快速有效的全面跟踪,最大限度地消除同信道干扰,且检测过程减少了对不同功率用户信号的过度重复重新排序,避免了SIC算法因中间环节判决出错造成的判决误差扩散问题,在提高算法检测精度和稳定性的同时有效减少了算法计算复杂度因信道环境变化造成的不必要增加。仿真结果表明,Schwarz-SIC算法在算法误码性能、收敛性、复杂动态环境跟踪能力及精度控制方面均优于SIC算法,是一种有效的多址移动通信系统干扰消除算法。

参考文献

[1]John G.Proakis,Masoud Salehi,Gerhard Bauch.现代通信系统.刘树棠,译.北京,电子工业出版社,2008;01:313—327

[2]Jalali S,Khalaj B K.Power control for multi-rate DS-CDMA system with imperfect successive interence cancellation.IEEE Trans on Ve-hicular Technology,2008;57(1):600—603

[3]Georgios B.Giannakis,Yingbo Hua.无线通信与移动通信中信号处理研究的新进展.刘郁林,邵怀宗,等,译.北京:电子工业出版社,2004:532—567

[4]Deepthy G S,Susan R J.Analysis of successive interference cancel-lation in CDMA systems.IEEE Advanced Computing&Communica-tion Technologies(ACCT),2012;481—485

[5]Babekir E I,Electr.&electron.eng.Dept.,Univ.Teknol.PET-RONAS,Tronoh.Optical CDMA Serial Interference Cancellation:First Cancellation Stage.Computing in the Global Information Tech-nology,(ICCGI),2007;03:26—30

[6]Wu Zhiyuan,Wang Xiaofeng.A new turbo multi-user receiver with re-cursive SIC-MMSE detection.IEEE Communication Society subject matter experts for publication in the Wireless Communications and Networking Conference,Hong Kong,2007:922—926

[7]Shu Tao,Nin Zhisheng.Optimal decoding order and power allocation in multimedia CDMA networks with imperfect successive interference cancellation.Proc of IEEE Vehicular Technology Conference.Jeju,South Korea,2003:358—362

[8]Haykin S.通信系统(第四版).宋铁成,徐平平,徐智勇,等,译.北京,电子工业出版社,2003:299—435

[9]高维廷,李辉,翟海天.基于最小均方误差的串扰消除多用户检测算法.计算机工程,2011;37(11):132—134

[10]丁立新.变分不等式有限元逼近的并行Schwarz算法.湖南大学学报:自然科学版,1996;23(3):10—14

[11]Li Hui,Gao Weiting,Ren Mengyin.An improved MMSE-MUD al-gorithm for MAI.IEEE2011International Conference on Computer Science and Service System,(CSSS),2011;6:2055—2058

上一篇:电解反应下一篇:大学社团