?? 51+ch375讀寫u盤超精簡原程序(啊雨).htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0037)http://www.daxia.com/list.asp?id=1700 -->
<HTML><HEAD><TITLE>51+ch375讀寫U盤超精簡原程序(啊雨)</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312"><LINK
href="51+ch375讀寫U盤超精簡原程序(啊雨).files/style.css" rel=stylesheet>
<META content="MSHTML 6.00.2900.2604" name=GENERATOR></HEAD>
<BODY>
<DIV align=center>
<CENTER></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 !=
0; mBlockCount -- ) {<BR> c = mWaitInterrupt(
); /* 等待中斷并獲取狀態 */<BR> if ( c ==
USB_INT_DISK_READ ) { /* 等待中斷并獲取狀態,請求數據讀出
*/<BR> CH375_WR_CMD_PORT(
CMD_RD_USB_DATA ); /* 從CH375緩沖區讀取數據塊
*/<BR> c = CH375_RD_DAT_PORT(
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -