|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区
您需要 登录 才可以下载或查看,没有账号?立即注册
×
1 引言
USB(Universal Serial Bus通用串行总线)是一种快速、灵活的总线接口。与其它通信接口比较,USB接口的最大特点是易于使用,支持热插拔,并且所有的配置过程都由系统自动完成,无需用户干预。USB接口已成为现代微型计算机的标准配置。
短距离无线通信,具有抗干扰能力强、可靠性高、安全性好、受地理条件限制较少、安装施工简便灵活等特点,应用非常广泛,如汽车遥控门钥、无线抄表、饭店的无线点菜、遥控遥测、小区自动化等等。
结合上述两种技术的优点,本文提出了一种无线USB的实现方案,可进行短距离数据的高速传输。以此为基础,可快速开发出相关的短距离无线通信产品。
2 应用芯片
PDIUSBD12 是一款Philips公司生产的高性价比USB 器件,其内部集成有320 bit的FIFO存储器、时钟发生器、串行接口引擎(SIE)、收发器和3.3 V电压转换器,完全符合USB1.1版的规范,可进行12M bit/s的数据传输。它还提供与微控制器进行通信的高速通用并行接口,并支持本地的DMA传输。
PDIUSBD12有三个端点:控制端点、通用端点和主端点,可配置成四种模式以满足不同的需要。片上集成一个6~48 MHz的倍频锁相环(PLL),允许使用6 MHz的低频晶振,从而使电磁干扰大大减小,给PCB布线带来了极大方便。它所提供的GoodLink接口可接LED,根据通信的状况间歇闪烁,指示USB的连接状况。
PDIUSBD12所具有的低挂起功耗连同LazyClock输出,可以满足ACPI、OnNOW和USB 电源管理的要求。低的操作功耗可以应用于使用总线供电的外设。此外,它还集成了 SoftConnetTM、可编程时钟输出和终止寄存器集合等多种特性,不仅为系统节约了成本,而且使USB 功能在外设上的应用变得更加容易。
nRF401是挪威Nordic公司最新推出的数传频段 433MHz单片无线收发一体芯片。采用FSK调制解调技术,最高数据传输率达20k bit/s,最大发射功率为+10dBm,接收灵敏度高达-105dBm,开阔地的使用距离最远可达1000m。天线接口设计为差分天线,可以采用低成本的PCB天线。该芯片为低功耗设计且支持待机模式,接受状态下的功耗为250mA,发射状态下的功耗为8mA,等待状态功耗仅为8mA。它的工作电压范围很宽,可以从2. 7~5V。它的外围元件很少,只包括一个基准晶振和几个无源器件,没有调试部件,可以直接与单片机串口连接,给设计和生产带来了极大的方便。
3 硬件设计
本文设计的无线USB方案的硬件结构如图1所示。
微控制器MCU采用PHILIPS的P89C58UBP,具有32k EEPROM、256 Byte RAM和三个定时/计数器,最高时钟可达33MHz。MCU的串口与 nRF401的RX、TX直接相连,TXEN(发送接收控制)、PWR_UP(芯片挂起)、CS(发射频率选择)分别由MCU的I/O脚控制。 PDIUSBD12接在MCU的数据总线上,中断引脚/INT接在MCU的中断输入上。PDIUSBD12会对USB总线上的数据自动进行处理,将事件写入自身的中断寄存器,并拉低/INT通知MCU。MCU响应中断,并读取中断寄存器的内容进行判断处理。如果是要求数据发送,则将数据通过串口发往nRF401,由其发射出去。同样nRF401接收到数据后触发串口中断, MCU响应中断将数据送入USB总线。整套系统使用USB总线供电。
4 软件设计
该系统的软件设计包括P89C58UBP中的固件设计和微机端的通信软件设计。其中,固件部分的流程图如图2所示。
后台D12中断服务程序和nRF401中断服务程序与前台主循环程序之间的数据交换,通过事件标志和数据缓冲区来实现。后台中断服务程序由中断触发,通过标志位与主模块通信。主模块循环扫描各标志位,对相应的标志位做出处理。例如,nRF401 接受到有效数据后,送入串口触发串口中断,进入nRF401中断服务程序,将数据接收后放入数据缓冲区,然后设置UART_DATA标志,退出子模块。主模块查询到UART_DATA被置位,则调用 writendpoint()程序将数据发往PC。
值得注意的是,nRF401在接受状态下即使没有数据接受,也会有随机码输出。因此需要在所需传输的数据前加入标识头,如55AAH。当检测到从串口进入的数据为55AAH时,再开始有效数据的接受。
对PC而言,无线USB传输模块是它的一个USB外设,因此必须提供USB设备的驱动程序。驱动程序的设计采用WDM模型,使用DriverStudio 进行开发。DriverStudio是一款优秀的驱动程序开发软件。启动DriverStudio中DriverWizard,填写USB设备的端点配置,便会自动生成驱动程序原代码和相应的测试程序原代码,只需稍做改动便可用VC6.0编译运行[5]。驱动程序向用户程序提供标准的IO接口:WriteFile ()、 ReadFile() 、DeviceIoControl ()。用户程序调用相应的函数,即可实现对USB设备的访问。下面的例子是实现向USB总线写数据的功能。
hFile = open_file(threadParam->pipe_name); //打开需要使用的端点
……
bResult = WriteFile(hFile,
threadParam->pcIoBuffer,
//等待传送的数据缓冲区地址
threadParam->uiLength, //数据长度
&nBytes,
NULL); //向该端点写入数据
if (bResult != TRUE) { //出错处理 DeviceIoControl(hFile, //复位该端点
IOCTL_D12_RESET_PIPE,
0, 0, 0, 0,
&nBytes,
NULL);}
编程过程中要注意串口波特率要一致,否则会造成接受数据错误。nRF401周围的布线和天线的设计很有讲究,一定要按照手册的要求进行设计。 |
|