娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年05月28日(星期三)

2021年05月28日 | 51+ch375讀寫U盤超精簡源程序

發(fā)布者:innovator8 來源: eefocus關(guān)鍵字:ch375  讀寫U盤 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

/* 這個(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   /* 以下定義適用于MCS-51單片機(jī),其它單片機(jī)參照修改 */

#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 );

  }

}


關(guān)鍵字:ch375  讀寫U盤 引用地址:51+ch375讀寫U盤超精簡源程序

上一篇:51單片機(jī)數(shù)據(jù)存儲(chǔ)類型
下一篇:紅外避障電動(dòng)小車C51程序

推薦閱讀

自去年蘋果新機(jī)全系搭載無線充電功能后,產(chǎn)業(yè)鏈廠商紛紛開始跟進(jìn)無線充電技術(shù),國產(chǎn)手機(jī)品牌廠商也在積極預(yù)研導(dǎo)入無線充電功能,整個(gè)市場(chǎng)迎來了里程碑式的突破。截止目前,華為、小米均發(fā)布了各自旗下首款無線充電手機(jī)華為Mate RS、小米MIX 2S;魅族發(fā)布了魅族POP真無線耳機(jī)和魅族無線充電器;錘子日前發(fā)布的新機(jī)堅(jiān)果R1也加入了無線充電功能。雖然無線充...
5月28日,鴻海旗下的夏普表示,在面對(duì)美國政府繼續(xù)向中國大陸加征關(guān)稅的情形下,該公司正打算將筆記本電腦的生產(chǎn)據(jù)點(diǎn),由目前的中國大陸工廠轉(zhuǎn)移到生產(chǎn)成本更為低廉的東南亞國家。 目前夏普旗下的筆記本電腦子公司Dynabook,其產(chǎn)品由杭州的自家工廠負(fù)責(zé)生產(chǎn)。若美國正式對(duì)消費(fèi)類電子在內(nèi)的3000億美元中國產(chǎn)品加征關(guān)稅,夏普考慮將筆記本電腦的生...
據(jù)財(cái)聯(lián)社報(bào)道,5月27日,杭氧股份召開年度股東大會(huì),會(huì)議上,杭氧股份董事長蔣明表示,杭氧股份首個(gè)半導(dǎo)體供氣項(xiàng)目受疫情影響進(jìn)度有所滯后,計(jì)劃將于今年內(nèi)投產(chǎn)。2019年7月28日,杭氧股份公告表示,公司與芯恩(青島)集成電路有限公司(以下簡稱“青島芯恩”)簽署了《工業(yè)氣體供應(yīng)合同》,合同約定青島芯恩與公司合作,公司作為20,000m3/h 純氮空分裝置投資...
1> 為什么要加密,如何加密?當(dāng)您的產(chǎn)品推向市場(chǎng)的時(shí)候,您的競(jìng)爭(zhēng)對(duì)手就開始盯上它了,如果您的產(chǎn)品硬件很容易被模仿,而且您使用的MSP430單片機(jī)沒有被加密的話,那么您辛辛苦苦的勞動(dòng)成功就很容易成為您競(jìng)爭(zhēng)對(duì)手的產(chǎn)品了,使用JTAG調(diào)試工具FET雖然可以將程序下載到芯片內(nèi)部,但只有使用專業(yè)編程器能夠防止程序被竊取。2> JTAG、BSL、BOOTLOADER、熔絲的...

史海拾趣

問答坊 | AI 解惑

國外手機(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è) ...…

查看全部問答∨

單片機(jī)數(shù)字電壓表設(shè)計(jì)論壇

單片機(jī)數(shù)字電壓表設(shè)計(jì)論壇…

查看全部問答∨

藍(lán)牙資料

下載不夠分,再傳一份…

查看全部問答∨

請(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)上搜索了下 ...…

查看全部問答∨

我想買一塊FPGA開發(fā)板,有什么要注意的沒

在淘寶上看到好多,價(jià)格相差也很多啊,一百多到幾千塊錢都有,買什么樣的合適?…

查看全部問答∨

如減少程序所占用的內(nèi)存空間

 同一個(gè)程序如果都放在一個(gè) .c里會(huì)占用很大內(nèi)存;如果模塊化 它所占內(nèi)存會(huì)減小 ,這是神馬原因呢 ?另外,誰有更好的減少程序占用內(nèi)存空間的辦法  謝謝…

查看全部問答∨

雙通道MCU意義何在?

上次在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功能,搞忘 ...…

查看全部問答∨

關(guān)于單片機(jī)程序的執(zhí)行

#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ī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 淅川县| 东阿县| 张家川| 巴中市| 当阳市| 安岳县| 桃江县| 濮阳县| 高台县| 兰州市| 通州区| 长海县| 邛崃市| 乐安县| 济源市| 巴东县| 龙门县| 庐江县| 长乐市| 彭泽县| 沁源县| 澜沧| 阿合奇县| 镇巴县| 陕西省| 临武县| 依安县| 石楼县| 外汇| 苗栗市| 保康县| 静海县| 湟源县| 新源县| 铜梁县| 磴口县| 轮台县| 灵宝市| 西平县| 四子王旗| 南开区|