摘要:介绍了一种基于AVR单片机Atmega8和调制解调芯片MSM7512设计的嵌入式Modem,详细地阐述了Modem的硬件及软件设计方法。在设计中,鉴于单片机串口资源匮乏的问题,采用单片机上I/O模拟UART口的技术予以解决。上位机软件用Delphi语言编写,通过嵌入式Modem实现了计算机与远方设备之间的数据传送。
关键词:嵌入式Modem Atmega8 MSM7512B 模拟串口
随着经济的发展,远程监控系统的应用日益广泛。其核心部分是远程信息交换,即系统需要在地域分布广泛的设备之间进行信息的交换及协调工作。对于某些采集点分散、传输量不大、对速度要求又不高的信息交换系统,目前有两种解决方案:一是采用Internet或现场总线技术,该方案铺设网络的费用高,维护量大;二是利用现有的电话网通过Modem进行数据传输,这样不仅可以摆脱伎的分布式总线系统繁琐的布线、中继、放大以及运行过程中维护量大等问题,而且系统扩展极为方便,基本不受设备地域的限制,该方案灵活实用且成本低廉。
图1
嵌入式Modem主要由单片机(或DSP)和调制解调芯片构成。与通用Modem相比,嵌入式Modem具有体积小、易维护、外围电路简单、成本低廉等特点。在企业或住宅区中的远程监控系统使用嵌入式Modem,能够节约大量的人力和财力,大大提高自动水平,因此具有较广阔的应用前景。本文介绍一种基于Atmel公司AVR系列单片机Atmega8和OKI公司调制解调芯片MSM7512的嵌入式Modem。
1 嵌入式Modem的硬件设计
系统的原理框图如图1所示,上位机与PC机,下位机是远方的嵌入式Modem和设备。PC机是数据终端,通过嵌入式Modem与远方终端实现数据交换;嵌入式Modem以Atmega8为中心,控制MSM7512芯片实现数据的发送与接收,通过外围电路实现振铃检测、摘机、显示信息、呼叫远方Modem等,它以RS232接口标准与上位机相连。
1.1 Atmega8单片机简介
AVR单片机是美国Ateml公司生产的具有双结构的RISC单片机系列,具有较短的指令周期和较快的运行速度。Atmega8是基于2002年推出的一款新型AVR高档单片机,工作在16MHz时能达到16MIPS。该芯片内部集成了8K字节Flash、1K字节内部SRAM及512字节的E2PROM,具有丰富强大的硬件接口电路(32个通用寄存器,23个通用可编程I/O口,三个计数器,三个PWM通道,一个I2C的总线接口,一个USART接口,一个SPI接口,6通道的10位ADC及2通道的8位ADC),并且支持在线编程(ISP)和在应用程序(IAP)。由于采用了小引脚封装(PDIP28和TQFP/MLF32)形式,所以其价格仅与低档单片机相当,因此Atmgea8是一款性价比很高的8位单片机。
1.2 MSM7512简介
MSM7512是日本OKI公司生产的一种价格低廉、功耗低、性能良好的调制解调芯片。该芯片满足ITU-TV.23协议标准,由单电源(3~5V)供电,采用FSK半双工调制解调方式,通信速率为1200bps,低功耗(典型值仅25mW),稳定性好,具有片内回音消除电路,模拟输出可直接连入PSTN;并具有TTL接口,其FSK输出信号可直接驱动600Ω的通信电路,外围电路简单,可方便地与数字系统及计算机系统相连,广泛应用于嵌入式Modem、数据传输和家庭安防系统中。图2为该芯片的功能框图。
图2
MSM7512有四种工作模式,由MOD1、MOD2端口进行控制。当MOD1=0、MOD2=0时,MSM7512工作于调制模式,XD输入为“0”或“1”的数字信号,AO端则对应输出频率为“2100Hz”或“1300Hz”的FSK信号;当MOD1=1、MOD2=0时,MSM7512工作于解调模式,A输入频率为“2100Hz”或“1300Hz”的FSK信号,RD则对应输出解调后的“0”或“1”数字信号;当MOD1=0、MOD2=1时,MSM7512工作于环路自测模式,用于检测芯片工作是否正常;当MOD1=1、MOD2=1时,MSM7512工作于节电模式,此时MSM7512功耗仅为0.1mW,其它模式一般功耗为25mW。在本设计中所使用的工作模式是FSK调制发送及接收模式。
在硬件设计中需要着重考虑的问题是:MSM7512是一块串行调制解调芯片,与单片机通过串口相连,而单片机上的USART串口也需要与上位机进行串行通信,但Atmega8只有这一个串口,就出现了串口资源不足的问题。如果仅仅为增加一个串口而使用可编程串行通信接口芯片8251,无疑会增加设计的复杂性和成本。而利用Atmega8的两个I/O口编程模拟一个UART串口的功能(即模拟串口),可以很好地解决这个问题。这将在软件设计部分具体介绍。
1.3 振铃检测和拨号电路
振铃检测与拨号电路如图3所示。它的工作原理很简单,在此不再多述。
图3
2 嵌入式Modem的软件设计
软件部分的设计包括上、下位机通信协议的制订、上位机程序和单片机程序的编写。其中上位机程序以Delphi为开发工具,单片机程序用ANSIC C编写。
2.1 上位机与下位机通信协议的制订
上位机与下位机之间的数据交换必须遵循一定的通信协议,通信双方才能按照该协议解析所传输的数据。就本设计而言,一台PC机要对应多个下位机,属于主从式结构。所制订的通信协议为:
前导码
目的地址
源地址
数据帧
CRC校验码
前导码使通信双方保持同步,目的地址和源地址就是各设备所对应的电话号码,当PC机发送数据时,先发送目的地址给所有下位机,如果某个从机被上位机寻址,它将接收主机接下来发出的数据帧,而其它的从机则将忽略数据帧;当PC机接收数据时,同样地,下位机先发送源地址再发数据帧给上位机。同样时,下位机先发送源地址再发数据帧给上位机。CRC校验码是为了防止传输出错而设计的。为设计方便,规定数据帧为32位,其中功能码为4位,参数为28位。功能码为0000时,参数表示的是设备传输数据;功能码为1111时,参数表示设备自检数据。
图4
2.2 上位机软件的编写
上位机是一个数据发送与接收的终端,上位机软件的功能是:选择并发送要呼叫的电话号码;使计算机与嵌入式Modem能够通过RS232接口标准收发数据。由于Delphi是一种易学易用的面向对象的程序设计工具,因而采用它来编写上位机程序。在上位机程序中要能够对计算机串行口的硬件进行操作。然而Delphi本身不提供串行通信组件,因此需要调用Windows API函数建立一个串行通信组件Tcomm来对串口硬件实现控制,进而使用该组件完成串行通信功能。在设计中还需要使用其它一些组件如Button、Memo、RadioGroup等来完成软件界面的设计。
2.3 单片机程序设计
根据设计中单片机的任务设置一个全局变量TransOrReceFlag(规定值为0时,表示Modem处于接收状态;为1时,Modem处于发送状态),主程序根据它的值跳转到相应的子程序中。下面分别介绍子程序的编写过程。
嵌入式Modem发送数据:上位机按照通信协议通过串口向Atmega8先后发送目的地址(电话号码)和数据帧。单片机在USART接收完成中断服务程序中,将MSM7512设置为调制模式并使MSM7512与电话线连通,再控制双音多频信号发生器HT9200产生目的地址所对应的DTMF信号,送入MSM7512的外部信号输入端EAI,经内部放大后从AO输出端向电话线上发送所呼叫的电话号码,待与远方Modem建立起联系后,就可以通过模拟串口向MSM7512传送接下来所收到的数据帧。
嵌入式Modem接收数据:Atmega8外部计数口T1上有下降沿出现时,表明电话线上有振铃信号,可能有远方Modem要求和本地Modem进行数据传输。为防止误拨,规定了振铃信号需要连续出现的次数。当达到计数设定值时,单片机确认有远方Modem要进行数据传输,于是将MSM7512设置为调解模式,接通电话线,再通过模拟串口接收MSM7512传来的数据,经USART把数据传给上位机。
单片机程序中一个重要的部分是模拟UART串口的实现部分。在设计中用定时/计数器0产生合适的波特率,使接收和发送的数据符合异步串行通信数据帧的格式;一个普通I/O口作为TXD’,外部中断0口T0作为RXD’;在内存中开辟一块缓冲区模拟串口的数据接收/发送缓冲器。规定模拟串口中数据帧为1起始位,8个数据位,1个停止位,波特率为9600bps。下面就接收和发送两个过程介绍模拟串口的实现。
模拟串口接收数据:串行通信中数据帧都是从一个下降沿开始的。当T0口上有下降沿出现并触发中断时,表明MSM7512已经接收到远方传来的数据,单片机需要对所接收到的数据进行采样。在中断服务程序中初始化数据位计数器和定时/计数器0,设定其第一次定时时间为1.5位,因为从起始位需要延时1.5位才能进行数据位D0的采样(1.5位=1起始位+0.5D0位),如图4所示。接下来的8次采样的间隔一样,所以在定时器第一次计时溢出后,在每次溢出中断服务程序中重新装载的定时时间均为1位。采样后将所得数据存入缓冲区再送给上位机。图5是模拟串口接收数据的程序流程图。
模拟串口发送数据:与接收数据过程相比,发送数据要简单些。因为不需要采样,帧中所有位的时间长度是一样的,所以定时/计数器0的定时时间为固定值,即1位的时间。送出的第一位数据是起始位,通过接收方准备接收数据,然后从最低有效位LSB支最高有效位MSB,数据被一位一位地移出,在最末的是停止位(即逻辑1),用来让接收方区分发送的数据字节。
由于在上位机程序中集成了选择发送电话号码的功能,所以本文所介绍的嵌入式Modem能够灵活方便地与远方设备进行数据传输。它还具有体积小、外围电路简单、易维护、成本低廉等特点,具有较大的应用价值。