串口扩展芯片

更新时间:2023-03-19 17:33:19 阅读: 评论:0

电子版手抄报-平行线的判定

串口扩展芯片
2023年3月19日发(作者:答辩状格式范文)

单片机多串口扩展

07计本三班

汪庆

设计要求:选定具体单片机,利用IO口模拟单片机的串口时序,该软串口具有

修改波特率、设定串口通信数据格式等功能,对外提供串口电平。

报告要求:选定单片机和所有器件具体型号,报告需有设计过程、原理图、程序

流程图和源程序。

功能分析:针对大多数单片机都只有一个串口的局限,在多数情况下限制它们

的应用。利用单片机串口扩展技术,以MCS51系列单片机8751为例进行串

行接口扩展,包括扩展两个独立的串口、一点对多点分时串口、单片机与

RS232/RS422/RS485的串行通信接口。实际应用证明,设计可靠,稳定性好。

用多种方法进行串口扩展,解决了单片机在串行通信系统中的串口局限问题。

关键词:单片机;串行接口;串口扩展;串行通信

引言

随着单片机技术的不断发展,特别是网络技术在测控领域的广泛应用,由

单片机构成的多机网络测控系统已成为单片机技术发展的一个方向。单片机的

应用已不仅仅局限于传统意义上的自动监测或控制[1],而形成了向以网络为核

心的分布式多点系统发展的趋势[2]。大多数单片机都只有一个串行接口,在

多数情况下限制了这些单片机的进一步应用。要实现单片机在应用系统中的有

效通信,就必须利用单片机的串口扩展技术对单片机进行串口扩展。单片机

串口扩展是根据应用系统设计的需要,把一个串口扩展为多个同类型的串口或

一个串口扩展为多个不同类型(RS232/RS422/RS458)的串口,或扩展两个独

立的串口,以便与不同接口的计算机或设备进行串行通信。

1单片机串口扩展的硬件总体设计

单片机与PC机或外设的串行通信一般采用RS232/RS422/RS485总线标准接

口[3]。为保证通信可靠,在选择接口时必须注意通信的速率、通信距离、

抗干扰能

力、电平匹配和通信方式[4]。本文为了解决在单片机串行通信时遇到的串口

问题,以MCS51系列单片机8751为例,进行串口扩展,其串口扩展的逻辑

框图如图1所

示,包括通过通信接口芯片8251再扩展一个独立串口,通过161的多路

切换器CD4067实现一点对多点分时串口通信,以及通过电平转换

器MAX232,MAX488,MAX485实现单片机与不同类型接口

RS232/RS422/RS458的计算机或设备的串行通信。

图1单片机串口扩展的逻辑框图

2早操健身操 两个独立串口扩展的电路设计

在单片机应用系统设计中,有时需要两个独立的全双工串口进行通信,但

CPU8751只有一个串口,要扩展另一个独立的串口,可通过8751的P0扩

展可编程通信接口芯

片Intel8251完成[5],采用中断方式,因为它能更大限度地提高资源的利用

率,使CPU8751在不进行数据通信时做其它的工作。当有发送/接收请求

时,即TxRDY/RxRDY=1,向8751的INTO请求中断,其电路设计如

图2所示,允许使用19200波特的传送速率与外界通信。考虑到8251在

异步通信方式时,输入时钟频率CLK必须大于接收时钟频率RxCLK和发送

时钟频率TxCLK的415倍,RxCLK和TxCLK是波特率的1、16或32倍。

要由CLK分频得到需要的Rx2CLK和TxCLK,但不同的波特率对应分频

倍数不同,要由硬件完成不同分频倍数是很复杂的,这里选用可编程芯片计

数/定时器Intel8253来完成,只需根据不同情况改变计数初值。如果要8253

工作在方式3即方波速率发生器,对应的门控位GATE要为高电平,因而用

8751的P11=0的状

态来启动通道工作,要求初始化时系统禁止通信,由于单片机各端口复位

后处于高电平状态,所以P11端加一非门。当8253的计数频率为118432

MHz、工作在方式3、RxCLK

和TxCLK是波特率的16倍时,表1给出了常用波特率时8253的计数初

值和8251时钟信号RxCLK和TxCLK的关系,并且8253计数初值为偶数,

能较好满足要求。

图28751的另一个全双工串口的电路设计图

3一点对多点分时串行通信的扩展电路设计

为了实现1对16点分时串行通信,两片CD4067的OUT端分别接至8751

串口的发送端TXD和接收端RXD,以便完成串口的16选1,CD4067的

A、B、C、D

接8751的P0通过锁存器出来的低4位地址A0-A3,INH脚接系统的一个片

选信号CS,当CS有效时,INH脚为低电平,即启动CD4067工作。

4单片机与不同类型串口的通信扩展电路的设计

单片机CPU8751的串口是TTL电平,要实现8751与不同类型串口进行

通信,需要用电平转换器完成不同类型串口的转换,才能成功进行通信。下面

对单片机8751与RS232/RS422/RS485的串行通信进行接口扩展。

单片机8751有一个全双工串口,如果要完成CPU8751

与RS232接口的外设进行串行通信,比如CPU8751与PC机

通信(RS232接口),两者之间必须有一个电平转换电路。采用电平转换器

MCl488和MCl489能完成TTL电平与RS232转换,即TTL电平

通过MCl488转换成RS232电平,RS232电平通过MCl489转换成TTL电

平,但设计电路的不便之处是需要12V电压,并且功耗较大,不适合用

于低功耗的系统。因此,可以采用ICL232系列产品中的MAX232芯片,它

是集RS232串行接口发送器/接收器一体化的产品,只需+5V单一直流电

源供电,驱动能力强。MAX232芯片内置两个TTL到RS232和两个

RS232到TTL驱动电路,即具有两个发送器和两个接收器,只需外置4个

011F电容以供内部电路产生RS232电压。MAX232的发送器的发送输入为

T1IN/T2IN,发送输出为T1OUT/T2OUT;接收器的接收输入为

R1IN/R2IN,接收输出为R1OUT/R2OUT。RS232接口也普遍使

用9芯插头座,在许多场合下仅将发送端TXD数据和接收端RXD交叉

连接,加上信号地GND共使用三根线,单片机8751与RS232接口的串

行通信电路如图3所示,图中只给出了一路TTL电平接口到RS232电平接

口的串行通信植树节的意义 电路设计。

图3单片机8751与RS232接口的串行通信电路图

RS422/RS485传输方式与RS232的不同,RS232传输采用非平衡模式,因

此,共模噪声会耦合到信号系统中,其标准建议的最大通信距离为15m,

而RS422/RS485数据信号采用差分传输方式,也称平衡传输,具有一定

的抗共模干扰能力,最大通信距离为1200m。RS422/RS485比RS232抗

干扰能力强,较适合于远距离通信。RS422以全双工方式通信,

MAX488是一种RS422接口芯片,适用于RS422的低功率收发器。片内

包括一个发送器和一个接收器,它采用单一的+5V供电,应用方便。

MAX488的发送器的发送输入为DI,正发送输出为Y,负发送输出为Z;接

