1 模块总体硬件结构
如图1所示,模块总体硬件结构主要由微控制器和蓝牙芯片及其相应的外围电路组成,能自动完成波特率识别,并进行数据的编码处理,给用户提供了一个透明的数据接口。微控制器选用Atmel公司新推出的具有可在线编程(ICSP)功能的单片机AT89S51,便于以后软件的升级。根据发送数据是否需要曼彻斯特编码、所需外围元件的数量、功耗及发射功率等方面因素的综合比较,选用nRF401芯片作为无线数据传输芯片。
nRF401是单片无线收发芯片,采用蓝牙核心技术设计,内部集成高频发射、高频接收、PLL合成、FSK调制、FSK解调、多频道切换等诸多功能和外围部件协议。它是目前集成度最高的无线数据传输产品,也是目前唯一一个可以直接连接微控制器串口进行异步数据传输、无需进行曼彻斯特编码的无线收发芯片。nRF401发射功率最大为10 mw,工作电压为2.7~5 V,发射电流为8~30 mA,接收电流约为10 mA,待机电流为8 μA,灵敏度为-105dBm,20脚8 mm×7 mm的SOIC封装;所需外部元件很少,仅外接一个晶振和几个阻容、电感元件;基本无需凋试,传输速率最高为19.2 kbps,工作频段为433/434 MHz,有2个信道,调制方式FSK。
nRF401端口中与微控制器相关的有5个:DIN和DOUT用于异步串行通信,DIN的数据方向为微控制器到无线芯片,DOUT则相反;CS选择芯片频段,CS=0时为433.92 MHz,CS=1时为434.33 MHz,在本模块中将该引脚引出,以方便用户的控制,当一个频段无法工作时,可以设置为另一个工作频段,提高了系统的抗干扰能力;PWR_UP用于芯片节电控制,PWR_UP=0时为掉电(节电模式),PWR_UP=1时为上电(工作模式),在该模块中同样将其引出,当不需要无线发射和接收时,用户可将芯片设置为节电模式以降低系统功耗;TXEN选择芯片处于发射或接收状态,TXEN=0时为接收状态,TXEN=1时为发送状态。
PCB板布局和电源去耦设计对于RF射频电路获得较好的性能是必要的,电路板采用1.6 mm厚FR4板材的两层PCB,底层铺铜面,并在元件层空白区铺铜;多打通孔连接上下层,铜面与地线相连,天线下底层不铺铜,VSS直接与铜层连接,并保证关键元件有充分的接地。所有开关数字信号和控制信号都不能经过PLL环路滤波器元件和VCO电感附近。直流供电在离VDD脚尽可能近的地方用高性能的电容去耦,去耦使用1个小电容(0.01μF)和1个大电容(2.2μF)并联,并避免较长的电源走线。
2 硬件设计及软件实现
2.1 微控制器与nRF401接口设计
微控制器AT89S51与蓝牙芯片nRF401的接口电路如图2所示。nRF401芯片只需10个左右的元件即实现了数据收发功能,应用极其方便。其TXEN端为数据收发选择端,当设定为发送模块时,将其置为高电平;同时,DIN引脚与微控制器的TXD端相连,微控制器的RXD端作为预留接口与外部主控单片机的TXD相连。若设计为接收模块,则将TXEN端置为低电平;同时,DOUT引脚与微控制器的RXD端相连,微控制器的RXD引脚与外部主控单片机的TXD引脚相连。模块与外部单片机的通信波特率为自动检测方式,受nRF401芯片通信速率的限制,可以工作在1 200~19 200 bps。模块上预留ICSP接口,可在系统编程,方便程序的升级;同时具有良好的防窃密功能,不易破解。
2.2 串口模拟及波特率自适应的实现
模块上的微控制器AT89S51既要控制nRF401芯片实现与外界的数据交换功能,又必须受控于模块外部的主控单片机,因此AT89S51必须能同时与nRF401芯片和片外主控单片机通信;但AT89S51只有一个UART,无法满足要求。为解决这一予盾,通常的做法是扩展一片8251或8250通用同步/异步接收发送芯片(USART),但会额外占用单片机I/O资源,增加系统的成本,同时也增大了PCB板的布局面积。在本系统中用单片机普通I/O口模拟串行口,利用该方法还可扩展多个外部串行端口,实现多机通信。
要实现用普通的I/O口模拟串口,必须首先确定串行口的通信速率(即波特率)。本系统中,该模块设计成波特率为1 200~19 200 bps自适应式的通信模块,自身的波特率能随主控单元的变化而自动调整,使系统适应性更强,更智能化,因此,必须首先解决好波特率自动检测识别的问题。
2.2.1 波特率自动检测识别的实现
波特率自动检测识别的常用方法主要有两种。
(1) 标准波特率穷举法
标准波特率穷举法要求主机侧的波特率必须在有限的几个固定数值之间变化,如300~9 600的标准值;同时从机侧的工作振荡频率已知且稳定。从机启动通信程序后,逐个尝试以不同的波特率接收主机发出的特定字符,直到能正确接收为止。因此,该方法的运用有一定的局限性。
(2) 码元宽度实时检测法
码元宽度实时检测法是先通过单片机的定时器测量接收(RXD)引脚上输入数据的码元宽度,即机器周期的计数值,而后用软件计算出波特率发生寄存器的值。该方法由于适用范围广、操作灵活,因而应用较为普遍。
在本系统中用码元宽度实时检测法确定出主机的波特率,而后从机自身进行相应的设置。理论上,只要能够测出一个码元的宽度就能确定出数据传输的波特率;但在实际测量过程中,为保证测量的准确性,通常采取测量连续8个码元宽度的方法。这里,采用了较为常用的异步串行通信数据格式(即1个起始位、8个数据位、无校验、1个停止位,发送时低位数据在前,高位在后),因此连续8个码元宽度的时间可以通过在主机侧发0x80H的方式实现,其波形如图3所示。起始位加7个码元宽度的低电平,刚好构成8个脉宽的低电平。单片机采用串口中断的方式接收数据,当有数据到达时,打开定时器,同时不断查询接收引脚的状态;当RXD变为高电平后停止计数,这样单片机就可以测量出此低电平持续的宽度。
设主机侧的波特率为BPS,其值未知,则此时连续8个码元的宽度计算公式为:
设模块内AT89S51单片机的工作频率为fOSC,用定时器T1方式2(常数自动装入方式)产生波特率,串行口工作在方式1,此时串口的波特率BAUD由定时器T1的溢出率和SMOD位同时决定。
当T1用作波特率发生器时,寄存器TL1用作计数器,而自动重装的值放在TH1内,设初始值为X,则每过“256-X”个机器周期,定时器T1就会产生一次溢出。为了避免因溢出而产生不必要的中断,此时禁止T1中断。AT89S51内部机器周期为振荡周期的12分频,因此,T1的溢出周期为:
将式(3)代入式(2)得此时的波特率为:
设此时采用波特率加倍的方式(即SMOD=1),且模块的波特率与主机的波特率相等,即:
将式(4)代入式(1)可得:
设AT89S51内部定时器T1测量连续8个码元计数值为M,由于是对内部的机器周期计数,且机器周期是内部振荡周期的12分频,所以总数为M的机器周期代表的实际时间是:
很明显,式(6)与式(7)应相等,因此有如下等式成立:
由上式即可得单片机定时器T1的初值在波特率自适应情况下的计算公式:
由式(9)可以看出,其初值不依赖于单片机的工作频率,因此,只要单片机的工作频率相对稳定即可,对具体数值无要求。
另外,需要说明的是,对于串行异步通信,通信双方的波特率不必严格相等,只要双方的差别在一定的范围之内,就可以实现准确的通信。
2.2.2 软件模拟串口的实现
波特率确定以后,即可用软件模拟实现串行口。就单片机而言,要实现模拟串口,必须解决好时序问题,不能造成通信过程中的数据丢失,为此,采用单片机的外部中断0口的下降沿触发功能模拟串口数据接收线RXD,P1.2口模拟串口数据发送线TXD,定时器T0以定时中断方式对接收码元采样或发送数据流,实现了一个软件的串口。
对于软件模拟串口,关键在于解决好时序问题。本系统中,充分利用了nRF401芯片半双工通信的特点(即数据发送和接收不能同时进行),成功地实现了一个软件串行口。串行数据的发送实现相对较为简单,只需利用定时器使发送出去的码元维持一定的时间宽度;实现异步串行接收的关键是起始位的检测和信息位的准确提取。任何时候数据传送都可能发生,故要求接收方必须能够及时准确地接收数据,而通信过程中没有同步信号,因此串行数据的提取相对而言具有一定的难度。为此,采用AT89S51的外部中断0口模拟RXD,并没置其中断方式为边沿触发,平常维持其为高电平。由于起始位为低电平,因此,当有数据到达后就会产生中断,则根据波特率设置的定时时间间隔进行数据采样,即可实现串行数据的接收。
结 语
基于本思想设计的无线数据传输模块,已成功地运用于“磁栅式浮动检测仪”项目中。经实践检验,系统工作稳定可靠,具有一定的工程实用价值。