📄 51+ch375.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0036)http://www.daxia.com/list_1700.shtml -->
<HTML><HEAD><TITLE>大虾电子-51+ch375读写U盘超精简原程序(啊雨)</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312"><LINK
href="51+ch375.files/style.css" rel=stylesheet>
<META content="MSHTML 6.00.2900.3132" name=GENERATOR></HEAD>
<BODY>
<DIV align=center>
<CENTER>
<SCRIPT type=text/javascript><!--
google_ad_client = "pub-1260019700816245";
google_alternate_ad_url = "http://www.daxia.com/product/dx58";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_color_bg = "efefef";
google_ad_type = "text";
google_ad_channel ="";
//--></SCRIPT>
<SCRIPT src="51+ch375.files/show_ads.js" type=text/javascript>
</SCRIPT>
</CENTER></DIV>
<DIV align=center>
<CENTER>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=0 width="97%"
borderColorLight=#000000 border=1>
<TBODY>
<TR>
<TD width="100%" bgColor=#d0d0d0>
<P align=center>文章编号:1700----加入日期:2005-3-15 </P></TD></TR>
<TR>
<TD width="100%">
<P align=right><A href="javascript:self.close()">『关闭窗口』</A></P></TD></TR>
<TR>
<TD width="100%">
<P align=center><B>51+ch375读写U盘超精简原程序(啊雨)</B></P></TD></TR>
<TR>
<TD width="100%">
<BLOCKQUOTE><BR>/*
这个程序用180行C代码就能够读取FAT16文件系统U盘的根目录,可以看到根目录下的文件<BR>名,并可显示<BR>首文件内容,不过,该程序很不严谨,也没有任何错误处理,对U盘兼容性较差,只是用于简单试<BR>验,作为参考.<BR>这个程序可以支持WINDOWS按FAT16格式化的U盘,因为程序精简,所以只兼容超过50%以上的U<BR>盘品牌,如果换<BR>成CH375A芯片则兼容性可提高到85%,当然,如果使用WCH公司的子程序库或者正式版本的C源<BR>程序兼容性更好。<BR>下<BR>欢测试以下U盘通过:郎科/超稳经典64M/超稳迷你128M/U160-64M/超稳普及128M,爱国者/迷<BR>你王16M/邮箱型,<BR>黑匣子/64M,微闪/64M,飙王/32M/64M/128M,晶彩/C200-64M,新科/256M,昂达/128M...,欢迎<BR>提供测试结果<BR>未通过U盘:爱国者/智慧棒128M,清华普天/USB2.0-128M,当然,使用WCH的子程序库或CH375A<BR>都可以测试通过
*/<BR><BR>#include <stdio.h><BR>#include "CH375INC.H"<BR>#include
<reg51.h> /* 以下定义适用于MCS-51单片机,其它单片机参照修改
*/<BR>#define UINT8 unsigned
char<BR>#define UINT16 unsigned
short<BR>#define UINT32 unsigned
long<BR>#define UINT8X unsigned char
xdata<BR>#define UINT8VX unsigned char
volatile xdata<BR>UINT8VX CH375_CMD_PORT _at_
0xBDF1; /* CH375命令端口的I/O地址
*/<BR>UINT8VX CH375_DAT_PORT _at_
0xBCF0; /* CH375数据端口的I/O地址
*/<BR>#define CH375_INT_WIRE INT0 /*
P3.2, 连接CH375的INT#引脚,用于查询中<BR>断状态
*/<BR>UINT8X DISK_BUFFER[512*32] _at_
0x0000; /* 外部RAM数据缓冲区的起始地址
*/<BR><BR>UINT32 DiskStart; /*
逻辑盘的起始绝对扇区号LBA
*/<BR>UINT8 SecPerClus; /* 逻辑盘的每簇扇区数
*/<BR>UINT8 RsvdSecCnt; /* 逻辑盘的保留扇区数
*/<BR>UINT16 FATSz16; /*
FAT16逻辑盘的FAT表占用的扇区数 */<BR><BR>/* **********
硬件USB接口层,无论如何这层省不掉,单片机总要与CH375接口吧 */<BR><BR>void mDelaymS(
UINT8 delay ) {<BR> UINT8 i, j,
c;<BR> for ( i = delay; i != 0; i -- )
{<BR> for ( j = 200; j != 0; j -- ) c +=
3;<BR> for ( j = 200; j != 0; j -- ) c +=
3;<BR> }<BR>}<BR><BR>void CH375_WR_CMD_PORT( UINT8 cmd )
{ /* 向CH375的命令端口写入命令
*/<BR> CH375_CMD_PORT=cmd;<BR> for ( cmd = 2; cmd
!= 0; cmd -- ); /* 发出命令码前后应该各延时2uS */<BR>}<BR>void
CH375_WR_DAT_PORT( UINT8 dat ) { /* 向CH375的数据端口写入数据
*/<BR> CH375_DAT_PORT=dat; /*
因为MCS51单片机较慢所以实际上无需延时 */<BR>}<BR>UINT8 CH375_RD_DAT_PORT( void )
{ /* 从CH375的数据端口读出数据 */<BR> return(
CH375_DAT_PORT ); /*
因为MCS51单片机较慢所以实际上无需延时 */<BR>}<BR>UINT8 mWaitInterrupt( void )
{ /* 等待CH375中断并获取状态,返回操作状态 */<BR> while(
CH375_INT_WIRE ); /* 查询等待CH375操作完成中断(INT#低电平)
*/<BR> CH375_WR_CMD_PORT( CMD_GET_STATUS ); /*
产生操作完成中断,获取中断状态 */<BR> return( CH375_RD_DAT_PORT( )
);<BR>}<BR><BR>/* ********** BulkOnly传输协议层,被CH375内置了,无需编写单片机程序
*/<BR><BR>/* **********
RBC/SCSI命令层,虽然被CH375内置了,但是要写程序发出命令及收发数据 <BR>*/<BR><BR>UINT8 mInitDisk(
void ) { /* 初始化磁盘 */<BR> UINT8
Status;<BR> CH375_WR_CMD_PORT( CMD_GET_STATUS
); /* 产生操作完成中断, 获取中断状态 */<BR> Status =
CH375_RD_DAT_PORT( );<BR> if ( Status == USB_INT_DISCONNECT )
return( Status ); /* USB设备断开
*/<BR> CH375_WR_CMD_PORT( CMD_DISK_INIT ); /*
初始化USB存储器 */<BR> Status = mWaitInterrupt( ); /*
等待中断并获取状态 */<BR> if ( Status != USB_INT_SUCCESS ) return(
Status ); /* 出现错误 */<BR> CH375_WR_CMD_PORT(
CMD_DISK_SIZE ); /* 获取USB存储器的容量 */<BR> Status =
mWaitInterrupt( ); /* 等待中断并获取状态 */<BR> if ( Status
!= USB_INT_SUCCESS ) { /* 出错重试 */<BR>/*
对于CH375A芯片,建议在此执行一次CMD_DISK_R_SENSE命令
*/<BR> mDelaymS( 250
);<BR> CH375_WR_CMD_PORT( CMD_DISK_SIZE
); /* 获取USB存储器的容量 */<BR> Status =
mWaitInterrupt( ); /* 等待中断并获取状态
*/<BR> }<BR> if ( Status != USB_INT_SUCCESS )
return( Status ); /* 出现错误 */<BR> return( 0
); /* U盘已经成功初始化 */<BR>}<BR><BR>UINT8 mReadSector(
UINT32 iLbaStart, UINT8 iSectorCount, UINT8X *oDataBuffer )
<BR>{<BR> UINT16 mBlockCount;<BR> UINT8 c;<BR> CH375_WR_CMD_PORT(
CMD_DISK_READ ); /* 从USB存储器读数据块
*/<BR> CH375_WR_DAT_PORT( (UINT8)iLbaStart ); /*
LBA的最低8位 */<BR> CH375_WR_DAT_PORT( (UINT8)( iLbaStart
>> 8 ) );<BR> CH375_WR_DAT_PORT( (UINT8)( iLbaStart
>> 16 ) );<BR> CH375_WR_DAT_PORT( (UINT8)( iLbaStart
>> 24 ) ); /* LBA的最高8位
*/<BR> CH375_WR_DAT_PORT( iSectorCount ); /* 扇区数
*/<BR> for ( mBlockCount = iSectorCount * 8; mBlockCount !=
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -