本文来源于一智能项目(功能模块如图1所示)。在列车或其他重要电工场合,重要部件的温度变化是极需重视的安全参数,必须为其设计智能温度监测系统。当温度超标时,不但要能及时报警,还要实时记录并保存精确的时间、温度数据。通过对危险时刻及该时刻对应温度数据进行统计分析,可以检出不安全因素发生的规律,以制定有效的预防措施。
在图1中,数据存储模块采用USB总线接口方式,主要是由于USB具有可“热插拔”的特性,使保存数据的操作更为简便。采用作USB接口芯片,则是基于以下因素的考虑。
一般情况下,单片机或嵌入式系统处理USB存储设备的文件系统需要实现USB-HOST硬件接口数据交换层、传输协议层、SCSI/UFI/RBC命令层及文件系统管理4个层次。CH375的长处在于它内置了相关固件程序,包含了以上提到4个层次中的前3个。利用该芯片进行USB存储设备操作开发,就只需集中处理FAT文件系统层,大大缩短了开发的周期,对项目开发无疑是很好的选择。
CH375厂商已将文件系统管理层封包成库,对其进行开发时这一层可以忽略。然而,由于厂商未对一般用户提供此方面源码
,开发过程中也带来了一些问题,例如:由于没有文件管理的C源码,进行程序调试就只能查看编译后的汇编代码,导致调试工作繁复,收效甚微;其次,尽管编译器已经作了优化,但编译后所占的系统资源仍远比用户自编文件管理子程序的大,这对资源极其有限的单片机非常不利;再次,由于开发平台不尽相同,芯片厂商提供的库子程序并不总有效,例如系统选用不同晶振时,库函数中的内嵌延时段的实现效果也会发生变化,往往造成USB设备与主机失去同步,这对于AVR等高档单片机更是如此。
由此可见,利用CH375操作USB存储设备,开发者很有必要熟悉FAT文件系统的格式。下文将从项目开发的实际出发,着重介绍进行文件管理的原理及编程步骤,以解决上文提及的困难。
1 USB总线接口的设计
1.1 硬件电路设计
如图2所示,CH375芯片的TXD引脚接地,从而使其工作于并口模式。CH375芯片的8位双向数据总线直接与MCU数据口相连,RD#和WR#分别连接到单片机的读选通输出引脚和写选通输出引脚。片选信号CS#、中断引脚INT#以及地址输入线A0分别与MCU任意分配的引脚相连。当CS#为低电平时,选通CH375芯片;CH375向MCU请求中断时,将INT#引脚电平拉低;当A0引脚为高电平时,选择CH375的命令端口,可以写入命令,为低电平时选择数据端口,可以读写数据。
1.2 软件设计及实现
本系统要求当普通U盘接入时,系统自动在其根目录下创建名为 “DATA.TXT”的文件,将MCU内置RAM已记录的温度、时刻数据以字符串格式写入该文件;若文件已存在,则将数据追加至文件末尾;最后返回主程序。软件按图3所示流程进行设计,电路上电后,先测试芯片是否能对单片机输出指令正确做出反应,必要时进行硬件复位,接着将芯片工作模式设置为模式6,即自动发送SOF包的主机模式,这样,CH375与单片机就构成了最基本的USB-HOST,当USB设备接人时,接收到该包,就会让该包通过。CH375检测到设备连接上后会向MCU发中断信号,接着以查询CH375中断状态的方式等待U盘插入,若检测到表征设备接入的中断状态,则表明U盘已连接。接着向CH375输出 CMD_DISK_INIT,该命令将复位USB总线、读取并分析设备的描述符,然后自动配置,并建立起与设备之间的连接,完成后返回中断状态 USB_INT_SUCCESS。上述步骤执行之后,芯片初始化的工作就完成了。
接着编写扇区读写程序。对于存储设备来说,文件管理几乎都是“块操作”方式,即使只修改存储设备中一比特的数据,也必须将包含该比特的整个扇区读出,找到相应位置进行修改,再把修改好的扇区数据写回原位置。对于大多数USB接口芯片,读写扇区的阶段要求我们熟悉 SCSI或UFO协议指令,利用特定指令来完成操作。而CH375内嵌了支持此方面指令的固件,当读扇区时,发CMD_DISK_READ,与 CMD_DISK_RD_GO配合使用,则可在USB存储设备中任意读取1至255个扇区的数据;只需将CMD_DISK_WRITE与 CMD_DISK_WR_GO指令结合使用,则可在U盘中任意写入1至255个扇区数据。
进行文件读写前,必须完成以下工作:
评论
加载更多