收器的正接收输入为A,负接收输入为B,接收输出为RO,通信时主机的

发送两线Y/Z连接到从机的接收两线A/B,从机的发送两线Y/Z连接到

主机的接收两线A/B。单片机8751与RS422接口的串行通信电路如图4所

示。

图4单片机8751与RS422接口的串行通信电路图

RS485是RS422的变型,不同之处只是RS485采用半双工方式通信,MAX485是

RS485使用的一种接口芯片,MAX穿的英语 485的发送/接收转换器是由使能端和DE控

制。当RE和DE都为0时,MAX485处于接收状态;RE和DE都为1时,

MAX485处于发送状态。在上电复位时,由于硬件电路稳定需要一定的时间,并且单

片机各端口复位后处于高电平状态,这样就会使总线上各个分机处于发送状态,加上上

电时各电路的不稳定,可能向总线发送信息。因此,如果用单片机的一根口线P10连接

到发送和接收控制信号RE和DE端,应将口线反向后接入MAX485的控制端,使上

电时MAX485处于接收状态。MAX485的发送器的发送输入为DI,接收器的接收输

出为RO,单片机8751与RS485接口的串行通信电路如图5所示。RS485总线中的

发送和接收信号共用一对总线A/B,在总线末端接一个匹配电阻,当总线上没

有信号传输时,总线处于悬浮状态,容易受干扰信号的影响,将总线上差分信号的

正端A和负端B间接一个12K的匹配电阻,吸收总线上的反射信号,保证正常传

输信号干净、无毛刺。即使有干扰信号,却很难产生串行通信的起始信号0,从而增

加了总线抗干扰的能力。

图5单片机8751与RS485接口的串行通信电路图

程序:

1、中断源修改

#defineSYSINTR_SERIAL1(SYSINTR_FIRMWARE+19)

修改以下中断范围使之能包含这个新添加的中断。

MapIrq2SysIntr(DWORD_Irq)

{

if(_Irq<=19)

return(SYSINTR_FIRMWARE+_Irq);

el

ret萝卜炖牛腩 urn(0xffffffff);

}

//19这个数字根据您的系统而定,并且需要和注册表相匹配。

这里,我们可以看到SYSINTR_SERIAL1定义到16+19=35=0x23,与注册表中

一致。

2、打开串口源文件中r2410_hw.c文件。这个文件修改了数据结构根据注册表

中的配置情况进行端口匹配。

搜索:

S2410_SetSerialIOP(

PVOIDpHead//@parmpointstodevicehead

)

将其函数改为:

{

PS2410_UART_INFOpHWHead=(PS2410_UART_INFO)pHead;

PSER_INFOpHWHead1=(PSER_INFO)pHead;

RETAILMSG(DEBUGMODE,(TEXT("S2410_SetSerialIOPrn")));

if(pHWHead1->dwIOBa==0x50004000)

{

#ifUSEVIRTUAL

EnterCriticalSection(&(pHWHead->RegCritSec));

v_pIOPregs->rGPHCON&=~(0x3<<8|0x3<<10/*|0x3<<12|0x3<<14*/);//

clear

uart1-rx,tx

v_pIOPregs->rGPHCON|=(0x2<<8|0x2<<10/*|0x1<<12|0x0<<14*/);

v_pIOPregs->rGPHCON|=(0x2<<0|0x2<<2);

v_pIOPregs->rGPHUP|=0x03;

pHWHead->rDTRport=(volatileunsignedint*)&(v_pIOPregs->rGPHDAT);

pHWHead->rDSRport=(volatileunsignedint*)&(v_pIOPregs->rGPHDAT);

pHWHead->DtrPortNum=0;

pHWHead->DsrPortNum=1;

#el

volatileIOPreg*s2410IOP;

s2410IOP=(volatileIOPreg*)IOP_BASE;

EnterCriticalSection(&(pHWHead->RegCritSec));

s2410IOP->rGPHCON&=~(0x3<<8|0x3<<10/*|0x3<<12|0x3<<14*/);//

clear

uart1-rx,tx

s2410IOP->rGPHCON|=(0x2<<8|0x2<<10/*|0x1<<12|0x0<<14*/);

s2410IOP->rGPHCON|=(0x2<<0|0x2<<2);

s2410IOP->rGPHUP|=0x03;

pHWHead->rDTRport=(volatileunsignedint*)(IOP_BASE+0x74);

//s2410IOP->rGPHDAT

pHWHead->rDSRport=(volatileunsignedint*)(IOP_BASE+0x74);

pHWHead->DtrPortNum=0;

pHWHead->DsrPortNum=1;

#endif

}

elif(pHWHead1->dwIOBa==0x50008000)

{

#ifUSEVIRTUAL

EnterCriticalSection(&(pHWHead->RegCritSec));

v_pIOPregs->rGPHCON&=~(0x3<<12|0x3<<14);//clearuart2-rx,tx

v_pIOPregs->rGPHCON|=(0x2<<12|0x2<<14);

v_pIOPregs->rGPHCON|=(0x2<<0|0x2<<2);

v_pIOPregs->rGPHUP&=~0xc0;

pHWHead->rDTRport=(volatileunsignedint*)&(v_pIOPregs->rGPHDAT);

pHWHead->rDSRport=(volatileunsignedint*)&(v_pIOPregs->rGPHDAT);

pHWHead->DtrPortNum=0;

pHWHead->DsrPortNum=1;

#el

volatileIOPreg*s2410IOP;

s2410IOP=(volatileIOPreg*)IOP_BASE;

EnterCriticalSection(&(pHWHead->RegCritSec));

s2410IOP->rGPHCON&=~(0x3<<12|0x3<<14);//clearuart2-rx,tx

s2410IOP->rGPHCON|=(0x02<<12|0x02<<14);

s2410IOP->rGPHCON|=(0x2<<0|0x2<<2);

s2410IOP->rGPHUP&=~0xc0;

pHWHead->rDTRport=(volatileunsignedint*)(IOP_BASE+0x74);

//s2410IOP->rGPHDAT

pHWHead->rDSRport=(volatileunsignedint*)(IOP_BASE+0x74);

pHWHead->DtrPortNum=0;

pHWHead->DsrPortNum=1;

#endif

}

el

{

#ifUSEVIRTUAL

EnterCriticalSection(&(pHWHead->RegCritSec));

v_pIOPregs->rGPHCON&=~(0x3<<0|0x3<<2|0x3<<4|0x3<<6/*|0x3<<12|

0x3<<14*/);//clearuart0-rx,tx

v_pIOPregs->rGPHCON|=(0x2<<4|0x2<<6/*|0x1<<12|0x0<<14*/);

v_pIOPregs->rGPHCON|=(0x2<<0|0x2<<2);

v_pIOPregs->rGPHUP|=0x03;

pHWHead->rDTRport=(volatileunsignedint*)&(v_pIOPregs->rGPHDAT);

pHWHead->rDSRport=(volatileunsignedint*)&(v_pIOPregs->rGPHDAT);

pHWHead->DtrPortNum=0;

pHWHead->DsrPortNum=1;

#el

volatileIOPreg*s2410IOP;

s2410IOP=(volatileIOPreg*)IOP_BASE;

EnterCriticalSection(&(pHWHead->RegCritSec));

s2410IOP->rGPHCON&=~(0x3<<0|0x3<<2|0x3<<4|0x3<<6/*|0x3<<12|

0x3<<14*/);//clearuart0-rx,tx

s2410IOP->rGPHCON|=(0x2<<4|0x2<<6/*|0x1<<12|0x0<<14*/);

s2410IOP->rGPHCON|=(0x2<<0|0x2<<2);

s2410IOP->rGPHUP|=0x03;

pHWHead->rDTRport=(volatileunsignedint*)(IOP_BASE+0x74);

//s2410IOP->rGPHDAT

pHWHead->rDSRport=(volatileunsignedint*)(IOP_BASE+0x74);

pHWHead->DtrPortNum=0;

pHWHead->DsrPortNum=1;

#endif

}

LeaveCriticalSection(&(pHWHead->RegCritSec));

}

接着搜索:

SL_Init(

PVOIDpHead,//@parmpointstodevicehead

PUCHARpRegBa,//Pointerto16550registerba

UINT8RegStride,//Strideamongstthe16550registers

EVENT_FUNCEventCallback,//ThiscallbackexistsinMDD

PVOIDpMddHead,//Thisisthefirstparmtocallback

PLOOKUP_TBLpBaudTable//BaudRateTable

)

在PS2410_UART_INFOpHWHead=(PS2410_UART_INFO)pHead;这一句

后面添加:

PSER_INFOpHWHead1=(PSER_INFO)pHead;

再搜索:

if(pHWHead->UIrDA)

{

pHWHead->pUFTXH=(volatileunsignedchar*)&(v_pUART2regs->rUTXH);

pHWHead->pUFRXH=(volatileunsignedchar*)&(v_pUART2regs->rURXH);

}

el

{

把这其中的代码修改为以下代码

}

if(pHWHead1->dwIOBa==0x50004000)

{

pHWHead->pUFTXH=(volatileunsignedchar

*)&(v_pUART1regs->rUTXH);

pHWHead->pUFRXH=(volatileunsignedchar

*)&(v_pUART1regs->rURXH);

}

elif(pHWHead1->dwIOBa==0x50008000)

{

pHWHead->pUFTXH=(volatileunsignedchar

*)&(v_pUART2regs->rUTXH);

pHWHead->pUFRXH=(volatileunsignedchar

*)&(v_pUART2regs->rURXH);

}

el

{

pHWHead->pUFTXH=(volatileunsignedchar

*)&(v_pUART0regs->rUTXH);

pHWHead->pUFRXH=(volatileunsignedchar

*)&(v_pUART0regs->rURXH);

}

3、打开r2410_r.c文件。

搜索:

constHWOBJIoObj={

THREAD_AT_INIT,

SYSINTR_SERIAL,

(PHW_VTBL)&IoVTbl

};

在其后面添加:

constHWOBJIo1Obj={

THREAD_AT_INIT,

SYSINTR_SERIAL1,

(PHW_VTBL)&IoVTbl

};

constHWOBJIo2Obj={

THREAD_AT_INIT,

SYSINTR_IR,

(PHW_VTBL)&IoVTbl

};

接着搜索:

constPCHWOBJHWObjects[]={

&IoObj,

&IrObj

};

将其修改为:

constPCHWOBJHWObjects[]={

&IoObj,

&Io1Obj,

&Io2Obj

};

再搜索:

GetSerialObject(

DWORDDeviceArrayIndex

)

将其函数改为:

{

PHWOBJpSerObj;

DEBUGMSG(DEBUGMODE,(TEXT("GetSerialObject:DeviceArrayIndex

=%drn"),

DeviceArrayIndex));

//NowreturnthisstructuretotheMDD.

if(DeviceArrayIndex==2)

{

RETAILMSG(1,(TEXT("GetSerialObjectIo2Objrn")));

pSerObj=(PHWOBJ)(&Io2Obj);

}

elif(DeviceArrayIndex==1)

pSerObj=(PHWOBJ)(&Io1Obj);

el

pSerObj=(PHWOBJ)(&IoObj);

return(pSerObj);

}

4、打开cfw.c文件,这就是中断处理。

搜索:

BOOL

OEMInterruptEnable(DWORDidInt,//@

InterruptID'uptID's>foralistofpossblevalues.

LPVOIDpvData,//@parmptrtodatapasdininthe

InterruptInitialize>call

DWORDcbData)//@parmSizeofdatapointedtobe

pvData>

找到这一句:caSYSINTR_SERIAL:

在其后面添加:

caSYSINTR_SERIAL1://Serialport1.

s2410INT->rSUBSRCPND=(INTSUB_RXD1|INTSUB_TXD1|

INTSUB_ERR1);

s2410INT->rINTSUBMSK&=~INTSUB_RXD1;

s2410INT->rINTSUBMSK&=~INTSUB_TXD1;

s2410INT->rINTSUBMSK&=~INTSUB_ERR1;

s2410INT->rSRCPND=BIT_UART1;

//S3C2410XDeveloperNotice(page4)warnsagainstwritinga1toa0bitin

theINTPNDregister.

if(s2410INT->rINTPND&BIT_UART1)s2410INT->rINTPND=BIT_UART1;

s2410INT->rINTMSK&=~BIT_UART1;

break;

搜索:

void

OEMInterruptDone(DWORDidInt)//@

依旧找到caSYSINTR_SERIAL:

在其后面添加:

caSYSINTR_SERIAL1:

s2410INT->rINTMSK&=~BIT_UART1;

s2410INT->rINTSUBMSK&=~INTSUB_RXD1;

break;

5、打开armint.c文件。

搜索:elif(IntPendVal==INTSRC_UART0)

在其后面添加:

elif(IntPendVal==INTSRC_UART1)

{

SubIntPendVal=s2410INT->rSUBSRCPND;

//Notethatweonlymaskthesubsourceinterrupt-therialdriverwill

clearthe

//subsourcependingregister.

//

if(SubIntPendVal&INTSUB_ERR1)

{

s2410INT->rINTSUBMSK|=INTSUB_ERR1;

}

elif(SubIntPendVal&INTSUB_RXD1)

{

s2410INT->rINTSUBMSK|=INTSUB_RXD1;

}

elif(SubIntPendVal&INTSUB_TXD1)

{

s2410INT->rINTSUBMSK|=INTSUB_TXD1;

}

el

{

return(SYSINTR_NOP);

}

//NOTE:Don'tclearINTSRC:UART1here-rialdriverdoesthat.

//

s2410INT->rINTMSK|=BIT_UART1;

if(s2410INT->rINTPND&BIT_UART1)s2410INT->rINTPND=

BIT_UART1;

return(SYSINTR_SERIAL1);

}

6、打开文件,这个是WinCE注册表文件,在这里,我们要修改并

添加串口。

搜索:[HKEY_LOCAL_MACHINEDriversBuiltInSER2410],这就是串口1。

将其下面的键值改为:

[HKEY_LOCAL_MACHINEDriversBuiltInSER2410]

"DeviceArrayIndex"=dword:0

"Irq"=dword:13

"IoBa"=dword:50000000

"IoLen"=dword:2C

"Prefix"="COM"

"Dll"=""

"Order"=dword:0

"Priority"=dword:0

"Port"="COM1:"

"DeviceType"=dword:0

"FriendlyName"="SerialCableonCOM1:"

"Tsp"=""

"DevConfig"=hex:10,00,00,00,05,00,00,00,10,01,00,00,00,4B,00,00,00,00,

08,00,00,00,00,00,00

再在其后面添加串口2:

[HKEY_LOCAL_MACHINEDriversBuiltInSER2410_2]

"DeviceArrayIndex"=dword:1

"Irq"=dword:23

"IoBa"=dword:50004000

"IoLen"=dword:2C镜花缘作者

"Prefix"="COM"

"Dll"=""

"Order"=dword:1

"Priority"=dword:0

"Port"="COM2:"

"DeviceType"=dword:0

"FriendlyName"="SerialCableonCOM2:"

"Tsp"=""

"DevConfig"=hex:10,00,00,00,05,00,00,00,10,01,00,00,00,4B,00,00,00,00,

08,00,00,00,00,00,00

[HKEY_LOCAL_MACHINEDriversBuiltInSER2410_2Unimodem]

"Tsp"=""

"DeviceType"=dword:0

"FriendlyName"="SER2410_2UNIMODEM"

"DevConfig"=hex:10,00,00,00,05,00,00,00,10,01,00,00,00,4B,00,00,00,00,

08,00,00,00,00,00,00

再搜索:[HKEY_LOCAL_MACHINEDriversBuiltInIRDA2410],这个是红外,

也要修改下:

[HKEY_LOCAL_MACHINEDriversBuiltInIRDA2410]

"DeviceArrayIndex"=dword:2

"Irq"=dworc盘如何扩容 d:19

"IoBa"=dword:50008000

"IoLen"=dword:2C

"Prefix"="COM"

"Dll"=""

"Order"=dword:0

"Priority"=dword:0

"Port"="COM3:"

"DeviceType"=dword:0;IRDAmodem,0->nullmodem

"FriendlyName"="S2410IRDA2410"

"Index"=dword:2

"IClass"="{A32942B7-920C-486b-B0E6-92A702A99B35}"

1、中断源修改

#defineSYSINTR_SERIAL1(SYSINTR_FIRMWARE+19)

修改以下中断范围使之能包含这个新添加的中断。

MapIrq2SysIntr(DWORD_Irq)

{

if(_Irq<=19)

return(SYSINTR_FIRMWARE+_Irq);

el

return(0xffffffff);

}

//19这个数字根据您的系统而定,并且需要和注册表相匹配。

这里,我们可以看到SYSINTR_SERIAL1定义到16+19=35=0x23,与注册表中

一致。

2、打开串口源文件中r2410_hw.c文件。这个文件修改了数据结构根据注册表

中的配置情况进行端口匹配。

搜索:

S2410_SetSerialIOP(

PVOIDpHead//@parmpointstodevicehead

)

将其函数改为:

{

PS2410_UART_INFOpHWHead=(PS2410_UART_INFO)pHead;

PSER_INFOpHWHead1=(PSER_INFO)pHead;

RETAILMSG(DEBUGMODE,(TEXT("S2410_SetSerialIOPrn")));

if(pHWHead1->dwIOBa==0x50004000)

{

#ifUSEVIRTUAL

EnterCriticalSection(&(pHWHead->RegCritSec));

v_pIOPregs->rGPHCON&=~(0x3<<8|0x3<<10/*|0x3<<12|0x3<<14*/);//

clear

uart1-rx,tx

v_pIOPregs->rGPHCON|=(0x2<<8|0x2<<10/*|0x1<<12|0x0<<14*/);

v_pIOPregs->rGPHCON|=(0x2<<0|0x2<<2);

v_pIOPregs->rGPHUP|=0x03;

pHWHead->rDTRport=(volatileunsignedint*)&(v_pIOPregs->rGPHDAT);

pHWHead->rDSRport=(volatileunsignedint*)&(v_pIOPregs->rGPHDAT);

pHWHead->DtrPortNum=0;

pHWHead->DsrPortNum=1;

#el

volatileIOPreg*s2410IOP;

s2410IOP=(volatileIOPreg*)IOP_BASE;

EnterCriticalSection(&(pHWHead->RegCritSec));

s2410IOP->rGPHCON&=~(0x3<<8|0x3<<10/*|0x3<<12|0x3<<14*/);//

clear

uart1-rx,tx

s2410IOP->rGPHCON|=(0x2<<8|0x2<<10/*|0x1<<12|0x0<<14*/);

s2410IOP->rGPHCON|=(0x2<<0|0x2<<2);

s2410IOP->rGPHUP|=0x03;

pHWHead->rDTRport=(volatileunsignedint*)(IOP_BASE+0x74);

//s2410IOP->rGPHDAT

pHWHead->rDSRport=(volatileunsignedint*)(IOP_BASE+0x74);

pHWHead->DtrPortNum=0;

pHWHead->DsrPortNum=1;

#endif

}

elif(pHWHead1->dwIOBa==0x50008000)

{

#ifUSEVIRTUAL

EnterCriticalSection(&(pHWHead->RegCritSec));

v_pIOPregs->rGPHCON&=~(0x3<<12|0x3<<14);//clearuart2-rx,tx

v_pIOPregs->rGPHCON|=(0x2<<12|0x2<<14);

v_pIOPregs->rGPHCON|=(0x2<<0|0x2<<2);

v_pIOPregs->rGPHUP&=~0xc0;

pHWHead->rDTRport=(volatileunsignedint*)&(v_pIOPregs->rGPHDAT);

pHWHead->rDSRport=(volatileunsignedint*)&(v_pIOPregs->rGPHDAT);

pHWHead->DtrPortNum=0;

pHWHead->DsrPortNum=1;

#el

volatileIOPreg*s2410IOP;

s2410IOP=(volatileIOPreg*)IOP_BASE;

EnterCriticalSection(&(pHWHead->RegCritSec));

s2410IOP->rGPHCON&=~(0x3<<12|0x3<<14);//clearuart2-rx,tx

s2410IOP->rGPHCON|=(0x02<<12|0x02<<14);

s2410IOP->rGPHCON|=(0x2<<0|0x2<<2);

s2410IOP->rGPHUP&=~0xc0;

pHWHead->rDTRport=(volatileunsignedint*)(IOP_BASE+0x74);

//s2410IOP->rGPHDAT

pHWHead->rDSRport=(volatileunsignedint*)(IOP_BASE+0x74);

pHWHead->DtrPortNum=0;

pHWHead->DsrPortNum=1;

#endif

}

el

{

#ifUSEVIRTUAL

EnterCriticalSection(&(pHWHead->RegCritSec));

v_pIOPregs->rGPHCON&=~(0x3<<0|0x3<<2|0x3<<4|0x3<<6/*|0x3<<12|

0x3<<14*/);//clearuart0-rx,tx

v_pIOPregs->rGPHCON|=(0x2<<4|0x2<<6/*|0x1<<12|0x0<<14*/);

v_pIOPregs->rGPHCON|=(0x2<<0|0x2<<2);

v_pIOPregs->rGPHUP|=0x03;

pHWHead->rDTRport=(volatileunsignedint*)&(v_pIOPregs->rGPHDAT);

pHWHead->rDSRport=(volatileunsignedint*)&(v_pIOPregs->rGPHDAT);

pHWHead->DtrPortNum=0;

pHWHead->DsrPortNum=1;

#el

volatileIOPreg*s2410IOP;

s2410IOP=(volatileIOPreg*)IOP_BASE;

EnterCriticalSection(&(pHWHead->RegCritSec));

s2410IOP->rGPHCON&=~(0x3<<0|0x3<<2|0x3<<4|0x3<<6/*|0x3<<12|

0x3<<14*/);//clearuart0-rx,tx

s2410IOP->rGPHCON|=(0x2<<4|0x2<<6/*|0x1<<12|0x0<<14*/);

s2410IOP->rGPHCON|=(0x2<<0|0x2<<2);

s2410IOP->rGPHUP|=0x03;

pHWHead->rDTRport=(volatileunsignedint*)(IOP_BASE+0x74);

//s2410IOP->rGPHDAT

pHWHead->rDSRport=(volatileunsignedint*)(IOP_BASE+0x74);

pHWHead->DtrPortNum=0;

pHWHead->DsrPortNum=1;

#endif

}

LeaveCriticalSection(&(pHWHead->RegCritSec));

}

接着搜索:

SL_Init(

PVOIDpHead,//@parmpointstodevicehead

PUCHARpRegBa,//Pointerto16550registerba

UINT8RegStride,//Strideamongstthe16550registers

EVENT_FUNCEventCallback,//ThiscallbackexistsinMDD

PVOIDpMddHead,//Thisisthefirstparmtocallback

PLOOKUP_TBLpBaudTable//BaudRateTable

)

在PS2410_UART_INFOpHWHead=(PS2410_UART_INFO)pHead;这一句

后面添加:

PSER_INFOpHWHead1=(PSER_INFO)pHead;

再搜索:

if(pHWHead->UIrDA)

{

pHWHead->pUFTXH=(volatileunsignedchar*)&(v_pUART2regs->rUTXH);

pHWHead->pUFRXH=(volatileunsignedchar*)&(v_pUART2regs->rURXH);

}

el

{

把这其中的代码修改为以下代码

}

if(pHWHead1->dwIOBa==0x50004000)

{

pHWHead->pUFTXH=(volatileunsignedchar

*)&(v_pUART1regs->rUTXH);

pHWHead->pUFRXH=(volatileunsignedchar

*)&(v_pUART1regs->rURXH);

}

elif(pHWHead1->dwIOBa==0x50008000)

{

pHWHead->pUFTXH=(volatileunsignedchar

*)&(v_pUART2regs->rUTXH);

pHWHead->pUFRXH=(volatileunsignedchar

*)&(v_pUART2regs->rURXH);

}

el

{

pHWHead->pUFTXH=(volatileunsignedchar

*)&(v_pUART0regs->rUTXH);

pHWHead->pUFRXH=(volatileunsignedchar

*)&(v_pUART0regs->rURXH);

}

3、打开r2410_r.c文件。

搜索:

constHWOBJIoObj={

THREAD_AT_INIT,

SYSINTR_SERIAL,

(PHW_VTBL)&IoVTbl

};

在其后面添加:

constHWOBJIo1Obj={

THREAD_AT_INIT,

SYSINTR_SERIAL1,

(PHW_VTBL)&IoVTbl

};

constHWOBJIo2Obj={

THREAD_AT_INIT,

SYSINTR_IR,

(PHW_VTBL)&IoVTbl

};

接着搜索:

constPCHWOBJHWObjects[]={

&IoObj,

&IrObj

};

将其修改为:

constPCHWOBJHWObjects[]={

&IoObj,

&Io1Obj,

&Io2Obj

};

再搜索:

GetSerialObject(

DWORDDeviceArrayIndex

)

将其函数改为:

{

PHWOBJpSerObj;

DEBUGMSG(DEBUGMODE,(TEXT("GetSerialObject:DeviceArrayIndex

=%drn"),

DeviceArrayIndex));

//NowreturnthisstructuretotheMDD.

if(DeviceArrayIndex==2)

{

RETAILMSG(1,(TEXT("GetSerialObjectIo2Objrn")));

pSerObj=(PHWOBJ)(&Io2Obj);

}

elif(DeviceArrayIndex==1)

pSerObj=(PHWOBJ)(&Io1Obj);

el

pSerObj=(PHWOBJ)(&IoObj);

return(pSerObj);

}

4、打开cfw.c文件,这就是中断处理。

搜索:

BOOL

OEMInterruptEnable(DWORDidInt,//@

InterruptID'uptID's>foralistofpossblevalues.

LPVOIDpvData,//@parmptrtodatapasdininthe

InterruptInitialize>call

DWORDcbData)//@parmSizeofdatapointedtobe

pvData>

找到这一句:caSYSINTR_SERIAL:

在其后面添加:

caSYSINTR_SERIAL1://Serialport1.

s2410INT->rSUBSRCPND=(INTSUB_RXD1|INTSUB_TXD1|

INTSUB_ERR1);

s2410INT->rINTSUBMSK&=~INTSUB_RXD1;

s2410INT->rINTSUBMSK&=~INTSUB_TXD1;

s2410INT->rINTSUBMSK&=~INTSUB_ERR1;

s2410INT->rSRCPND=BIT_UART1;

//S3C2410XDeveloperNotice(page4)warnsagainstwritinga1toa0bitin

theINTPNDregister.

if(s2410INT->rINTPND&BIT_UART1)s2410INT->rINTPND=BIT_UART1;

s2410INT->rINTMSK&=~BIT_UART1;

break;

搜索:

void

OEMInterruptDisable(DWORDidInt)//@

InterruptID's>

还是这一句:caSYSINTR_SERIAL:

在其后面添加:

caSYSINTR_SERIAL1:

s2410INT->rINTMSK|=BIT_UART1;

s2410INT->rINTSUBMSK|=INTSUB_RXD1;

s2410INT->rINTSUBMSK|=INTSUB_TXD1;

s2410INT->rINTSUBMSK|=INTSUB_ERR1;

break;

搜索:

void

OEMInterruptDone(DWORDidInt)//@

依旧找到caSYSINTR_SERIAL:

在其后面添加:

caSYSINTR_SERIAL1:

s2410INT->rINTMSK&=~BIT_UART1;

s2410INT->rINTSUBMSK&=~INTSUB_RXD1;

break;

5、打开armint.c文件。

搜索:elif(IntPendVal==INTSRC_UART0)

在其后面添加:

elif(IntPendVal==INTSRC_UART1)

{

SubIntPendVal=s2410INT->rSUBSRCPND;

//Notethatweonlymaskthesubsourceinterrupt-therialdriverwill

clearthe

//subsourcependingregister.

//

if(SubIntPendVal&INTSUB_ERR1)

{

s2410INT->rINTSUBMSK|=INTSUB_ERR1;

}

elif(SubIntPendVal&INTSUB_RXD1)

{

s2410INT->rINTSUBMSK|=INTSUB_RXD1;

}

elif(SubIntPendVal&INTSUB_TXD1)

{

s2410INT->rINTSUBMSK|=INTSUB_TXD1;

}

el

{

return(SYSINTR_NOP);

}

//NOTE:Don'tclearINTSRC:UART1here-rialdriverdoesthat.

//

s2410INT->rINTMSK|=BIT_UART1;

if(s2410INT->rINTPND&BIT_UART1)s2410INT->rINTPND=

BIT_UART1;

return(SYSINTR_SERIAL1);

}

6、打开文件,这个是WinCE注册表文件,在这里,我们要修改并

添加串口。

搜索:[HKEY_LOCAL_MACHINEDriversBuiltInSER2410],这就是串口1。

将其下面的键值改为:

[HKEY_LOCAL_MACHINEDriversBuiltInSER2410]

"DeviceArrayIndex"=dword:0

"Irq"=dword:13

"IoBa"=dword:50000000

"IoLen"=dword:2C

"Prefix"="COM"

"Dll"=""

"Order"=dword:0

"Priority"=dword:0

"Port"="COM1:"

"DeviceType"=dword:0

"FriendlyName"="SerialCableonCOM1:"

"Tsp"=""

"DevConfig"=hex:10,00,00,00,05,00,00,00,10,01,00,00,00,4B,00,00,00,00,

08,00,00,00,00,00,00

再在其后面添加串口2:

[HKEY_LOCAL_MACHINEDriversBuiltInSER2410怎么解除手机安全模式 _2]

"DeviceArrayIndex"=dword:1

"Irq"=dword:23

"IoBa"=dword:50004000

"IoLen"=dword:2C

"Prefix"="COM"

"Dll"=""

"Order"=dword:1

"Priority"=dword:0

"Port"="COM2:"

"DeviceType"=dword:0

"FriendlyName"="SerialCableonCOM2:"

"Tsp"=""

"DevConfig"=hex:10,00,00,00,05,00,00,00,10,01,00,00,00,4B,00,00,00,00,

08,00,00,00,00,00,00

[HKEY_LOCAL_MACHINEDriversBuiltInSER2410_2Unimodem]

"Tsp"=""

"DeviceType"=dword:0

"FriendlyName"="SER2410_2UNIMODEM"

"DevConfig"=hex:10,00,00,00,05,00,00,00,10,01,00,00,00,4B,00,00,00,00,

08,00,00,00,00,00,00

再搜索:[HKEY_LOCAL_MACHINEDriversBuiltInIRDA2410],这个是红外,

也要修改下:

[HKEY_LOCAL_MACHINEDriversBuiltInIRDA2410]

"DeviceArrayIndex"=dword:2

"Irq"=dword:19

"IoBa"=dword:50008000

"IoLen"=dword:2C

"Prefix"="COM"

"Dll"=""

"Order"=dword:0

"Priority"=dword:0

"Port"="COM3:"

"DeviceType"=dword:0;IRDAmodem,0->nullmodem

"FriendlyName"="S2410IRDA2410"

"Index"=dword:2

"IClass"="{A32942B7-920C-486b-B0E6-92A702A99B35}"

原理图:

RS-232-C:也称标准串口,是目前最常用的一种串行通讯接口。它是在1970

年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机

终端生产厂家共同制定的用于串行通讯的标准。它的全名

是“数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交

换接口技术标准”。传统的RS-232-C接口标准有25根信号线,采用标准

25芯D型插头座。后来的PC上使用简化了的9芯D型插座。现在应用中

25芯插头座已很少采用。现在的台式电脑一般有两个串行口:COM1和COM2,

从设备管理器的端口列表中就可以看到。硬件表现为计算机后面的9针D

形接口,由于其形状和针脚数量的原因,其接头又被称为DB9接头。现在

有很多手机数据线或者物流接收器都采用COM口与计算机相连,很多投影

机,液晶电视等设备都具有了此接口,厂家也常常会提供控制协议,便于

在控制方面实现编程受控,现在越来越多的智能会议室和家居建设都采用

了中央控制设备对多种受控设备的串口控制方式。

RS-232针脚定义:

1CD←CarrierDetect载波检测

2RXD←ReceiveData接收数据

3TXD→TransmitData发送数据

4DTR→DataTerminalReady数据终端就绪

5GND—SystemGround系统接地

6DSR←DataSetReady数据设备就绪

7RTS→RequestToSend请求发送

8CTS←ClearToSend允许发送

9RI←RingIndicator金属外壳接地

RS-422:为改进RS-232通信距离短、速率低的缺点,RS-422定义了一

种平衡通信接口,将传输速率提高到10Mb/s,传输距离延长到4000英尺(速

率低于100kb/s时),并允许在一条平衡总线上连接最多10个接收器。

RS-422是一种单机发送、多机接收的单向、平衡传输规范,被命名为

TIA/EIA-422-A标准。

RS-485:为扩展应用范围,EIA又于1983年在RS-422基础上制定了

RS-485标准,增加了多点、双向通信能力,即允许多个发送器连接到同一

条总线上,同时增加了发送器的驱动能力和冲突保护特性,扩展了总线共

模范围,后命名为TIA/EIA-485-A标准。

编辑本段串口的优点

串口形容一下就是一条车道,而并口就是有8个车道同一时刻能传送8

位(一个字节)数据。

但并口不比串口快,由于8位通道之不正当竞争行为 间的互相干扰。传输时速度就受

到了限制。而且当传输出错时,要同时重新传8个位的数据。串口没有干

扰,传输出错后重发一位就可以了。所以要比并口快。串口硬盘就是这样

被人们重视的。

编辑本段扩展阅读

交换机串口

交换机的串口的英文就是trunk;是用来做下一跳路由转换用的.每个

VLAN只有通过与TRUNK的路由指向后才能上外网

RS232C串口通信接线方式?

首先,串口传输数据只要有接收数据针脚和发送针脚就能实现:同一

个串口的接收脚和发送脚直接用线相连,两个串口相连或一个串口和多个

串口相连

同一个串口的接收脚和发送脚直接用线相连对9针串口和25针串口,

均是2与3直接相连;

两个不同串口(不论是同一台计算机的两个串口或分别是不同计算机

的串口)

DB9-DB9

2-3,3-2,5-5

DB25-DB25

2-3,3-2,7-7

DB9-DB25

2-3,3-2,5-7

上面是对微机标准串行口而言的,还有许多非标准设备,如接收GPS

数据或电子罗盘数据,只要记住一个原则:接收数据针脚(或线)与发送

数据针脚(或线)相连,彼些交叉,信号地对应相接。[1][2]引脚说明:

PinNameDirDescription1DCD载波检测2RXDReceiveData接收

数据3TXDTransmitData发送数据4DTRDataTerminalReady数

据终端准备5GNDSystemGround接地6DSRDataSetReady数据准

备完成7RTSRequesttoSend请求发送8CTSCleartoSend清除

发送9RIRingIndicator振铃提示电脑主板上的串口:进行串行传输

的接口,它一次只能传输1Bit。串行端口可以用于连接外置调制解调器、

绘图仪或串行打印机。它也可以控制台连接的方式连接网络设备,例如路

由器和交换机,主要用来配置它们。

UniversalSerialBus

(通用串行总线)简称USB,是目前电脑上应用较广泛的接口规范,由

Intel、Microsoft、Compaq、IBM、NEC、NorthernTelcom等几家大厂商发

起的新型外设接口标准。USB接口是电脑主板上的一种四针接口,其中中间

两个针传输数据,两边两个针给外设供电。USB接口速度快、连接简单、不

需要外接电源,传输速度12Mbps,最新USB2.0可达480Mbps;电缆最大长

度5米,USB电缆有4条线,2条信号线,2条电源线,可提供5伏特电源,

USB电缆还分屏蔽和非屏蔽两种,屏蔽电缆传输速度可达12Mbps,价格较

贵,非屏蔽电缆速度为1.5Mbps,但价格便宜;USB通过串联方式最多可串

接127个设备;支持热插拔。

RJ-45接口

RJ-45接口是以太网最为常用的接口,RJ45是一个常用名称,指的是

由IEC(60)603-7标准化,使用由国际性的接插件标准定义的8个位置(8

针)的模块化插孔或者插头。

RS-232针脚定义:

1CD←CarrierDetect载波检测

2RXD←ReceiveData接收数据

3TXD→TransmitData发送数据

4DTR→DataTerminalReady数据终端就绪

5GND—SystemGround系统接地

6DSR←DataSetReady数据设备就绪

7RTS→RequestToSend请求发送

8CTS←ClearToSend允许发送

9RI←RingIndicator金属外壳接地

RS-422:为改进RS-232通信距离短、速率低的缺点,RS-422定义了一

种平衡通信接口,将传输速率提高到10Mb/s,传输距离延长到4000英尺(速

率低于100kb/s时),并允许在一条平衡总线上连接最多10个接收器。

RS-422是一种单机发送、多机接收的单向、平衡传输规范,被命名为

TIA/EIA-422-A标准。

RS-485:为扩展应用范围,EIA又于1983年在RS-422基础上制定了

RS-485标准,增加了多点、双向通信能力,即允许多个什么时候是情人节 发送器连接到同一

条总线上,同时增加了发送器的驱动能力和冲突保护特性,扩展了总线共

模范围,后命名为TIA/EIA-485-A标准。

串口扩展方案总结

在这里给大家介绍一下串口扩展的常用方法,希望会对有需要的朋友提供一点有

价值的参考信息。

串行接口设备凭借其控制灵活、接口简单、占用系统资源少等优点,被

广泛应用于工业控制、家庭安防、GPS卫星定位导航以及水、电、气表的抄表等

领域。在这些嵌入式系统中,可能会有很多从设备都通过串行接口与主机进行通

信,如GPRSMODEM、红外发送和接收模块、RS485总线接口等。这使得开发人员

常常面临嵌入式系统中主机串行通信接口不足的问题,针对此问题,本文介绍了

几种常见的解决方法。

软件模拟法

软件模拟法可根据串行通讯的传送格式,利用定时器和主机的I/O口来模拟

串行通讯的时序,以达到扩展串口的目的。接收过程中需要检测起始位,这可以

使用查询方式,或者,在端口具有中断功能的主机中也可以使用端口的中断进行

处理。接收和发送过程中,对定时的处理既可以使用查询方式也可以使用定时器

中断方式。为了确保数据的正确性,在接收过程中可以在检测异步传输的起始信

号处加上一些防干扰处理,如果是无线传输系统,在接收每个位时可以采用多次

采样。对于有线系统来说,1次采样就够了,你看IIC,SPI等,谁去进行了多

次采样。

如今软件模拟以其价格低廉,使用方便,已经成为一种潮流.但是不是所

有的单片机都适合用来进行串口的软件模拟的.软件模拟的方法一般有两种,一

种是读写I/O,另外一种是读写端口.很容易想到采用读写端口的方式模拟的方

式,各串口的波特率必须保持一致.而且当各路数据的输入时间差只有那么几十

微秒时,很容易造成数据丢失,虽然看上去这种方式也可以承受输入数据端短路

的高数据量压力测试,但这种测试方法是刚好落在了该方案的最佳输入点上.所

以真正的使用中是有几率出错的.而采用我们PDK80CXX系列在进行8路以下(4

路全双工通讯)的串口模拟时,完全可以采用读写I/O口方式来完成,这样,我们

可以非常轻松完成个子口的波特率不等的设置.而且可以达到非常高的速率,当

外接8MHz的晶体时,3路子口的最高速度可以达到38400以上.我想就是38400

的波特率一般的单片机也就足够了.俗话说,"打铁还需墩子硬",而我们

PDK80CXX都是工业规格设计,超强的抗干扰性,超宽的高低温工作范围.不知道

各位看官目前有没有用过可以在-40~+120摄氏度工作的单片机.所以采用

PDK80CXX模拟串口扩展无疑是目前性价比最高的一种解决方案.

利用并口转串口扩展串行口

基于Intel8251的串行口扩展

Intel8251是一种通用的同步/异步发送器(USART),它的工作方式可以通过

编程设置,并具有独立的接环保故事 收/发送器。能以同步或异步串行通信方式工作,自

动完成帧格式,具有奇、偶校验和错误检测电路。

基于TL16C554的串行口扩展

TL16C554是TI公司生产的4通道异步收发器集成芯片。对TL16C554串行

通道的控制,是通过对控制寄存器LCR、IER、DLL、DLM、MCR和FCR编程来实现

的。这些控制字决定字符长度、停止位的个数、奇偶校验、波特率以及调制解调

器接口。控制寄存器可以任意顺序写入,但是IER必须最后一个写入,因为它控

制中断使能。串行通道内的波特率发生器(BRG)允许时钟除以1至65535之间的

任意数,BRG根据其不同的三种通用频率中的一种来决定标准波特率。

16C55x系列芯片还包括16C550、16C552,分别可以扩展1个和2个串行口。

利用串行口扩展串行口

基于GM8123/25系列芯片的串行口扩展

GM8123/25系列串口扩展芯片可以全硬件实现串口扩展,通讯格式可设置,

并与标准串口通讯格式兼容。

GM8125可扩展5个标准串口,通过外部引脚选择串口扩展模式:单通道工

作模式和多通道工作模式。单通道模式下,无需设置芯片的通讯格式,子串口和

母串口以相同的波特率工作,同一时刻只允许一组子串口和母串口通讯,工作子

串口由地址线选择。单通道工作模式适用于所有从机不需要同时通讯,并且通讯

过程完全由主机控制的系统。多通道模式下,各子串口波特率相同,允许所有子

串口同时与母串口通讯,母串口以子串口波特率的6倍工作。发送时由地址线选

择用来发送数据的子串口;接收时子串口能主动响应从机发送的数据,再由母串

口发送给主机,同时由地址线返回接收到数据的子串口地址,主机在接收到子串

口送来的数据后,可以根据地址线的状态判断数据是由哪一个从机发送的。

多通道工作模式下,在进行数据通讯前要对芯片进行工作方式设置,包括串

口帧格式设置和通讯波特率设置。

通过串行口和控制引脚相互配合可对芯片进行工作方式设置,引脚MS为0、

且STADD2~STADD0为000时写命令字,引脚MS为1、STADD2~STADD0为000时读

命令字。进行工作方式设置时,芯片的帧格式和母串口工作波特率与上一次进行

数据通讯时一致;而复位后的帧格式为11bit,母串口波特率为7200bps。

基于SP2338的串行口扩展

SP2338是采用低功耗CMOS工艺设计的通用异步串行口扩展芯片,它可轻

松将主机原有的1个串行口扩展成3个全新的全双工串行口。

SP2338适用于1个起始位、8个数据位、1个停止位的多串口系统,也就是

说其帧格式是不可编程的。主机通过改变ADRI1、ADRI0地址线状态的方式选择

3个子串口中的任意一个,3个子串口的地址分别为00、01、10。地址11用于

执行SP2338芯片本身的复位指令0x35或0xB5、睡眠指令0x55或0xD5、延时

指令0x00。向RX0~RX3中的任意一个接收端口写任意数据即可将SP2338唤醒,

但由于SP2338的唤醒时间需要25ms左右,故用于芯片唤醒的数据将不会被主机

接收。因此,可以先发送一个字节数据用于唤醒芯片,延时25ms后即可进行正

常的数据传输。

未使用的输入端口,如RX0、RX1、RX2等必须连接到VCC;未使用的输出端

口,如TX0、TX1、TX2等必须悬空;未使用的ADRI0、ADRI1必须连接到GND。

主机收发数据时序为:主机TX3接收到一个字节后应立即读取SP2338的输

出地址ADRO0、ADRO1的状态,判断接收到的数据来自哪个子串口;主机发送数

据时,首先通过ADRI0、ADRI1选择某一个子串口,再向TX3写将发送的数据。

还有分时复用的扩展方法

在电路设计的过程中,本文设计出一种适合自己系统需要、将1个串口扩展

为3个串口的方案,如图1所示。

其中,4001是四2输入端或非门,40106是六施密特触发器。4001的4脚

和9脚分别为主机的RXD和TXD,40106的2脚和9脚为子串口的TXD0和RXD0,

6脚和11脚为子串口的TXD1和RXD1,4脚和13脚为子串口的TXD2和RXD2。

根据图的连接方式和逻辑代数的推导可得:RXD的状态等于40106的9脚、

11脚、13脚的状态相与。当40106的9脚、11脚、13脚中的任意一个有数据信

号时,由于在异步串行通讯中,无数据传输时的引脚状态为高,因此RXD上就能

接收到有数据信号的那个引脚上的数据状态。40106的2脚、4脚、6脚的状态

等于TXD的状态,所以可以利用40106的2脚、4脚、6脚做为子串口的TXD。

这种设计方案适用于主机同时向多个串行设备发送数据,而从设备不同时向

主机发送数据的情况。再增加几个信号线,就可以区分出向哪一个从设备发送数

据以及接收到的数据是来自哪一个从设备。在本文的系统中,主机是通信的发起

者,接收到的数据来自哪个从设备是可以预知的,因此,只需再增加3个控制从

设备使能的信号线即可。

几种方法的比较

在需要扩展系统的串行口时,使用多串行口单片机的方法是最容易想到的。

由于串口集成在单片机内部,因此设备体积较小,抗干扰能力较高,但多串口单

片机通常价格较高,而且,如果是开发人员所不熟悉的型号,还需要开发人员重

新学习并购买与之配套的开发工具,这延长了产品的开发周期,也增加了产品的

开发成本。

软件模拟法占用的系统资源少、成本低、易于实现。已经被越来越多的人所

采用。特别是基于PDK80CXX系列模拟的串口应用,以其适中的价格,超强的抗

干扰性和超宽的工作温度,肯定会被更多的工业数据采集者所采用。

并行口扩展串口方法的功能比较强大,能提供MODEM控制信号、通讯速度高,

但控制复杂,占用MCU的端口资源较多,同时价格也较高。

利用串行口扩展串行口,控制简单,能最大限度地减少控制线,不需要占用

太多的主机系统资源,而且通用性强,性能稳定,可保证数据的正确性。GM812x

的不足之处在于:不满足超低功耗应用要求;多通道模式下,所有子串口工作波

特率只能设置成统一值,不适用于各从机工作波特率不一致、又要求同时工作的

系统。SP2338虽然能满足低功耗的要求,但其子串口波特率也需要设置为统一

值,并且不能对数据帧格式编程,最高波特率也只有9600bps。

本文提出的方法中,各个子串口的串行特性和母串口相同,使用简单,占用

系统资源少,易于控制(最少2个控制信号扩展3个串口),稳定性好。其功耗取

决于4001和40106,它们的功耗都在mA级。其最高波特率取决于4001和40106

的响应速度,4001和40106的最大响应延迟是250ns,所以理论上最高波特率可

达4Mbps。此方法已经成功地应用于三表远传系统。该方法的缺点是,它不能用

于从机工作波特率不一致、又要求同时工作的系统。

结论

单片机的串行通信是一种广泛应用于各个应用系统的通信方式。以8751单片机

为例进行的多串口扩展,解决了单片机在串行通信应用系统中的串口局限,

为单片机在多机网络测控系统中的应用提供了重要的参考价值。经实际应用

系统证明,该多串口扩展设计可靠,运行稳定。

(通用串行总线)简称USB,是目前电脑上应用较广泛的接口规范,由Intel、

Microsoft、Compaq、IBM、NEC、NorthernTelcom等几家大厂商发起的新型外

设接口标准。USB接口是电脑主板上的一种四针接口,其中中间两个针传输数

据,两边两个针给外设供电。USB接口速度快、连接简单、不需要外接电源,

传输速度12Mbps,最新USB2.0可达480Mbps;电缆最大长度5米,USB电缆

有4条线,2条信号线,2条电源线,可提供5伏特电源,USB电缆还分屏蔽和

非屏蔽两种,屏蔽电缆传输速度可达12Mbps,价格较贵,非屏蔽电缆速度为

1.5Mbps,但价格便宜;USB通过串联方式最多可串接127个设备;支持热插拔。

本文发布于:2023-03-19 17:33:18,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/zhishi/a/167921839937489.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:串口扩展芯片.doc

本文 PDF 下载地址:串口扩展芯片.pdf

下一篇:返回列表
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 实用文体写作网旗下知识大全大全栏目是一个全百科类宝库! 优秀范文|法律文书|专利查询|