|
運(yùn)行環(huán)境:STC51 1T單片機(jī) 22.1184M晶振 (建議使用STC12C5A60S2 或 STC89C58)
代碼介紹:
一:此程序首先將CH375程序庫及CH375芯片進(jìn)行初始化,隨后開始檢測U盤是否已經(jīng)插入,U盤插入后,讀取U盤的物理總?cè)萘浚瑔挝粸樯葏^(qū),即一共有多少個(gè)扇區(qū)。然后獲取U盤的格式化容量、剩余容量及文件系統(tǒng)類型。
二:此程序進(jìn)行一些初始化的操作及基本參數(shù)的獲取。后面在根目錄下創(chuàng)建一個(gè)TEST.TXT文件,創(chuàng)建成功后,獲取此文件的相關(guān)信息并輸出。
三:此程序進(jìn)行一些初始化的操作及基本參數(shù)的獲取。后面對根目錄下的所有文件進(jìn)行列舉。然后更改test.txt的一些信息,如創(chuàng)建時(shí)間,文件屬性等。
四:此程序進(jìn)行一些初始化的操作及基本參數(shù)的獲取。后面先定位文件的偏移量,然后讀取根目錄下的test.txt的從偏移量開始的40個(gè)字節(jié)(如果實(shí)際長度小于40,就讀取實(shí)際長度),最后向文件中寫入數(shù)據(jù)。
五:CH375對U盤的扇區(qū)級文件操作。
電路原理圖如下:
單片機(jī)源程序如下:
- #include "ch375.h"
- #include "myfun.h"
- /***********************************************************
- +-----------------------------------------------+
- | 振南電子 高級外設(shè)程序模塊 CH375 部分 [IO方式] |
- | 【此程序與視頻教程中有出入,主要是為了程序兼容|
- | 性與穩(wěn)定性,有些代碼借鑒沁恒官方源碼】 |
- +-----------------------------------------------+
- 此源碼版權(quán)屬 振南 全權(quán)享有,如欲引用,敬請署名并告知
- 嚴(yán)禁隨意用于商業(yè)目的
- 振南電子
- WW:yzn07
- 注:本程序?yàn)镮O方式,即使用單片機(jī)的IO模擬時(shí)序來驅(qū)動(dòng)CH375
- IO方式便于移植。其實(shí)IO在模擬外部總線的時(shí)序,對于沒有
- 外部總線的單片機(jī),可以參考此程序。模擬時(shí)序,在速度上
- 不及硬件的外部總線。在操作U盤的時(shí)候,對操作速度有一定
- 要求。
- 這是振南在長期對CH375的研究中,得到的經(jīng)驗(yàn),請借鑒!!
- ***********************************************************/
- /******************************************************************
- - 功能描述:向CH375寫入命令
- - 隸屬模塊:CH375模塊
- - 函數(shù)屬性:內(nèi)部
- - 參數(shù)說明:cmd:要寫入的命令碼
- - 返回說明:無返回
- ******************************************************************/
- void CH375_Write_Cmd(unsigned char cmd) //寫命令
- {
- delay(DELAYTIME); //稍作延時(shí)
- CH375_CS=0; //打開片選
- CH375_A0=1; //命令模式
- DATA_PORT=cmd; //輸出命令碼
- CH375_WR=0; //打開寫使能
- delay(DELAYTIME); //稍作延時(shí)
- CH375_WR=1; //關(guān)閉寫使能
- CH375_CS=1; //關(guān)閉片選
- CH375_A0=1; //恢復(fù)A0為高電平
- delay(DELAYTIME); //稍作延時(shí)
- }
- /******************************************************************
- - 功能描述:向CH375寫入數(shù)據(jù)
- - 隸屬模塊:CH375模塊
- - 函數(shù)屬性:內(nèi)部
- - 參數(shù)說明:dat:是要寫入到CH375中的一個(gè)字節(jié)的數(shù)據(jù)
- - 返回說明:無返回
- ******************************************************************/
- void CH375_Write_Dat(unsigned char dat) //寫數(shù)據(jù)
- {
- delay(DELAYTIME); //稍作延時(shí)
- CH375_CS=0; //打開片選
- CH375_A0=0; //數(shù)據(jù)模式
- DATA_PORT=dat; //輸出數(shù)據(jù)
- CH375_WR=0; //打開寫使能
- delay(DELAYTIME); //稍作延時(shí)
- CH375_WR=1; //關(guān)閉寫使能
- CH375_CS=1; //關(guān)閉片選
- CH375_A0=1; //恢復(fù)A0為高電平
- delay(DELAYTIME); //稍作延時(shí)
- }
- /******************************************************************
- - 功能描述:從CH375讀取一個(gè)字節(jié)
- - 隸屬模塊:CH375模塊
- - 函數(shù)屬性:內(nèi)部
- - 參數(shù)說明:無
- - 返回說明:讀到的字節(jié)
- ******************************************************************/
- unsigned char CH375_Read_Dat() //讀數(shù)據(jù)
- {
- unsigned char temp;
- CH375_CS=0; //打開片選
- CH375_A0=0; //數(shù)據(jù)模式
- CH375_RD=0; //打開讀使能
- DATA_PORT=0xff; //51單片機(jī)IO作輸入,先置高
- delay(DELAYTIME); //稍作延時(shí)
- temp=DATA_PORT; //讀取端口上的數(shù)據(jù)
- CH375_RD=1; //關(guān)閉讀使能
- CH375_CS=1; //關(guān)閉片選
- CH375_A0=1; //恢復(fù)A0為高電平
- return temp; //返回讀到的值
- }
- /******************************************************************
- - 功能描述:等待CH375的中斷,并獲取中斷狀態(tài)
- - 隸屬模塊:CH375模塊
- - 函數(shù)屬性:內(nèi)部
- - 參數(shù)說明:無
- - 返回說明:中斷狀態(tài)碼 返回0說明操作成功
- ******************************************************************/
- unsigned char CH375_Wait_Int() //等待中斷信號,即INT引腳上產(chǎn)生低電平,并獲取中斷狀態(tài)碼,獲取后INT恢復(fù)高電平,以產(chǎn)生下一次中斷信號
- {
- CH375_INT=1; //IO作輸入先置高
- while(CH375_INT); //等待中斷
- CH375_Write_Cmd(CMD_GET_STATUS); //產(chǎn)生操作完成中斷,獲取中斷狀態(tài)
- return CH375_Read_Dat();
- }
- /******************************************************************
- - 功能描述:初始化CH375芯片
- - 隸屬模塊:CH375模塊
- - 函數(shù)屬性:外部,供用戶調(diào)用
- - 參數(shù)說明:無
- - 返回說明:執(zhí)行結(jié)果
- ******************************************************************/
- unsigned char CH375_Init()
- {
- unsigned char i=0;
- CH375_Write_Cmd(CMD_GET_IC_VER); /* 獲取芯片及固件版本 */
- i=CH375_Read_Dat(); /* 版本 */
- if(i<0xA2) return 1; /* 不支持該芯片 */
- CH375_Write_Cmd(CMD_SET_USB_MODE); /* 設(shè)置USB工作模式 */
- CH375_Write_Dat(6); /* 模式代碼,自動(dòng)檢測USB設(shè)備連接 */
- for(i=0;i<250;i++)
- { /* 等待操作成功,通常需要等待10uS-20uS */
- delay(10);
- if(CH375_Read_Dat()==CMD_RET_SUCCESS )
- return 0; /* 操作成功 */
- }
- return 1; /* CH375出錯(cuò),例如芯片型號錯(cuò)或者處于串口方式或者不支持 */
- }
- /******************************************************************
- - 功能描述:初始化磁盤
- - 隸屬模塊:CH375模塊
- - 函數(shù)屬性:外部,供用戶調(diào)用
- - 參數(shù)說明:無
- - 返回說明:操作結(jié)果,0表示初始化磁盤成功
- 1表示初始化磁盤失敗
- - 注:在使用U盤之前,先要調(diào)用此函數(shù),此函數(shù)將進(jìn)行判斷
- 磁盤是否連接,初始化是否成功等操作
- ******************************************************************/
- unsigned char CH375_InitDisk()
- {
- unsigned char status,i,j=0;
- status=CH375_Wait_Int();
- if(status==USB_INT_DISCONNECT) return 1; /* USB設(shè)備斷開 */
- while(1)
- {
- CH375_Write_Cmd(CMD_DISK_INIT); /* 初始化USB存儲器 */
- status=CH375_Wait_Int(); /* 等待中斷并獲取狀態(tài) */
- if(status==USB_INT_SUCCESS)
- break;
- }
- while(1) //以下代碼均源自沁恒的官方U盤初始化函數(shù),借用它可以提高對U盤的兼容性!
- {
- j++;
- CH375_Write_Cmd(CMD_DISK_SIZE); /* 獲取USB存儲器的容量 */
- status=CH375_Wait_Int(); /* 等待中斷并獲取狀態(tài) */
- if(status==USB_INT_SUCCESS)
- break;
- else
- {
- delay(1000);
- CH375_Write_Cmd(CMD_DISK_R_SENSE); /* 獲取USB存儲器的容量 */
- status=CH375_Wait_Int(); /* 等待中斷并獲取狀態(tài) */
- if(status==USB_INT_SUCCESS) /* 出現(xiàn)錯(cuò)誤 */
- continue;
- else
- return 1;
- }
- if(j==5)
- return 1;
- }
- for(i=0;i!=5;i++)
- {
- CH375_Write_Cmd( CMD_DISK_READY ); /* 獲取USB存儲器的容量 */
- status=CH375_Wait_Int(); /* 等待中斷并獲取狀態(tài) */
- if(status==USB_INT_SUCCESS)
- return 0; /* U盤已經(jīng)成功初始化 */
- }
- return 1;
- }
- /******************************************************************
- - 功能描述:讀取U盤的扇區(qū)
- - 隸屬模塊:CH375模塊
- - 函數(shù)屬性:外部,供用戶調(diào)用
- - 參數(shù)說明:addr:扇區(qū)地址
- pbuf:指向數(shù)據(jù)緩沖區(qū)的指針
- - 返回說明:返回操作結(jié)果,如果為0說明操作成功,
- 如果為1說明操作失敗
- ******************************************************************/
- unsigned char CH375_Read_Sector(unsigned long addr,unsigned char *pBuf)
- {
- unsigned char i=0,j=0,k=0;
- unsigned char status,len;
- unsigned int counter=0;
- for(k=0;k<4;k++)
- {
- counter=0;
- CH375_Write_Cmd(CMD_DISK_READ);//磁盤讀取命令
- CH375_Write_Dat(addr);
- CH375_Write_Dat(addr>>8);
- CH375_Write_Dat(addr>>16);
- CH375_Write_Dat(addr>>24); //送入32位扇區(qū)地址
- CH375_Write_Dat(1); //送入扇區(qū)數(shù)
- for(i=0;i<8;i++) //CH375的數(shù)據(jù)緩沖區(qū)為64字節(jié),所以讀取一個(gè)扇區(qū)要讀8次
- {
- status=CH375_Wait_Int(); //等待CH375中斷信號,讀取狀態(tài)碼
- if(status==USB_INT_DISK_READ) //如果狀態(tài)碼是USB_INT_DISK_READ,就開始讀取數(shù)據(jù),否則發(fā)生錯(cuò)誤
- {
- CH375_Write_Cmd(CMD_RD_USB_DATA); //送入讀數(shù)據(jù)的命令
- delay(4);
- len=CH375_Read_Dat(); //先讀到的是數(shù)據(jù)的長度
- do //把隨后CH375送過來的數(shù)據(jù)放入pBuf中
- {
- pBuf[counter++]=CH375_Read_Dat();
- }while(--len);
- CH375_Write_Cmd(CMD_DISK_RD_GO); //送入繼續(xù)讀數(shù)據(jù)的命令,CH375會(huì)將下面64個(gè)字節(jié)放入緩沖區(qū),等待單片機(jī)來讀
- }
- else
- {
- return 1; //發(fā)生錯(cuò)誤,返回狀態(tài)碼
- }
- }
- status=CH375_Wait_Int(); //讀取8次以后,最后一次送入繼續(xù)讀數(shù)據(jù)的命令,等待CH375產(chǎn)生中斷信號,并讀取狀態(tài)
- if(status==USB_INT_SUCCESS) //如果狀態(tài)碼為USB_INT_SUCCESS,說明讀取扇區(qū)成功,返回0
- {
- return 0;
- }
- else
- if(status==USB_INT_DISK_ERR )
- {
- delay(1000);
- CH375_Write_Cmd(CMD_DISK_R_SENSE); /* 獲取USB存儲器的容量 */
- status=CH375_Wait_Int(); /* 等待中斷并獲取狀態(tài) */
- if(status!=USB_INT_SUCCESS) /* 出現(xiàn)錯(cuò)誤 */
- return 1;
- }
- }
- }
- /******************************************************************
- - 功能描述:寫U盤的扇區(qū)
- - 隸屬模塊:CH375模塊
- - 函數(shù)屬性:外部,供用戶調(diào)用
- - 參數(shù)說明:addr:扇區(qū)地址
- pbuf:指向數(shù)據(jù)緩沖區(qū)的指針
- - 返回說明:返回操作結(jié)果,如果為0說明操作成功,
- 如果為1說明操作失敗
- ******************************************************************/
- unsigned char CH375_Write_Sector(unsigned long addr,unsigned char *pBuf)
- {
- unsigned char i=0;
- unsigned char status,len;
- CH375_Write_Cmd(CMD_DISK_WRITE);//磁盤寫 命令
- CH375_Write_Dat(addr);
- CH375_Write_Dat(addr>>8);
- CH375_Write_Dat(addr>>16);
- CH375_Write_Dat(addr>>24); //寫入32位的扇區(qū)地址,先送低字節(jié)
- CH375_Write_Dat(1); //送入扇區(qū)數(shù)
- for(i=0;i<8;i++)
- {
- status=CH375_Wait_Int();
- if(status==USB_INT_DISK_WRITE)
- {
- CH375_Write_Cmd(CMD_WR_USB_DATA7);
- len=64;
- CH375_Write_Dat(len);
- do
- {
- CH375_Write_Dat(*pBuf);
- pBuf++;
- }while(--len);
- CH375_Write_Cmd(CMD_DISK_WR_GO);
- }
- else
- {
- return 1;
- }
- }
- status=CH375_Wait_Int();
- if(status==USB_INT_SUCCESS) //如果狀態(tài)碼為USB_INT_SUCCESS,說明寫扇區(qū)成功,返回0
- {
- return 0;
- }
- else
- {
- return 1;
- }
- }
復(fù)制代碼
全部資料51hei下載地址:
U盤例程+電路圖.rar
(2.05 MB, 下載次數(shù): 405)
2019-4-11 10:26 上傳
點(diǎn)擊文件名下載附件
|
評分
-
查看全部評分
|