引言
在以往设计的远程终端设备RTU(Remote Terminal Unit)中,经常需要批量提取、转存数据,或是更新设备中的程序,或是对设备进行维修,由于设备上只有串口而没有USB接口。要想维修必须将设备带回来,但是RTU一般都是安装在野外或者是离维修站特别远的地方,这就给设备的维修、程序更新以及数据的提取、转存带来了极大的不便。现在我们设计开发的USB模块就可以轻松解决以上问题。
1、系统硬件设计
1.1 CH375概述
CH375(见图1)是USB总线的HOST主机及DEVICE设备双用接口芯片,单片机可以通过CH375读写U盘中的数据,利用该芯片可在不了解任何USB协议或固件程序甚至驱动程序的情况下,轻松地将并口或串口产品升级到USB接口。
图1 CH375及外围电路
CH375的USB主机方式支持常用的USB全速设备,外部单片机可以通过CH375按照相应的USB协议与USB设备通讯。CH375还内置了处理Mass—Storage海量存储设备的专用通讯协议的固件,外部单片机可以直接以扇区为基本单位读写常用的USB存储设备。
1.2 系统硬件描述
硬件连接原理图见图2。CH375通过数据线D0一D7连接ATMEGA32(见图3)数据I/O口,用于传输字数据。图2中,INT#为中断信号线,用于ATMEGA32接收来自CH375的中断信号;CS#为ATMEGA32对CH375芯片的片选信号线,一般接入主机端的地址线;RD#、WR#为ATMEGA32对CH375的读选通、写选通控制信号,与ATMEGA32端的RD#、WR#相连,这三个控制信号都是低电平有效;A0连接ATMEGA32的地址线,以区分传输的是命令还是数据,为1时表示是命令。为0时表示是数据;D+、D一为USB总线的差分信号线,用于CH375与USB设备的数据传输。CH375芯片的ACT#引脚用于内置固件的USB设备方式下的状态指示,本设计中通过lkl2电阻接红色二极管,在内置固件的USB设备方式下,当USB设备尚未配置或者取消配置后该引脚输出高电平,当USB设备配置完成后该引脚输出低电平。本设计中,将CH375的TXD引脚通过lkl2左右的下拉电阻接地或者直接接地,从而使CH375工作于并口方式。CH375芯片的UD+和UD一引脚是USB信号线,工作于USB设备方式时,应该直接连接到USB总线上;工作于USB主机方式时,可以直接连接到USB设备。
图2 CH375硬件连接原理图
图3 ATMEGA32引脚图
2、软件设计
软件流程图见图4。
图4 软件流程图
2.1 底层驱动的实现
USB系统驱动程序的设计是基于wDM(Windows Driver Model,驱动程序模型)的。由于CH375已经对固件程序进行了封装,包含了对海量存储设备通讯协议的处理,所以这~层就不需要考虑底层驱动的实现了。
对于常用的读写U盘操作,以按字节方式,可定义实现以下两个读写U盘内容的API函数。unsigned char CH375-ReadUD(unsigned char xdata+pData,longLbaNo.uint BytesLen) unsigned char CH375一WriteUD(unsigned char xdata。pData.10ng LbaNo,uint BytesLen)
个函数表示从4个字节表示的U盘I.baNo地址开始读取Bytesl,en长度的字节到pData所指的缓冲区中;第二个函数表示将pData所指的外RAM单元内容读取BytesI。en字节长度并写入到U盘以LbaNo开始的地址中去。
2.2 文件系统的实现
由于很多系统终会与Windows操作系统的个人计算机交换数据,所以为了方便数据交换,U盘中的数据应该符合Windows文件系统格式。CH375提供了U盘文件级子程序库,单片机可以直接调用子程序读写U盘中的文件数据。ATMEGA32可通过CH375按字节或扇区等方式读写U盘,这种方式将USB存储设备简化为一种外部数据存储器,这时写入U盘的数据不能直接用计算机读取,需要专门的工具才能查看。
为了使U盘的数据能够被计算机识别和操作,需要将写入的数据组织成文件,U盘通常支持的文件格式为FATl2/16/3z,考虑到U盘的容量,常用的文件系统是FATl6。
2.3 端口初始化
由于使用通用I/0模块并口读写时序,所以需要初始化端口。设置PA7~PAO的8位作为数据并口输入,设置CS、WR、RD默认为输出高电平,设置INT#为输入,采用查询方式处理。端口初始化程序如下:
void CH375_PORT~INlT()
{DDRA=0x00;
PORTD=0xF3;
DDRD=0x7A;
)
2.4 CH375芯片初始化
初始化CH375程序库和CH375芯片,操作成功返回0。初始化程序如下:
void CH375-INIT(void)
{UINT8i;
CH375一PORT—INIT():
mDelaymS(100);/*延时100毫秒*/
i=CH375Liblnit()I
mStopIfError(i);
}
2.5 定义文件操作
根据FATl6系统的磁盘特性。定义所需要的各种操作函数,提供给外部调用以实现对文件的各种操作。下面对几个常用的操作函数的定义方法加以说明。
(1) 打开文件或目录程序如下:
void FILEOpen(UINT8’pCodeStr)
{ UINT8i;
strcpy((char*)mCmdParam.Create.mPathName。(char
*)pCodeStr);
i=CH375FileOpen()l
mStopIfError(i);
)
(2) 创建文件程序如下:
void FII.ECreate(UINT8’pCodeStr)
{ UINT8 i;
strcpy((char*)mCmdParam.Create.mPathName.(char
*)pCodeStr):
i=CH375FileCreate();
mStopIfError(i);
)
(3) 删除文件程序如下:
void FILEDelete(UINT8’pCodeStr)
{ UINT8i;
strcpy((char*)mCmdParam.Create.mPathName.(char
*)pCodeStr)l
i=CH375FileErase();
if(i!=ERR-SUCCESS);
)
(4) 本文以字节为单位写U盘文件,读写速度较扇区模式慢,但是由于字节模式读写文件不需要文件数据缓冲区FII。E—DATA—BUF,所以总共只需要600字节的RAM,适用于单片机硬件资源有限、数据量小并且读写速度要求不高的系统,写U盘文件程序如下:
void FILEWrite(UINT8’pDataStr.UINT8 FILENUM.UINT32
SectorOff)
{ UINT8 i。C;
unsigned mt k,1"11 l
mCmdParam.Locate.mSectorOffset=SectorOff;/*移动文件指针*}
i=CH375FileLocate();
mStoplfError(i);
for(k=FILENUM;k>0;k-一)
{ for(m=0;m<512;)
{e=”pDataStr}
FILE—DATA~BUFEm++]=C;
pDataStr++;
}
mCmdParam.Write.mSectorCount=l;
i=CH375FileWrite();/*写人数据*/
mStoplfError(i);
mCmdParam.Write.mSector(:ount=0:
i=CH375FileWrite()I/*写入数据*/
mStoplfError(i);
}
cH375Di rtyBuffer();/*清磁盘缓冲*/
)
程序中pDataStr是写入数据的首地址,FII。ENUM是写入扇区的个数,Sector()ff是写入文件的位置,CH375子程序库内部是将文件长度按扇区长度512进行取整处理,当移到文件尾部,如果文件尾部有不足一个扇区的零头数据则被忽略,如果不做处理那么零头数据将可能被写入数据覆盖。
读文件与写文件的过程类似。这里用到CMD—DISK—RD—GO命令,限于篇幅在这里不将源代码列出。
3、总结
USB-HOST模块用于远程终端设备中,该模块在实际数据采集中运行时,读写文件与设想基本一致。符合移动数据交换的设计要求。由于基于CH375的U盘渎写模块只支持USB1.1通讯协议,该模块只能在USB1.1协议下进行数据交换。该设计现已被用于远程终端设备上,利用该模块,设备可以直接和USB存储设备相连进行数据的转存和程序的更新,从而很大程度上方便了用户。
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。