最簡(jiǎn)單的CH375讀U盤 問題! 管理員和高手請(qǐng)進(jìn)

最簡(jiǎn)單的CH375讀U盤 問題! 管理員和高手請(qǐng)進(jìn) 文字

#ifndef _CH375_H #define _CH375_H

#include

void CH375_WriteCmd(unsigned char cmd) // 向CH375的命令端口寫入命令,周期不小于4uS,如果單片機(jī)較快則延時(shí) { delay_us(2); // 2 CH375_OPEN_CMD_DDR; // A0=1 CH375_DATA_PORT=cmd; // 放好數(shù)據(jù) CH375_DATA_PORT_OUT; // 方向輸出 CH375_WRITE_CMD_OK; // A0=1 CS=0 WR=0 RD=1 delay_us(1); // 1 // 發(fā)出命令碼前后應(yīng)該各延時(shí)2uS,對(duì)于不快的單片機(jī)可以不需要延時(shí) CH375_CLOSE; // CS=1 WR=1 RD=1 命令狀態(tài)關(guān)閉 CH375_DATA_PORT_IN; // 數(shù)據(jù)方向輸入 delay_us(1); // 1 }

void CH375_WriteData(unsigned char data) //向CH375的數(shù)據(jù)端口寫入數(shù)據(jù),周期不小于1.5uS,如果單片機(jī)較快則延時(shí) { CH375_DATA_PORT=data; // 放好數(shù)據(jù) CH375_DATA_PORT_OUT; // 數(shù)據(jù)方向輸出 CH375_WRITE_DATA_OK; // A0=0 CS=0 WR=0 RD=1 delay_us(5); // 1 CH375_CLOSE; //CS=1 WR=1 RD=1 命令狀態(tài)關(guān)閉 CH375_DATA_PORT_IN; // 禁止數(shù)據(jù)輸出 delay_us(1); // 1 // 延時(shí) } unsigned char CH375_ReadData(void) //從CH375的數(shù)據(jù)端口讀出數(shù)據(jù),周期不小于1.5uS,如果單片機(jī)較快則延時(shí) { unsigned char d; delay_us(1); // 1 CH375_DATA_PORT_IN; // 數(shù)據(jù)輸入 CH375_READ_DATA_OK; // A0=0 CS=0 WR=1 RD=0 delay_us(1); // 1 d=CH375_DATA_PIN; // 讀引腳數(shù)據(jù) CH375_CLOSE; // CS=1 WR=1 RD=1 命令狀態(tài)關(guān)閉 return d;

}

unsigned char CH375_WaitInt( void ) //等待CH375中斷并獲取狀態(tài),主機(jī)端等待操作完成,返回操作狀態(tài) { unsigned char d; while(CH375_INT_PIN==0); CH375_WriteCmd(CMD_GET_STATUS); d=CH375_ReadData(); return d; }

unsigned char CH375_CheckData(unsigned char data) { CH375_WriteCmd(0x06); CH375_WriteData(data); data=CH375_ReadData(); return data; }

unsigned char CH375_CheckDisk(void) //等待U盤插入 產(chǎn)生中斷 不停的檢測(cè)狀態(tài) 屬于進(jìn)入函數(shù) { unsigned char Status; CH375_WriteCmd( CMD_SET_USB_MODE ); // 初始化CH375,設(shè)置USB工作模式 CH375_WriteData( 6 ); // 模式代碼,自動(dòng)檢測(cè)USB設(shè)備連接 delay_ms(10); while ( CH375_WaitInt()!=USB_INT_CONNECT); // 等待U盤連接 CH375_WriteCmd(CMD_GET_STATUS); // 產(chǎn)生操作完成中斷, 獲取中斷狀態(tài) Status=CH375_ReadData(); if ( Status != USB_INT_CONNECT ) return( Status ); //USB設(shè)備斷開 return 0; }

unsigned char CH375_DiskIni( void ) // 初始化磁盤 { unsigned char Status; unsigned char i;

