日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

单片机读tf卡c语言程序,单片机读写U盘闪盘超精简C源程序

發布時間:2025/3/12 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单片机读tf卡c语言程序,单片机读写U盘闪盘超精简C源程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

#i nclude "CH375INC.H"

#i nclude

/* 以下定義適用于MCS-51單片機,其它單片機參照修改 */

#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數據端口的I/O地址 */

#define????CH375_INT_WIRE????INT0?????? /* P3.2, 連接CH375的INT#引腳,用于查詢中斷狀態 */

UINT8X???? DISK_BUFFER[512*32] _at_ 0x0000;??/* 外部RAM數據緩沖區的起始地址 */

UINT32??DiskStart;????/* 邏輯盤的起始絕對扇區號LBA */

UINT8?? SecPerClus;?? /*

邏輯盤的每簇扇區數 */

UINT8?? RsvdSecCnt;?? /* 邏輯盤的保留扇區數 */

UINT16??FATSz16;??????/* FAT16邏輯盤的FAT表占用的扇區數 */

/* **********

硬件USB接口層,無論如何這層省不掉,單片機總要與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 -- );??/*

發出命令碼前后應該各延時2uS */

}

void CH375_WR_DAT_PORT( UINT8 dat ) {??/*

向CH375的數據端口寫入數據 */

CH375_DAT_PORT=dat;??????????/* 因為MCS51單片機較慢所以實際上無需延時

*/

}

UINT8 CH375_RD_DAT_PORT( void ) {????/* 從CH375的數據端口讀出數據 */

return( CH375_DAT_PORT );??????/* 因為MCS51單片機較慢所以實際上無需延時 */

}

UINT8

mWaitInterrupt( 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內置了,但是要寫程序發出命令及收發數據??*/

UINT8??mInitDisk(

void ) {??/* 初始化磁盤 */

UINT8 Status;

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盤已經成功初始化 */

}

UINT8??mReadSector( UINT32 iLbaStart, UINT8 iSectorCount, UINT8X

*oDataBuffer ) {

UINT16??mBlockCount;

UINT8??c;

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存儲器的讀操作 */

}

else break;??/* 返回錯誤狀態 */

}

if ( mBlockCount == 0 ) {

c = mWaitInterrupt( );??/* 等待中斷并獲取狀態 */

if ( c== USB_INT_SUCCESS

) return( 0 );??/* 操作成功 */

}

return( c );??/* 操作失敗 */

}

/* ********** FAT文件系統層,這層程序量實際較大,不過,該程序僅演示極簡單的功能,所以精簡 */

UINT16??mGetPointWord( UINT8X *iAddr ) {??/* 獲取字數據,因為MCS51是大端格式 */

return( iAddr[0] | (UINT16)iAddr[1] << 8 );

}

UINT8??mIdenDisk( void ) {????/* 識別分析當前邏輯盤 */

UINT8??Status;

DiskStart = 0;??/* 以下是非常簡單的FAT文件系統的分析,正式應用絕對不應該如此簡單 */

Status =

mReadSector( 0, 1, DISK_BUFFER );??/* 讀取邏輯盤引導信息 */

if ( Status != 0 )

return( Status );

if ( DISK_BUFFER[0] != 0xEB && DISK_BUFFER[0] !=

0xE9 ) {??/* 不是邏輯引導扇區 */

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];??/* 每簇扇區數 */

RsvdSecCnt = DISK_BUFFER[0x0E];??/* 邏輯盤的保留扇區數 */

FATSz16 =

mGetPointWord( &DISK_BUFFER[0x16] );??/* FAT表占用扇區數 */

return( 0 );??/*

成功 */

}

UINT16??mLinkCluster( UINT16 iCluster ) {??/* 獲得指定簇號的鏈接簇 */

/* 輸入: iCluster 當前簇號, 返回: 原鏈接簇號, 如果為0則說明錯誤 */

UINT8??Status;

Status = mReadSector( DiskStart + RsvdSecCnt + iCluster / 256, 1,

DISK_BUFFER );

if ( Status != 0 ) return( 0 );??/* 錯誤 */

return(

mGetPointWord( &DISK_BUFFER[ ( iCluster + iCluster ) & 0x01FF ] ) );

}

UINT32??mClusterToLba( UINT16 iCluster ) {??/* 將簇號轉換為絕對LBA扇區地址 */

return( DiskStart + RsvdSecCnt + FATSz16 * 2 + 32 + ( iCluster - 2 ) *

SecPerClus );

}

void??mInitSTDIO( void ) {??/*

僅用于調試用途及顯示內容到PC機,與該程序功能完全無關 */

SCON = 0x50; PCON = 0x80; TMOD = 0x20; TH1

= 0xf3; TR1=1; TI=1;??/* 24MHz, 9600bps */

}

void??mStopIfError( UINT8

iErrCode ) {??/* 如果錯誤則停止運行并顯示錯誤狀態 */

if ( iErrCode == 0 ) return;

printf( "Error status, %02X\n", (UINT16)iErrCode );

}

main( )

{

UINT8??Status;

UINT8X??*CurrentDir;

UINT16??Cluster;

mDelaymS( 200 );??/* 延時200毫秒 */

mInitSTDIO( );

CH375_WR_CMD_PORT( CMD_SET_USB_MODE );??/* 初始化CH375,設置USB工作模式 */

CH375_WR_DAT_PORT( 6 );??/* 模式代碼,自動檢測USB設備連接 */

while ( 1 ) {

printf( "Insert USB disk\n" );

while ( mWaitInterrupt( ) !=

USB_INT_CONNECT );??/* 等待U盤連接 */

mDelaymS( 250 );??/* 延時等待U盤進入正常工作狀態 */

Status = mInitDisk( );??/* 初始化U盤,實際是識別U盤的類型,必須進行此步驟 */

mStopIfError( Status );

Status = mIdenDisk( );??/*

識別分析U盤文件系統,必要操作 */

mStopIfError( Status );

Status = mReadSector(

DiskStart + RsvdSecCnt + FATSz16 * 2, 32, DISK_BUFFER );

mStopIfError(

Status );??/* 讀取FAT16邏輯盤的根目錄,通常根目錄占用32個扇區 */

for ( CurrentDir =

DISK_BUFFER; CurrentDir[0] != 0; CurrentDir += 32 ) {

if ( (

CurrentDir[0x0B] & 0x08 ) == 0 && CurrentDir[0] != 0xE5 ) {

CurrentDir[0x0B] = 0;??/* 為了便于顯示,設置文件名或者目錄名的結束標志 */

printf( "Name: %s\n", CurrentDir );??/* 通過串口輸出顯示 */

}

}??/* 以上顯示根目錄下的所有文件名,以下打開第一個文件,如果是C文件的話 */

if (

(DISK_BUFFER[0x0B]&0x08)==0 && DISK_BUFFER[0]!=0xE5 &&

DISK_BUFFER[8]==""C"" ) {

Cluster = mGetPointWord(

&DISK_BUFFER[0x1A] );??/* 文件的首簇 */

while ( Cluster < 0xFFF8 )

{??/* 文件簇未結束 */

if ( Cluster == 0 ) mStopIfError( 0x8F );??/*

對于首簇,可能是0長度文件 */

Status = mReadSector( mClusterToLba( Cluster ),

SecPerClus, DISK_BUFFER );

mStopIfError( Status );??/* 讀取首簇到緩沖區 */

DISK_BUFFER[30] = 0; printf( "Data: %s\n", DISK_BUFFER );??/* 顯示首行

*/

Cluster = mLinkCluster( Cluster );??/* 獲取鏈接簇,返回0說明錯誤 */

}

}

while ( mWaitInterrupt( ) != USB_INT_DISCONNECT

);??/* 等待U盤拔出 */

mDelaymS( 250 );

}

}

總結

以上是生活随笔為你收集整理的单片机读tf卡c语言程序,单片机读写U盘闪盘超精简C源程序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 精品国产亚洲AV | 999国产| 99久久精品免费 | 欧美精品一区二区三区久久久 | 国产精品乱子伦 | av在线播放一区 | 91网在线 | 国产无玛 | 美女一级黄色片 | 1024av在线 | 午夜生活片 | 久久久黄色片 | 日日操夜夜草 | 一色屋免费视频 | 亚洲一区二区三区视频 | 特黄aaaaaaaaa毛片免 | 色哟哟在线观看视频 | 日韩一区二区在线观看 | 亚洲视频天天射 | 日本成人免费 | 99re久久精品国产 | 国产一区二区视频在线免费观看 | 不卡日本| 91插插插永久免费 | 自拍偷拍亚洲图片 | 欧美专区在线播放 | 欧美精品色视频 | 欧美另类人妖 | 在线看黄色的网站 | 色狠狠av老熟女 | 高潮喷水一区二区三区 | 国产一区视频观看 | 国产亚洲精品精品国产亚洲综合 | 欧美精品 在线观看 | 爆乳熟妇一区二区三区霸乳 | 色悠悠网址| 色网站在线看 | 亚洲不卡在线 | 一区二区三区四区国产精品 | 尤物精品视频 | 免费在线激情视频 | 免费在线观看黄色 | 少妇xxxx69| 国产精品色在线 | 日本三级一区二区三区 | proumb性欧美在线观看 | 秋葵视频污 | 精品国产黄色片 | 国产精品福利一区二区 | 五月天堂网 | 久久sp | 91丨九色丨蝌蚪丨老版 | 亚洲福利国产 | 亚洲产国偷v产偷v自拍涩爱 | 久久婷婷激情 | 日本嫩草影院 | 99在线视频播放 | 亚洲午夜精品久久久久久浪潮 | 午夜av福利 | www.国产com| 亚洲天堂偷拍 | 国模人体一区二区 | av一卡 | 国产久草av| 精品免费视频 | 国产精品第7页 | 日韩电影一区二区三区四区 | 三级av网 | 免费av不卡在线观看 | 日日噜噜噜 | 久久久久久久99 | 日本二三区 | 日本三级视频网站 | 99精品在线免费观看 | 日韩精品xxx| 久久综合久 | 五月婷婷综合网 | 制服av在线 | 两个女人互添下身爱爱 | 本站只有精品 | 精品三区视频 | 色葡萄影院 | 综合色站导航 | 人成在线 | 欧美偷拍少妇精品一区 | 中文字幕在线2019 | 欧美精品一区二区视频 | 色开心| h视频在线免费观看 | 日本精品免费视频 | 亚洲m码 欧洲s码sss222 | 免费看a级黄色片 | 少妇又紧又色又爽又刺激 | www.色99| 亚洲一区不卡 | 日本免费观看视频 | 中国a一片一级一片 | 成人区人妻精品一熟女 | 海角社区在线视频播放观看 |