串口通信技术的设计与实现Word文档格式.docx
《串口通信技术的设计与实现Word文档格式.docx》由会员分享,可在线阅读,更多相关《串口通信技术的设计与实现Word文档格式.docx(26页珍藏版)》请在冰豆网上搜索。
1200,2400,4800,9600,19200。
列计数器重载值,通信误差如下表:
因此,在通信中,最好选用波特率为1200,2400,4800中的一个。
2、通信协议的使用
通信协议是通信设备在通信前的约定。
单片机、计算机有了协议这种约定,通信双方才能明白对方的意图,以进行下一步动作。
假定我们需要在PC机与单片机之间进行通信,在双方程式设计过程中,有如下约定:
0xA1:
单片机读取P0端口数据,并将读取数据返回PC机;
0xA2:
单片机从PC机接收一段控制数据;
0xA3:
单片机操作成功信息。
在系统工作过程中,单片机接收到PC机数据信息后,便查找协议,完成相应的操作。
当单片机接收到0xA1时,读取P0端口数据,并将读取数据返回PC机;
当单片机接收到0xA2时,单片机等待从PC机接收一段控制数据;
当PC机接收到0xA3时,就表明单片机操作已经成功。
3、硬件连接
51单片机有一个全双工的串行通讯口,所以单片机和计算机之间可以方便地进行串口通讯。
进行串行通讯时要满足一定的条件,比如计算机的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。
我们采用了三线制连接串口,也就是说和计算机的9针串口只连接其中的3根线:
第5脚的GND、第2脚的RXD、第3脚的TXD。
这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。
使用MAX232串口通信电路图(9孔串口接头)
串口通讯的硬件电路如上图所示为了能够在计算机端看到单片机发出的数据,我们必须借助一个WINDOWS软件进行观察,这里利用如下图标的一个免费计算机串口调试软件来观察。
基于CAN总线的RS-232串口设备远程通信
技术分类:
通信
|2006-03-27
来源:
国外电子元器件|李娟
1引言
工业设备通信通常涉及到很多硬件和软件产品以及用于连通标准计算机平台(个人计算机或工作站)和工业自动化应用设备的协议,而且所使用设备和协议的种类繁多。
因此,大部分自动化应用设备都希望执行简单的串行命令,并希望这些命令同个人计算机或者附加的串行端口板上的标准串行端口兼容。
RS-232是目前PC机与通信工业中应用最广泛的一种串行接口。
RS-232被定义为一种在低速率串行通讯中增加通讯距离的单端标准。
由于RS-232的发送端与接收端之间有公共信号地,所以它不能使用双端信号,否则,共模噪声会耦合到信号系统中。
RS-232标准规定,其最大距离仅为15m,信号传输速率最高为20kbit/s。
CAN,全称为“ControllerAreaNetwork”,即控制器局域网,是国际上应用最广泛的现场总线之一,一个由CAN总线构成的单一网络受到网络硬件电气特性的限制。
CAN作为一种多主方式的串行通讯总线,其基本设计规范要求高位速率和较高的抗电磁干扰性能,而且要能够检测出通讯总线上产生的任何错误。
当信号传输距离达10km时,CAN仍可提供高达50kbit/s的数据传输速率。
表1为CAN总线上任意两个节点之间最大传输距离与其位速率之间的对应关系。
表1CAN总线系统任意两节鼎足之势之间的最大距离
点击看原图
由此可见,无论从实时性、适应性、灵活性,还是可靠性上来看,CAN总线都是一种比RS-232更为优秀的串行总线。
当两台串口设备的相距较远,不能直接用RS-232把它们连接起来时,就可以把RS-232转换为CAN,通过CAN总线来实现串口设备的网络互连。
但是,RS-232和CAN在电平和帧格式上都是很大的不同。
具体表现如下:
RS-232标准电平采用负逻辑,规定+3V~+15V之间的任意电平为逻辑“0”电平,-3V~-15V之间的任意电平为逻辑“1”电平。
而CAN信号则使用差分电压传送,两条信号线称为“CAN_H”和“CAM_L”,静态时均为2.5V左右,此时的状态表示为逻辑“1”,也可以叫做“隐性”;
用CAN_H比CAN_L高表示逻辑“0”,称为“显性”。
显性时,通常电压值为:
CAN_H=3.5V,CAN_L=1.5V;
RS-232串口的帧格式为:
一位起始位,八位数据位,一位可编程的第九位(此位为发送和接收的地址/数据位),一位停止位。
而CAN的数据帧格式为:
帧信息+ID+数据(可分为标准帧和扩展帧两种格式)。
因此,设计时就需要有一个微控制器来实现电平和帧格式等的转换。
其转换方式如图1所示。
2RS-232到CAN转换的硬件设计
在设计RS-232到CAN的转换装置时,用单片机AT89C52作为微处理器;
用SJA1000作为CAN微控制器,SJA1000中集成了CAN协议的物理层和数据链路层功能,可被动局面对通信数据的帧处理;
AT82C250作为CAN控制器和物理总线之间的接口,用于提供总线的差动发送能力和CAN控制器的差动接收能力,通过AT82C250的引脚3可选择三种不同的工作方式(高速、斜率控制和待机)。
其中引脚3接地时为高速方式;
高速光隔用6N137实现,其作用是防止串入信号干扰;
MAX232用来完成232电平到微控制器接口芯片TTL电平的转换。
具体的硬件接口电路参见SJA1000的有关资源,这里不再多做说明。
但有以下几点需要注意。
(1)CAN总线两端接有一个120Ω的电阻,其作用是匹配总线阻抗,提高数据通信的抗干扰性及可靠行。
但实际上只需保证CAN网络中“CAN_H”和“CAN_L”之间的跨接电阻为60Ω即可。
(2)SJA1000的20引脚RX1在不使用时可接地(具体原因见软件设计),配合CDR.6的置位可使总线长度大大增加。
(3)引脚TX0、TX1的接法决定了串行输出的电平。
具体关系可参考输出控制寄存器OCR的设置。
(4)AT82C250的RS引脚与地间接有一个斜率电阻。
电阻大小可根据总线通信
速度作适当调整,一般在16kΩ~140kΩ之间。
(5)MAX232外围需要四个电解电容C1、C2、C3、C4,这些电容也是内部电源转换所需电容,其取值均为1μF/25V,宜选用钽电容并且位置应用量靠近芯片,电源VCC和地之间要接一个0.1μF的去耦电容。
3RS-232到CAN转换的软件设计
在微处理控制下,RS-232和CAN进行数据交换时,采用串口接收和CAN中断方式可提高工作效率。
其主程序流程图如图2所示。
SJA1000的初始化在复位模式下才可以进行,主要包括工作方式的设置、时钟分频和验收滤波寄存器的设置、波特率参数的设置以及中断允许寄存器的设置等。
数据能否准确传递还取决于波特率和流量控制,这也是软件设计时不可忽略的地方。
因此接下来主要介绍CAN波特率的设置、串口波特率的自动检测、串口数据流量控制。
3.1CAN滤波率的设置
CAN协议中的要素之一是波特率。
用户可以设置位周期中的位采样点位置和采样次数,以使用户可以自由地优化应用网络性能,但在优化过程中,要注意位定时参数基准参考振荡器的容差和系统中不同信号传播延迟之间的关系。
系统的位速率fBil表示每单位时间传输数据位的量,即波特率fBit=1/tBit。
额定的位定时由3个互不重叠的段SYNC_SEG、TSEG1和TSEG2组成,这3个时间段分别是TSYNC_SEG、TSEG1和TSEG2组成,这3个时间段分别是tSYNC_SEG、tTSEG1和tTSEG2。
所以,额定位周期tBit是3个时间段的和。
tBit="
tSYNC"
_SEG+tTSEG1+tTSEG2
位周期中这些段都用整数个基本时间单位来表示。
该时间单位叫时间份额TQ,时间份额的持续时间是CAN系统时钟的一个周期tSCL,可从振荡器时钟周期tCLK取得。
通过编程预分频因数(波特率预设值BRP)可以调整CAN系统时钟。
具体如下:
tSCL="
BRP"
×
2tCLK=2BPR/fCLK
对CAN位定时计算的另一个很重要的时间段是同步跳转宽度(SJW),持续时间是tSJW。
SJW段并不是位周期的一段,只是定义了在重同步事件中被增长或缩短的位周期的最大TQ数量。
此外,CAN协议还允许用户指定位采样模式(SAM),分别是单次采样和三次采样模式(在3个采样结果中选出1个)。
在单次采样模式中,采样点在TESG1段的末端。
而三次采样模式比单次采样多取两个采样点,它们在TSEG1段末端的前面,之间相差一个TQ。
上面所提到的BPR、SJW、SAM、TESG1、TESG2都可由用户通过CAN控制器的内装中寄存器BTR0和BTR1来定义。
具体如图3所示。
设置好BTR0
和BTR1后,实际传输的波特率范围为:
最大=1/(tBit-tSJW),最小=1/(tBit+tSJW)
3.2串口波特率检测
当串口设备是主机时,如需检测此时转换装置的串口波特率,首先可对主机的接收波特率(以9600波特为例)进行设定,并在终端发送一个特定的字符(以回车符为例),这样,主机根据接收到的字符信息就可以确定转换装置的通信波特率。
回车符的ASCII值是0DH,在不同波特率下接收到的值如表2所列。
表2不同波特率下接收的字节
3.3串口流控制
此处讲到的“流“指的是数据流。
数据在两个串口之间的传输时,常常会出现丢失数据的现象。
由于单片机缓冲区有限,如接收数据时缓冲区已满,那么此时继续发送来的数据就会丢失。
而流控制能有效地解决该问题,当接收端数据处理不过来时,流控制系统就会发出“不再接收”的信号,而使发送端停止发送,直到收到“可以继续发送”的信号再发送数据。
因此流控制可以控制数据传输的进程,防止数据丢失。
常用的两种流控制是硬件流控制(包括RTS/CTS、DTR/CTS等)和软件流控制XON/XOFF(继续/停止),下面仅就硬件流控制RTS/CTS加以说明。
采用硬件进行流控制时,串口终端RTS、CTS接到单片机的I/O口,通过置I/O口为1或0来接收和发出起停信号。
数据终端设备(如计算机)使用RTS来起始单片机发出的数据流,而单片机则用CTS来起动和暂停来自计算机的数据流。
实现这种硬件握手方式时,在编程时根据接收端缓冲区的大小设置一个高位标志和一个低位标志,当缓冲区内数据量达到高位时,就在接收端将CTS线置低(送逻辑0),而当发送端的程序检测到CTS为低后,就停止发送数据,直到接收端缓冲区的数据量低于低位而将CTS置高为止。
RTS则用来标明接收设备有没有准确好接收数据。
3.4CAN接收子程序
PeliCAN格式既可以发送标准帧也可以送扩展帧,利用时钟分频寄存器中的CDR.7可以调协CAN模式(0-BasicCAN,1-PeliCAN),接收CAN数据时,可根据帧信息中的FF位来判断是标准帧还是扩展帧,并且RTR位来判断是远程帧还是数据帧。
以下是CAN接收子程序:
;
//////////////////////////////////////////////////////////////////
//CAN数据接收/统一成2个字节ID的帧格式//
///////////////////////////////////////////////////////////////////////
RECAN:
MOVR0,#C_RE;
单片机内缓冲区起始地址
MOVDPTR,#RXBUF;
读取并保存接收缓冲区的内容
MOVXA,@DPTR;
读取CAN缓冲区的2号字节
MOV@R0,A;
保存
JBACC.7,EFF_RE;
FF位,0-SFF,1-EFF
MOVR2,#0
SJMPSFF_RE;
ID数目不同,截取“数据字节”的位置不同
EFF_RE:
MOVR2,#2
SFF_RE:
JBACC.6,EXIT_RECAN;
RTR位判断,1-远程帧,则跳出
ANLA,#0FH
MOVR3,A;
这时截取中间4位是数据长度
MOVC_NUM,A;
R3,R5中存放接收帧的长度
RDATA0:
INCDPTR;
2个字节ID
INCR0
MOVXA,@DPTR
MOV@R0,A
INCDPTR
MOVXA,@R0,A
MOVXA,@DPTR
MOVA,R2;
如果是EFF则跳过两个字节ID
JZDRATA1
DATA1:
数据字节
DJNZR3,RDATA1
EXIT_RECAN:
RET
4结束语
计算机的微型化为测控仪表的智能化提供了必要的条件,使得带微处理器的终端设备具备更好的数字通信能力。
随着越来越多智能终端的出现,无论是对网络的结构、协议、实时性,还是适用性、灵活性、可靠性乃至成本都有了更高的要求,因此现场总线有着很好的发展前景。
CAN总线的帧结构拥有标识ID,这使得设备网络中拥有多台网络主机成为可能,即通过网络主机可以监控整个设备网络的工作情况并作出相应的控制决策。
本装置目前已开发完成,并在实际应用中取得了非常好的效果。
一种基于FPGA和SC16C554实现多串口通信的方法
可编程器件
|2009-08-21
张晓峰李悦丽黎向阳张强
0 引言
随着电子技术的飞跃发展,通用数字信号处理器(DSP)的性能价格比不断提高,数据处理能力不断加强,其应用领域日益增多,在数据实时采集及高速数字信号处理中应用尤其广泛。
当DSP独立构成一个处理单元时,往往需要和外设进行数据交换,其通信能力至关重要。
在研制机载合成孔径雷达系统时,信号处理机作为系统的核心要与飞控系统、稳定平台、雷达信号源以及导航系统等部分进行数据交换;
如何实现其与其它部分之间有效的通信成为系统设计的关键。
串口通信因为其简单,可靠仍然是广泛采用的方法之一。
1串口扩展方案选择
多串口通信常用的实现方案有两种:
一种是软件实现,采用软件编程模拟串口,该方法成本低,但编程复杂、开发周期长、可靠性低。
另一种是硬件实现,使用多串口单片机或专用串口扩展芯片,该方法虽然成本较高,但是开发比较简单,可靠性高。
目前比较通用的实现方案是采用通用异步通信芯片实现串口扩展,采用FPGA/CPLD实现DSP与异步串口扩展芯片之间的逻辑控制,完全基于DSP接收和发送数据。
该方案的缺点是:
当数据量较大、多串口同时工作时占用DSP的时间较长,影响DSP的工作效率,且会造成数据丢失。
因此本文提出了一种新的实现方法--基于FPGA和通用异步通信芯片实现多串口通信设计。
在不进行硬件改动的基础上,通过在FPGA内建立一个缓存机制,实现接收串口芯片的数据,达到一定量时向DSP发送中断读取数据。
该设计能极大减少对DSP的占用时间,提高了DSP的工作效率;
同时提高了对串口芯片中断请求的响应速度,解决了数据丢失的问题。
2硬件电路设计
本设计采用通用异步通信芯片SC16C554来实现串口扩展。
SC16C554主要特点有:
1.有A、B、C、D四个通道独立收发数据;
2.最高传输速率可达5Mbit/s,具有可编程波特率发生器,便于灵活选择数据收发频率;
3.具有16字节的收发FIFO,且有1、4、8、14字节四个可选择的中断触发深度;
4.可通过编程设置传输数据的格式(数据长度,校验位,停止位);
5.具有可独立控制的发送、接收、线路状态和MODEM状态中断;
6.充分分级的中断系统控制,全面的线路状态报告功能。
基于FPGA和SC16C554实现多串口通信的基本原理图如图1所示:
3软件设计及实现
系统实际工作所需波特率分别为9600、38400、115200、153600。
分析计算可得不同波特率发送数据时,连续两个数据之间的时间间隔如表1所示:
由表1可知单个通道连续两个中断产生的最小时间间隔为65μs;
因此在65μs的时间内如果可以实现对四个通道分别进行一次读数据操作,即使是四个通道同时来数据也不会发生数据丢失的现象。
3.1数据的存储设计
即在FPGA内部建立一个缓存机制。
设计采用在FPGA内部做一个双端口RAM(DPRAM),用来存储串口数据,DSP通过访问DPRAM得到接收的串口数据。
DPRAM指一个存储模块却包含两个独立的端口,这两个端口共用同一块地址空间,两个端口都可以向这块空间里写数据或从中读取数据。
DPRAM的读写数据的模式包括只读、只写、读写三种模式,其中读写模式又包括先写后读、先读后写、只写不读三种模式,我们采用先读后写的模式。
我们将DPRAM的地址空间分为四部分,分别用来存放四个通道的数据。
当FPGA收到数据时,我们可以根据置通道标志寄存器CS[2:
0]的值来判断该数据来自哪个通道,将其存入对应的地址空间,并将该通道对应地址线加一。
当该通道存储数据量达到编程设置的触发深度时,就将DSP中断寄存器dspint置低,向DSP发送中断;
同时向DPRAM内一事先定义好的公共存储空间写入通道标志字。
当DSP收到中断后,首先访问该公共存储区读取通道标志字,判断该中断是由哪个通道产生的;
然后调用相应的接收函数从DPRAM内读取该通道的数据存入指定的地址空间等待处理。
3.2读串口数据状态机的设计
一个完整的读取串口数据操作需要进行三次读操作:
读中断状态寄存器(ISR)、读线状态寄存器(LSR)、读接收保存寄存器(RHR)。
由于这三次读操作具有严格的逻辑顺序和时序关系,非常适合采用状态机来描述;
所以本设计采用有限状态机来实现读取串口数据。
图2为读通道A数据的状态转移图。
State0:
空闲状态,当没有数据时状态机一直停留在空闲状态;
State1:
赋IsR寄存器地址给UART_A,置通道标志寄存器CS[2:
O]=001(表示A通道);
State2:
读ISR,判断中断类型(04为接受数据准备好中断),赋LSR寄存器地址给UART、A;
State3:
读LSR,判断是否有数据(LSR[0]=1表示有数据在RHR内),赋RHR寄存器地址给UARTA;
State4:
读RHR,读取串口数据。
多通道工作时,可以通过增加状态机状态来实现。
完成一个通道的读数操作需要四个状态,当四个通道同时工作时,状态机的状态需要增加到17个。
其中Stare5~State8完成对通道B的操作;
其中State9~State12完成对通道C的操作;
其中State13~State16完成对通道D的操作。
3.3读时序设计
SC16C554的通用读时序图如下:
其中t6s=0nst6h=0nst7h=0nst7d=10nst7w=26nst9d=20nst12h=15ns都为最小值,t12dmax="
26ns由图3可以看出"
:
对串口进行一次读操作所需的时间T=t6s+t7d+t7w+t9d所以T最小为56ns。
本设计采用60MHz时钟分频出10MHz时钟,在一个1OMHz时钟周期(100ns)内完成一次读操作。
用60MHz时钟同步一个计数器cscount[2:
0],在第一个60MHz时钟的上升沿(cs_count=3’b000时)置CS为低,并赋对应的地址给UARTA;
在第二个60MHz时钟的上升沿(cs_cout=3’b001时)置UARTIOR为低;
在第四个60MHz时钟的上升沿(cs_count=3’b011时)置CS、UARTIOR为高。
这样UARTIOR有效时间为两个时钟周期(33ns),且比CS延时一个时钟周期(17ns),完全满足图3读时序的要求。
由图2可知,由空闲状态State0到完成一次串口数据的读取,共需要500ns的时间。
这样多通道工作时连续完成四个通道的读数操作共需2μs,远小于单个通道连续两个中断产生的时间间隔65μs;
这样有效解决了多通道工作时,当读取数据的过程中其它通道中断丢失的问题。
如:
当读通道A数据的过程中,通道B产生中断请求;
则状态机完成通道A数据读取返回到空闲状态State0,检测到INTB为高,状态机进入下