51ch375读写U盘超精简原程序_第1页
51ch375读写U盘超精简原程序_第2页
51ch375读写U盘超精简原程序_第3页
51ch375读写U盘超精简原程序_第4页
51ch375读写U盘超精简原程序_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文格式为Word版,下载可任意编辑——51ch375读写U盘超精简原程序51+ch375读写U盘超精简原程序(啊雨)/*这个程序用180行C代码就能够读取FAT16文件系统U盘的根目录,可以看到根目录下的文件名,并可显示首文件内容,不过,该程序很不严谨,也没有任何错误处理,对U盘兼容性较差,只是用于简单试验,作为参考.这个程序可以支持WINDOWS按FAT16格式化的U盘,由于程序精简,所以只兼容超过50%以上的U盘品牌,假使换成CH375A芯片则兼容性可提高到85%,当然,假使使用WCH公司的子程序库或者正式版本的C源程序兼容性更好。下欢测试以下U盘通过:郎科/超稳经典64M/超稳迷你128M/U160-64M/超稳普及128M,爱国者/迷你王16M/邮箱型,黑匣子/64M,微闪/64M,飙王/32M/64M/128M,晶彩/C200-64M,新科/256M,昂达/128M...,欢迎提供测试结果未通过U盘:爱国者/聪慧棒128M,清华普天/USB2.0-128M,当然,使用WCH的子程序库或CH375A都可以测试通过*/#include#include\#include/*以下定义适用于MCS-51单片机,其它单片机参照修改*/#defineUINT8unsignedchar#defineUINT16unsignedshort#defineUINT32unsignedlong#defineUINT8Xunsignedcharxdata#defineUINT8unsignedcharvolatilexdataUINT8CH375_CMD_PORT_at_0xBDF1;/*CH375命令端口的I/O地址*/UINT8CH375_DAT_PORT_at_0xBCF0;/*CH375数据端口的I/O地址*/#defineCH375_INT_WIREINT0/*P3.2,连接CH375的INT#引脚,用于查询中断状态*/UINT8XDISK_BUFFER[512*32]_at_0x0000;/*外部RAM数据缓冲区的起始地址*/UINT32DiskStart;/*规律盘的起始绝对扇区号LBA*/UINT8SecPerClus;/*规律盘的每簇扇区数*/UINT8RsvdSecCnt;/*规律盘的保存扇区数*/UINT16FATSz16;/*FAT16规律盘的FAT表占用的扇区数*//***********硬件USB接口层,无论如何这层省不掉,单片机总要与CH375接口吧*/voidmDelaymS(UINT8delay){UINT8i,j,c;for(i=delay;i!=0;i--){for(j=200;j!=0;j--)c+=3;for(j=200;j!=0;j--)c+=3;}}voidCH375_WR_CMD_PORT(UINT8cmd){/*向CH375的命令端口写入命令*/CH375_CMD_PORT=cmd;for(cmd=2;cmd!=0;cmd--);/*发出命令码前后应当各延时2uS*/}voidCH375_WR_DAT_PORT(UINT8dat){/*向CH375的数据端口写入数据*/CH375_DAT_PORT=dat;/*由于MCS51单片机较慢所以实际上无需延时*/}UINT8CH375_RD_DAT_PORT(void){/*从CH375的数据端口读出数据*/return(CH375_DAT_PORT);/*由于MCS51单片机较慢所以实际上无需延时*/}UINT8mWaitInterrupt(void){/*等待CH375中断并获取状态,返回操作状态*/while(CH375_INT_WIRE);/*查询等待CH375操作完成中断(INT#低电平)*/CH375_WR_CMD_PORT(CMD_GET_STATUS);/*产生操作完成中断,获取中断状态*/return(CH375_RD_DAT_PORT());}/***********BulkOnly传输协议层,被CH375内置了,无需编写单片机程序*//***********RBC/SCSI命令层,虽然被CH375内置了,但是要写程序发出命令及收发数据*/UINT8mInitDisk(void){/*初始化磁盘*/UINT8Status;CH375_WR_CMD_PORT(CMD_GET_STATUS);/*产生操作完成中断,获取中断状态*/Status=CH375_RD_DAT_PORT();if(Status==USB_INT_DISCONNECT)return(Status);/*USB设备断开*/CH375_WR_CMD_PORT(CMD_DISK_INIT);/*初始化USB存储器*/Status=mWaitInterrupt();/*等待中断并获取状态*/if(Status!=USB_INT_SUCCESS)return(Status);/*出现错误*/CH375_WR_CMD_PORT(CMD_DISK_SIZE);/*获取USB存储器的容量*/Status=mWaitInterrupt();/*等待中断并获取状态*/if(Status!=USB_INT_SUCCESS){/*出错重试*//*对于CH375A芯片,建议在此执行一次CMD_DISK_R_SENSE命令*/mDelaymS(250);CH375_WR_CMD_PORT(CMD_DISK_SIZE);/*获取USB存储器的容量*/Status=mWaitInterrupt();/*等待中断并获取状态*/}if(Status!=USB_INT_SUCCESS)return(Status);/*出现错误*/return(0);/*U盘已经成功初始化*/}UINT8mReadSector(UINT32iLbaStart,UINT8iSectorCount,UINT8X*oDataBuffer){UINT16mBlockCount;UINT8c;CH375_WR_CMD_PORT(CMD_DISK_READ);/*从USB存储器读数据块*/CH375_WR_DAT_PORT((UINT8)iLbaStart);/*LBA的最低8位*/CH375_WR_DAT_PORT((UINT8)(iLbaStart>>8));CH375_WR_DAT_PORT((UINT8)(iLbaStart>>16));CH375_WR_DAT_PORT((UINT8)(iLbaStart>>24));/*LBA的最高8位*/CH375_WR_DAT_PORT(iSectorCount);/*扇区数*/for(mBlockCount=iSectorCount*8;mBlockCount!=0;mBlockCount--){c=mWaitInterrupt();/*等待中断并获取状态*/if(c==USB_INT_DISK_READ){/*等待中断并获取状态,请求数据读出*/CH375_WR_CMD_PORT(CMD_RD_USB_DATA);/*从CH375缓冲区读取数据块*/c=CH375_RD_DAT_PORT();/*后续数据的长度*/while(c--)*oDataBuffer++=CH375_RD_DAT_PORT();CH375_WR_CMD_PORT(CMD_DISK_RD_GO);/*继续执行USB存储器的读操作*/}elsebreak;/*返回错误状态*/}if(mBlockCount==0){c=mWaitInterrupt();/*等待中断并获取状态*/if(c==USB_INT_SUCCESS)return(0);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论