串口通信的本质.doc

上传人:ni****g 文档编号:546034252 上传时间:2023-06-19 格式:DOC 页数:5 大小:33.51KB
返回 下载 相关 举报
串口通信的本质.doc_第1页
第1页 / 共5页
串口通信的本质.doc_第2页
第2页 / 共5页
串口通信的本质.doc_第3页
第3页 / 共5页
串口通信的本质.doc_第4页
第4页 / 共5页
串口通信的本质.doc_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《串口通信的本质.doc》由会员分享,可在线阅读,更多相关《串口通信的本质.doc(5页珍藏版)》请在金锄头文库上搜索。

1、http:/ 日期:2005-8-31 20:48:47 人气:0 查看:大字体 中字体 小字体 作者:佚名摘 要:本文介绍了分时共用和I/O口模拟这两种串行通信接口扩展技术。利用此技术可解决调试和实际应用过程 中,单片机串行通信接口不够或者没有串行通信接口的问题。关键词:串行通信接口,分时共用,I/O口模拟前言单片机的串行通信接口提供了与外设通信极大的方便性,虽然大多数单片机都具有硬件SCI(Serial Communications Interface),但也有一些产品没有SCI,如Motorola的MC68HC908JL3等,对于这些产品的用户来说这是一个缺憾。而且,一般八位单片机只有一

2、个SCI,但在很多实际应用,需要更多的串行通信接口。例如在基于Modem的远程控制系统中,单片机与PC机通信的同时,还需要与Modem芯片进行通信;而在多机系统中,单片机需要与其他主机通信,另外也需要与本机控制台通信。所以利用单片机自身的资源进行串行通信接口的扩展很有意义。笔者在开发的过程中,总结了一些串行通信接口的扩展技术:分时共用,I/O口模拟。前者利用MCU自身的硬件SCI,通过控制逻辑分时共享使用同一串行通信接口,后者在不增加硬件的条件下,充分利用MCU自身的资源利用I/O口模拟串行通信接口。串行通信接口原理单片机的SCI是一个通用异步接收器/发送器UART(Universal Asy

3、nchronous Receiver /Transmiter)类型的异步通信接口,通过串行通信协议(如RS-232协议)同主机系统通信。在一般应用中,MCU简单地把数据写入数据寄存器即可实现一个字符的串行发送,SCI系统完成发送数据的所有细节工作,包括附加起始位和停止位以符合串行格式。SCI的接收器自动探测一个字节的起始位,并通过采样接收数据。接收串行数据并变换成并行数据的所有工作均由SCI完成,不需要MCU的干预。接收到数据后,MCU简单地从数据接收寄存器读取数据即可。SCI使用标准不归零(NRZ)格式(一个起始位,8个或9个数据位和一个停止位),最常用的格式数据位是8位的,如图1所示。NR

4、Z数据格式的基本特点如下:高电平为逻辑1,低电平为逻辑0;发送/接收数据空闲时TXD、RXD线为高电平;发送/接收数据串的第一位是起始位(逻辑0);数据的最低位LSB首先被发送/接收;数据串的最后一位(第10位或第11位)是停止位(逻辑1)。分时共用技术分时共用串行通信接口技术利用MCU自身的硬件SCI,通过控制逻辑分时共享使用同一串行通信接口。控制逻辑分时共用串行通信接口的原理图如图2所示。图2中U1为74HC32(或门),U2为74HC04(非门),U3为74HC08(与门)。RXD、TXD为从MCU直接引出的SCI接收引脚和发送引脚,PTC0为MCU的I/O口,在此定义为输出,用于控制逻

5、辑片选。当PTC0为高电平时,U1的2引脚和13引脚输入为高,3引脚和11引脚输出恒为高,即TXD1输出恒为高,RXD1输入被屏蔽;而U1的5引脚和10引脚输入为低,6引脚输出为TXD的电平,8引脚输出为RXD2的电平,此时TXD2的输出和RXD2的输入与MCU的TXD和RXD相一致。相反,当PTC0为低电平时,TXD2输出恒为高,RXD2输入被屏蔽,TXD1的输出和RXD1的输入与MCU的TXD和RXD相一致。10K的上来电阻R1确保在初始状态下,即使PTC0未初始化的情况下,PTC0的电平为高,即初始状态下TXD2和RXD2有效。通过这种逻辑控制方式,在PTC0的控制下,TXD1、RXD1

6、和TXD2、RXD2可以轮流使用MCU的串行通信接口,达到分时共享的目的。这种方式可应用于两个串行通信无需同时进行的场合。I/O口模拟技术I/O口模拟串行通信接口技术在不增加硬件的条件下,充分利用MCU自身的资源利用I/O口模拟串行通信接口,即利用I/O口做一个软件串口。软串口的发送和接收时序和硬件SCI一样,空闲状态为高电平,起始位为低电平,数据最低位LSB在前,依次到最高位MSB,最后是停止位,停止位为高电平,具体时序见图1。这里给出利用MC68HC908GP32的两个普通的I/O引脚PTD4和PTD5实现的软件串口。在MCU总线时钟为2.4576MHz的条件下,波特率为4800,一个起始

7、位,8个数据位,无校验位,一个停止位。程序用C语言编写,编译环境为Hiware C编译器。程序清单如下。宏定义#define exit_critical asm sei /关中断#define enter_critical asm cli /开中断#define idle asm nop /空闲指令#define bit5 0x20 /定义位值#define bit4 0x10#define RX bit4 /定义SCI接收引脚#define TX bit5 /定义SCI发送引脚主程序主程序完成接收、发送引脚的初始化,调用输入和输出函数void main_loop(void)unsigned

8、char input; /程序其他初始化PORTD |= bit5; /SCI发送引脚初始化DDRD |= bit5; /定义SCI发送引脚为输出DDRD &= bit4; /定义SCI接收引脚为输入input = getchar(); /调用SCI输入函数putchar(input); /调用SCI输出函数延时程序为了保证发送和接收延时的精度,采用精简的嵌入式汇编语言编写。延时时间计算公式为(6 n+4)个总线周期。void delay_time(char n)asmL1:DECA /1个总线周期CMP #0 /2个总线周期BGT L1 /3个总线周期RTS /4个总线周期发送函数MCU总线

9、时钟为2.4576MHz,发送数据遵循NRZ格式:一个起始位,8个数据位,无校验位,一个停止位。波特率为4800,即每位208 S。发送时直接逐位发送,相邻位间的延迟时间为208 S。延时控制通过反汇编代码,参看每条反汇编指令的周期数,进行计算。void putchar(unsigned char outchar)unsigned char count;exit_critical; /关中断PORTD &= TX; /输出起始位,低电平for(count=0;count1; /数据右移,欲输出的位移至最低位delay_time(80); /延时,确保数据MSB与停止位间间隔为208 SPORT

10、D |= TX; /输出停止位,高电平delay_time(80); /延时,控制停止位时间长度为208 Senter_critical; /开中断接收函数接收函数循环检测起始位的发生,一旦检测到起始位,起始位后大约300 S后,也就是从数据最低位LSB的中间位置起按一定的时间间隔逐位采样,相邻位间开始采样的时间间隔位208 S,为了提高抗干扰能力,每位采样三次。unsigned char getchar(void)unsigned char inchar count temp i;dowhile(PORTD&RX) != 0); /检测起始位delay_time(118); /起始位后300

11、 s开始采样for(count=0;count1; /数据右移,保证最终接收到数据位在最高位for(i=0 temp=0;i3;i+) /采样三次if(PORTD&RX) != 0) temp += 1; /采样值为1else /采样值为0 idle; /补足空指令,使两种情况执行指令相同idle;idle;idle;idle; temp /=3; /3次采样值之和除以3if(temp != 0) inchar |= bit7; /商位1,接收位为高电平else /商位0,接收位为低电平inchar &= bit7;idle; /补足空指令,使两种情况执行指令相同idle;idle; delay_time(64); /延时,确保相邻位间开始采样的时间间隔位208 Sfor(i=0 temp=0;i3;i+)if(PORTD&RX) != 0) temp += 1; /采样值为1else /采样值为0 idle; /补足空指令,使两种情况执行指令相同idle;idle;idle;idle;temp /=3; /3次采样值之和除以3if(temp != 0) return(inchar); /停止位正确返回接收数据else return(-1); /停止位错误返回-1

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号