CH375_WriteCmd(CMD_DISK_INIT); // 初始化USB存儲(chǔ)器 Status=CH375_WaitInt(); delay_ms(100) ; CH375_WriteCmd(CMD_DISK_SIZE); // 獲取USB存儲(chǔ)器的容量 Status=CH375_WaitInt(); if (Status !=USB_INT_SUCCESS) { for(i=0 ; i<10 ; i++) { CH375_WriteCmd( CMD_DISK_SIZE ); // 獲取USB存儲(chǔ)器的容量 Status=CH375_WaitInt(); if ( Status == USB_INT_SUCCESS) break; delay_ms(100) ; //這里很關(guān)鍵 必須延時(shí) } } if ( Status !=USB_INT_SUCCESS ) return( Status ); //USB設(shè)備斷開 return 0; }

endif

芯片的管腳 定義隨便 我使用了 mega8 mega162 都可以讀到255個(gè)扇區(qū) [Emot]27[/Emot]

是不是因?yàn)镃H375_WriteData( iSectorCount ); iSectorCount最大只能是255. 要想讀出大于255個(gè)扇區(qū)要多次讀如:每次讀個(gè)iSectorCount =100


我錯(cuò)了,我也沒有實(shí)現(xiàn),只讀出了9個(gè)扇區(qū)


CH375_WriteData( )這個(gè)函數(shù)每次寫入一個(gè)字節(jié)的數(shù)據(jù),也就是0--255;即使定義了unsigned int iSectorCount,最多一次也只能是讀取255個(gè)扇區(qū)。


你單片機(jī)的晶振是多少???順便把延時(shí)子函數(shù)帖出來,延時(shí)太長(zhǎng)了也可能出問題。


謝謝 兩位 我突然有了新的發(fā)現(xiàn) 我今天晚上 是是 我在給你們答復(fù) !

謝謝 大家


我已經(jīng) 嚴(yán)格修改了程序 ! 按照datasheet 的要求修改了 !

可是還是不行 大家請(qǐng)看新的 程序 ! 結(jié)果還是 讀 255次 我暈啊 !

這是怎么回事那 ?

hcn { M } 碩研一年級(jí) 你到那去了 給我指點(diǎn)一下好嗎 ?


CH375_CLOSE; // A0=1 CS=1 WR=1 RD=1 命令狀態(tài)關(guān)閉 應(yīng)該為A0=0,CS=1,WR=1,RD=1


還有一個(gè)問題就是大小端的問題,你將上面的讀函數(shù)按照小端的格式修改下看可以不可以讀


han 如果按你說的 可是 我可以讀出好多啊

就是以后不能讀了

開始能讀 說明CH375_CLOSE 正常啊 ! 我覺得 CS=1 WR=1 RD=1 ch375 已經(jīng)失效了 A0 的狀態(tài)應(yīng)該不用去管 啊

hcn 我就是沖你來的 你幫幫我 謝謝


hcn 你的 QQ 是多少啊 ?286708537 我的

我加你行嗎 ?

還有就是 你說的小端 我不懂 你在說明白點(diǎn)好嗎 ? 謝謝

我的QQ 每天都在線上 我等你啊


可以這樣解釋,即使你反寫了的話,應(yīng)該是可以讀0-255,當(dāng)讀256扇區(qū)的時(shí)候,實(shí)際應(yīng)該是進(jìn)位,這個(gè)時(shí)候如果大小端錯(cuò)誤的話,有可能導(dǎo)致你要讀的扇區(qū)數(shù)超過了U盤本身具有的扇區(qū)數(shù),例如一個(gè)U盤只有10000個(gè)扇區(qū),而你下面要讀的扇區(qū)數(shù)卻是第20000個(gè)扇區(qū),那你說還可以不可以讀出數(shù)據(jù)來,當(dāng)然,這只是一個(gè)比喻而已。


哦 知道了

你有QQ 嗎 能加我嗎 我能跟你學(xué)到東西 加我吧


你看一下每次讀的時(shí)候,CH375_ReadSector這個(gè)函數(shù)返回的c是多少,若c不是0而是0X1F的話,就有可能是你所要讀的扇區(qū)數(shù)過大,超出了U盤最大扇區(qū)數(shù)了。


luoye268268你用我的程序測(cè)試過嗎


不是,我用的是51單片機(jī),不過把大小端換過來,也就是把iLbaStart的高低位反過來試了一下。 不過如果起始扇區(qū)號(hào)iLbaStart大于U盤最大扇區(qū)數(shù)的話,可能會(huì)返回0X1F。


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频