/* 這個(gè)程序用180行C代碼就能夠讀取FAT16文件系統(tǒng)U盤的根目錄,可以看到根目錄下的文件名,并可顯示首文件內(nèi)容,不過,該程序很不嚴(yán)謹(jǐn),也沒有任何錯(cuò)誤處理,對(duì)U盤兼容性較差,只是用于簡單試驗(yàn),作為參考.
這個(gè)程序可以支持WINDOWS按FAT16格式化的U盤,因?yàn)槌绦蚓?所以只兼容超過50%以上的U盤品牌,如果換成CH375A芯片則兼容性可提高到85%,當(dāng)然,如果使用WCH公司的子程序庫或者正式版本的C源程序兼容性更好。
#i nclude #i nclude "CH375INC.H" #i nclude #define UINT8 unsigned char #define UINT16 unsigned short #define UINT32 unsigned long #define UINT8X unsigned char xdata #define UINT8VX unsigned char volatile xdata UINT8VX CH375_CMD_PORT _at_ 0xBDF1; /* CH375命令端口的I/O地址 */ UINT8VX CH375_DAT_PORT _at_ 0xBCF0; /* CH375數(shù)據(jù)端口的I/O地址 */ #define CH375_INT_WIRE INT0 /* P3.2, 連接CH375的INT#引腳,用于查詢中 斷狀態(tài) */ UINT8X DISK_BUFFER[512*32] _at_ 0x0000; /* 外部RAM數(shù)據(jù)緩沖區(qū)的起始地址 */ UINT32 DiskStart; /* 邏輯盤的起始絕對(duì)扇區(qū)號(hào)LBA */ UINT8 SecPerClus; /* 邏輯盤的每簇扇區(qū)數(shù) */ UINT8 RsvdSecCnt; /* 邏輯盤的保留扇區(qū)數(shù) */ UINT16 FATSz16; /* FAT16邏輯盤的FAT表占用的扇區(qū)數(shù) */ /* ********** 硬件USB接口層,無論如何這層省不掉,單片機(jī)總要與CH375接口吧 */ void mDelaymS( UINT8 delay ) { UINT8 i, j, c; for ( i = delay; i != 0; i -- ) { for ( j = 200; j != 0; j -- ) c += 3; for ( j = 200; j != 0; j -- ) c += 3; } } void CH375_WR_CMD_PORT( UINT8 cmd ) { /* 向CH375的命令端口寫入命令 */ CH375_CMD_PORT=cmd; for ( cmd = 2; cmd != 0; cmd -- ); /* 發(fā)出命令碼前后應(yīng)該各延時(shí)2uS */ } void CH375_WR_DAT_PORT( UINT8 dat ) { /* 向CH375的數(shù)據(jù)端口寫入數(shù)據(jù) */ CH375_DAT_PORT=dat; /* 因?yàn)镸CS51單片機(jī)較慢所以實(shí)際上無需延時(shí) */ } UINT8 CH375_RD_DAT_PORT( void ) { /* 從CH375的數(shù)據(jù)端口讀出數(shù)據(jù) */ return( CH375_DAT_PORT ); /* 因?yàn)镸CS51單片機(jī)較慢所以實(shí)際上無需延時(shí) */ } UINT8 mWaitInterrupt( void ) { /* 等待CH375中斷并獲取狀態(tài),返回操作狀態(tài) */ while( CH375_INT_WIRE ); /* 查詢等待CH375操作完成中斷(INT#低電平) */ CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 產(chǎn)生操作完成中斷,獲取中斷狀態(tài) */ return( CH375_RD_DAT_PORT( ) ); } /* ********** BulkOnly傳輸協(xié)議層,被CH375內(nèi)置了,無需編寫單片機(jī)程序 */ /* ********** RBC/SCSI命令層,雖然被CH375內(nèi)置了,但是要寫程序發(fā)出命令及收發(fā)數(shù)據(jù) */ UINT8 mInitDisk( void ) { /* 初始化磁盤 */ UINT8 Status; CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 產(chǎn)生操作完成中斷, 獲取中斷狀態(tài) */ Status = CH375_RD_DAT_PORT( ); if ( Status == USB_INT_DISCONNECT ) return( Status ); /* USB設(shè)備斷開 */ CH375_WR_CMD_PORT( CMD_DISK_INIT ); /* 初始化USB存儲(chǔ)器 */ Status = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( Status != USB_INT_SUCCESS ) return( Status ); /* 出現(xiàn)錯(cuò)誤 */ CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 獲取USB存儲(chǔ)器的容量 */ Status = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( Status != USB_INT_SUCCESS ) { /* 出錯(cuò)重試 */ /* 對(duì)于CH375A芯片,建議在此執(zhí)行一次CMD_DISK_R_SENSE命令 */ mDelaymS( 250 ); CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 獲取USB存儲(chǔ)器的容量 */ Status = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ } if ( Status != USB_INT_SUCCESS ) return( Status ); /* 出現(xiàn)錯(cuò)誤 */ return( 0 ); /* U盤已經(jīng)成功初始化 */ } UINT8 mReadSector( UINT32 iLbaStart, UINT8 iSectorCount, UINT8X *oDataBuffer ) { UINT16 mBlockCount; UINT8 c; CH375_WR_CMD_PORT( CMD_DISK_READ ); /* 從USB存儲(chǔ)器讀數(shù)據(jù)塊 */ 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 ); /* 扇區(qū)數(shù) */ for ( mBlockCount = iSectorCount * 8; mBlockCount != 0; mBlockCount -- ) { c = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( c == USB_INT_DISK_READ ) { /* 等待中斷并獲取狀態(tài),請(qǐng)求數(shù)據(jù)讀出 */ CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 從CH375緩沖區(qū)讀取數(shù)據(jù)塊 */ c = CH375_RD_DAT_PORT( ); /* 后續(xù)數(shù)據(jù)的長度 */ while ( c -- ) *oDataBuffer++ = CH375_RD_DAT_PORT( ); CH375_WR_CMD_PORT( CMD_DISK_RD_GO ); /* 繼續(xù)執(zhí)行USB存儲(chǔ)器的讀操作 */ } else break; /* 返回錯(cuò)誤狀態(tài) */ } if ( mBlockCount == 0 ) { c = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( c== USB_INT_SUCCESS ) return( 0 ); /* 操作成功 */ } return( c ); /* 操作失敗 */ } /* ********** FAT文件系統(tǒng)層,這層程序量實(shí)際較大,不過,該程序僅演示極簡單的功能,所 以精簡 */ UINT16 mGetPointWord( UINT8X *iAddr ) { /* 獲取字?jǐn)?shù)據(jù),因?yàn)镸CS51是大端格式 */ return( iAddr[0] | (UINT16)iAddr[1] << 8 ); } UINT8 mIdenDisk( void ) { /* 識(shí)別分析當(dāng)前邏輯盤 */ UINT8 Status; DiskStart = 0; /* 以下是非常簡單的FAT文件系統(tǒng)的分析,正式應(yīng)用絕對(duì)不應(yīng)該如此簡 單 */ Status = mReadSector( 0, 1, DISK_BUFFER ); /* 讀取邏輯盤引導(dǎo)信息 */ if ( Status != 0 ) return( Status ); if ( DISK_BUFFER[0] != 0xEB && DISK_BUFFER[0] != 0xE9 ) { /* 不是邏輯引導(dǎo)扇 區(qū) */ DiskStart = DISK_BUFFER[0x1C6] | (UINT16)DISK_BUFFER[0x1C7] << 8 | (UINT32)DISK_BUFFER[0x1C8] << 16 | (UINT32)DISK_BUFFER[0x1C9] << 24; Status = mReadSector( DiskStart, 1, DISK_BUFFER ); if ( Status != 0 ) return( Status ); } SecPerClus = DISK_BUFFER[0x0D]; /* 每簇扇區(qū)數(shù) */ RsvdSecCnt = DISK_BUFFER[0x0E]; /* 邏輯盤的保留扇區(qū)數(shù) */ FATSz16 = mGetPointWord( &DISK_BUFFER[0x16] ); /* FAT表占用扇區(qū)數(shù) */ return( 0 ); /* 成功 */ } UINT16 mLinkCluster( UINT16 iCluster ) { /* 獲得指定簇號(hào)的鏈接簇 */ /* 輸入: iCluster 當(dāng)前簇號(hào), 返回: 原鏈接簇號(hào), 如果為0則說明錯(cuò)誤 */ UINT8 Status; Status = mReadSector( DiskStart + RsvdSecCnt + iCluster / 256, 1, DISK_BUFFER ); if ( Status != 0 ) return( 0 ); /* 錯(cuò)誤 */ return( mGetPointWord( &DISK_BUFFER[ ( iCluster + iCluster ) & 0x01FF ] ) ); } UINT32 mClusterToLba( UINT16 iCluster ) { /* 將簇號(hào)轉(zhuǎn)換為絕對(duì)LBA扇區(qū)地址 */ return( DiskStart + RsvdSecCnt + FATSz16 * 2 + 32 + ( iCluster - 2 ) * SecPerClus ); } void mInitSTDIO( void ) { /* 僅用于調(diào)試用途及顯示內(nèi)容到PC機(jī),與該程序功能完全無 關(guān) */ SCON = 0x50; PCON = 0x80; TMOD = 0x20; TH1 = 0xf3; TR1=1; TI=1; /* 24MHz, 9600bps */ } void mStopIfError( UINT8 iErrCode ) { /* 如果錯(cuò)誤則停止運(yùn)行并顯示錯(cuò)誤狀態(tài) */ if ( iErrCode == 0 ) return; printf( "Error status, %02Xn", (UINT16)iErrCode ); } main( ) { UINT8 Status; UINT8X *CurrentDir; UINT16 Cluster; mDelaymS( 200 ); /* 延時(shí)200毫秒 */ mInitSTDIO( ); CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); /* 初始化CH375,設(shè)置USB工作模式 */ CH375_WR_DAT_PORT( 6 ); /* 模式代碼,自動(dòng)檢測(cè)USB設(shè)備連接 */ while ( 1 ) { printf( "Insert USB diskn" ); while ( mWaitInterrupt( ) != USB_INT_CONNECT ); /* 等待U盤連接 */ mDelaymS( 250 ); /* 延時(shí)等待U盤進(jìn)入正常工作狀態(tài) */ Status = mInitDisk( ); /* 初始化U盤,實(shí)際是識(shí)別U盤的類型,必須進(jìn)行此步驟 */ mStopIfError( Status ); Status = mIdenDisk( ); /* 識(shí)別分析U盤文件系統(tǒng),必要操作 */ mStopIfError( Status ); Status = mReadSector( DiskStart + RsvdSecCnt + FATSz16 * 2, 32, DISK_BUFFER ); mStopIfError( Status ); /* 讀取FAT16邏輯盤的根目錄,通常根目錄占用32個(gè)扇區(qū) */ for ( CurrentDir = DISK_BUFFER; CurrentDir[0] != 0; CurrentDir += 32 ) { if ( ( CurrentDir[0x0B] & 0x08 ) == 0 && CurrentDir[0] != 0xE5 ) { CurrentDir[0x0B] = 0; /* 為了便于顯示,設(shè)置文件名或者目錄名的結(jié)束標(biāo)志 */ printf( "Name: %sn", CurrentDir ); /* 通過串口輸出顯示 */ } } /* 以上顯示根目錄下的所有文件名,以下打開第一個(gè)文件,如果是C文件的話 */ if ( (DISK_BUFFER[0x0B]&0x08)==0 && DISK_BUFFER[0]!=0xE5 && DISK_BUFFER[8] =='C' ) { Cluster = mGetPointWord( &DISK_BUFFER[0x1A] ); /* 文件的首簇 */ while ( Cluster < 0xFFF8 ) { /* 文件簇未結(jié)束 */ if ( Cluster == 0 ) mStopIfError( 0x8F ); /* 對(duì)于首簇,可能是0長度文件 */ Status = mReadSector( mClusterToLba( Cluster ), SecPerClus, DISK_BUFFER ); mStopIfError( Status ); /* 讀取首簇到緩沖區(qū) */ DISK_BUFFER[30] = 0; printf( "Data: %sn", DISK_BUFFER ); /* 顯示首行 */ Cluster = mLinkCluster( Cluster ); /* 獲取鏈接簇,返回0說明錯(cuò)誤 */ } } while ( mWaitInterrupt( ) != USB_INT_DISCONNECT ); /* 等待U盤拔出 */ mDelaymS( 250 ); } }
上一篇:51單片機(jī)數(shù)據(jù)存儲(chǔ)類型
下一篇:紅外避障電動(dòng)小車C51程序
推薦閱讀
史海拾趣
三環(huán)(CCTC)公司自1970年成立以來,便致力于電子基礎(chǔ)材料、電子元件和通信器件的研發(fā)與生產(chǎn)。在創(chuàng)立初期,公司面臨著技術(shù)落后和資金短缺的困境,但通過不懈的努力和持續(xù)的研發(fā)投入,逐漸在電子行業(yè)中嶄露頭角。公司積極引進(jìn)國外先進(jìn)技術(shù)和設(shè)備,同時(shí)培養(yǎng)了一支高素質(zhì)的研發(fā)團(tuán)隊(duì),為后續(xù)的發(fā)展奠定了堅(jiān)實(shí)的基礎(chǔ)。
面對(duì)數(shù)字化浪潮的沖擊,ECLIPTEK公司積極擁抱數(shù)字化轉(zhuǎn)型和智能制造。公司引入大數(shù)據(jù)、云計(jì)算和人工智能等先進(jìn)技術(shù),推動(dòng)生產(chǎn)過程的智能化和自動(dòng)化。通過數(shù)字化轉(zhuǎn)型和智能制造,ECLIPTEK不僅提高了生產(chǎn)效率和質(zhì)量,還降低了生產(chǎn)成本和能源消耗。這一轉(zhuǎn)型為公司未來的發(fā)展奠定了堅(jiān)實(shí)的基礎(chǔ)。
芯佰微非常重視技術(shù)研發(fā)和專利積累。公司擁有一支高素質(zhì)的研發(fā)團(tuán)隊(duì),不斷投入資源進(jìn)行新技術(shù)和新產(chǎn)品的研發(fā)。同時(shí),芯佰微也積極申請(qǐng)各類專利,保護(hù)自己的技術(shù)成果。經(jīng)過多年的積累,芯佰微已經(jīng)成功申請(qǐng)并獲得了數(shù)十項(xiàng)專利,這些專利不僅提升了公司的技術(shù)實(shí)力,也為公司的未來發(fā)展提供了有力保障。
在電子行業(yè)中,產(chǎn)品質(zhì)量和客戶服務(wù)是企業(yè)生存和發(fā)展的關(guān)鍵。CCS公司始終堅(jiān)持質(zhì)量第一的原則,建立了嚴(yán)格的質(zhì)量管理體系和客戶服務(wù)體系。公司從原材料采購到產(chǎn)品生產(chǎn)、銷售等各個(gè)環(huán)節(jié)都進(jìn)行嚴(yán)格的質(zhì)量控制,確保產(chǎn)品的質(zhì)量和性能達(dá)到客戶的期望。同時(shí),CCS公司還提供了全方位的客戶服務(wù),包括售前咨詢、售后服務(wù)和技術(shù)支持等,為客戶提供了全方位的支持和幫助。
Cypress在半導(dǎo)體制造領(lǐng)域一直處于技術(shù)革新的前沿。公司不斷引入新的工藝技術(shù),從早期的0.8微米CMOS技術(shù)到后來的0.21微米工藝,不斷推動(dòng)產(chǎn)品性能的提升。這種對(duì)技術(shù)的持續(xù)投入和追求,使Cypress在行業(yè)內(nèi)樹立了良好的技術(shù)形象,并贏得了客戶的廣泛認(rèn)可。
國外手機(jī)資費(fèi)標(biāo)準(zhǔn)一覽 近年來,我國移動(dòng)電話資費(fèi)問題一直是人們關(guān)注的焦點(diǎn)。國外的移動(dòng)電話資費(fèi)處于何種狀況呢? 英國:單向收費(fèi)標(biāo)準(zhǔn)細(xì)分 目前,英國實(shí)行的是單向收費(fèi)。英國移動(dòng)電話市場(chǎng)主要由4家運(yùn)營商占領(lǐng),收費(fèi)形式均采取一年為期的合同制,按月交費(fèi),交費(fèi)標(biāo)準(zhǔn)有多個(gè) ...… 查看全部問答∨ |
|
請(qǐng)問MSFLASH刪除文件后還能檢索到文件內(nèi)容么? 昨天實(shí)驗(yàn)了下使用createfile DSK1:,然后調(diào)用IOCONTOL的方法,能夠讀取簇內(nèi)容。 分別在存儲(chǔ)卡和RAM上建了個(gè)文件,都能檢索到內(nèi)容,然后刪除這個(gè)文件,在RAM上就檢索不到了,而在存儲(chǔ)卡會(huì)上還能檢索到。 請(qǐng)問誰知道這是怎么回事。 在網(wǎng)上搜索了下 ...… 查看全部問答∨ |
|
同一個(gè)程序如果都放在一個(gè) .c里會(huì)占用很大內(nèi)存;如果模塊化 它所占內(nèi)存會(huì)減小 ,這是神馬原因呢 ?另外,誰有更好的減少程序占用內(nèi)存空間的辦法 謝謝… 查看全部問答∨ |
菜鳥求助,在STM32上調(diào)試卡住,大家?guī)兔纯?/a> 使用的是RTT1.0,MDK4.2,芯片是STM32F103RBT6程序跑到rt_system_heap_init((void*)&Image$$RW_IRAM1$$ZI$$Limit, (void*)STM32_SRAM_END);這個(gè)函數(shù)之后就卡住了。跑飛了,請(qǐng)問怎么解決。… 查看全部問答∨ |
上次在IIC上與富士通的半導(dǎo)體工程師聊,他給我推薦了一款適合小家電應(yīng)用的他們最新8位雙通道FLASH MCU。性能非常不錯(cuò),工作電流僅為110微安/ MHz,待機(jī)電流5 µA,關(guān)鍵是價(jià)格還是挺有競(jìng)爭(zhēng)力。當(dāng)時(shí)他提到了采用新工藝實(shí)現(xiàn)雙通道Flash功能,搞忘 ...… 查看全部問答∨ |
#include<reg52.h> #include<intrins.h> #define uint unsigned int #define uchar unsigned char #define TX_ADR_WIDTH 5 // 5 uints TX address width #define RX_ADR_WIDTH& ...… 查看全部問答∨ |
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 人形機(jī)器人馬拉松背后的思考,兆易創(chuàng)新如何賦能機(jī)器人產(chǎn)業(yè)
- 一種基于STM32的智能柜控制器設(shè)計(jì)
- 小型傾轉(zhuǎn)旋翼機(jī)的無刷直流電機(jī)驅(qū)動(dòng)器設(shè)計(jì)
- 超高速攝影機(jī)電控系統(tǒng)設(shè)計(jì)
- 基于GPS自動(dòng)授時(shí)的無線智能控制器的設(shè)計(jì)
- 基于PTR2000的無線氣象信息采集系統(tǒng)設(shè)計(jì)
- Microchip推出MEC175xB系列器件,為嵌入式控制器引入硬件 抗量子攻擊能力
- 無人飛行器機(jī)載穩(wěn)定云臺(tái)控制系統(tǒng)的設(shè)計(jì)
- 匠芯創(chuàng)推出面向具身智能高性能實(shí)時(shí)處理器M7000
- 充電樁行業(yè)太卷,該涉足嗎?
- 挑戰(zhàn)極限壓強(qiáng):吉利神盾金磚電池的結(jié)構(gòu)工程設(shè)計(jì)
- 保隆科技TPMS爆胎監(jiān)測(cè)技術(shù),為高速爆胎穩(wěn)定控制打造安全屏障
- 人形機(jī)器人產(chǎn)業(yè)標(biāo)準(zhǔn)互認(rèn)計(jì)劃啟動(dòng),機(jī)器人板塊震蕩攀升
- 全球首發(fā)!T246低溫高倍率型正極材料問世,重卡/儲(chǔ)能應(yīng)用迎革命性突破
- 100億元!非洲最大動(dòng)力電池基地正式啟動(dòng)建設(shè)
- 4D毫米波雷達(dá)能取代激光雷達(dá)嗎?
- LG Innotek首發(fā)車載5G衛(wèi)星通信模塊,傳輸速率數(shù)十Mbps
- 吉利吉曜通行發(fā)布超級(jí)混動(dòng)電芯,11.5分鐘末端快充革命
- 創(chuàng)晟半導(dǎo)體完成近億元融資:車規(guī)通信芯片技術(shù)突破
- 【EEWORLD第三十四屆】2012年01月社區(qū)明星人物揭曉!
- Vicor可最大限度提高AI、HPC和數(shù)據(jù)計(jì)算性能的電源解決方案
- TI嵌入式直播月:深入探究嵌入式產(chǎn)品在工業(yè)和汽車中的新應(yīng)用
- 有獎(jiǎng)直播|無線技術(shù)改變智能生活
- 恩智浦跨界處理器能玩出多少應(yīng)用
- 有獎(jiǎng)直播|基于Source-down技術(shù)的全新英飛凌MOSFET,有效提升功率密度,肉眼可見
- 領(lǐng)取評(píng)測(cè)任務(wù),免費(fèi)體驗(yàn)NUCLEO-L452RE開發(fā)套件
- 下載Intel白皮書們,贏禮品獲新知
- 彰顯女性風(fēng)采,田吉平女士當(dāng)選2019中國品牌女性人物
- 騰訊“超級(jí)大腦”將會(huì)如何影響中國經(jīng)濟(jì)走向
- STM32F105標(biāo)準(zhǔn)庫讀寫USB寫入csv文件
- STM32 NVIC中斷優(yōu)先級(jí)分組說明
- Maxim DS2477安全I(xiàn)2C協(xié)處理器在貿(mào)澤開售
- 配送機(jī)器人逐漸成為各大平臺(tái)和企業(yè)爭(zhēng)相角逐的新方向
- 機(jī)器人雖然會(huì)寫書法 但無法把人的情感融入書法中去
- iRobot成功研發(fā)一款機(jī)器人割草機(jī) 計(jì)劃于2020年在美國上市銷售
- 成都出入境服務(wù)首次引入智能機(jī)器人 推動(dòng)智能化辦事水平
- 在政策的推動(dòng)下 資本市場(chǎng)和科技巨頭紛紛角逐服務(wù)機(jī)器人