公司沒辦法上QQ。要回家才能上哎。
現(xiàn)在可以了,設(shè)置好必須要保存.UploadImages/20081231144937100.rar
通過你的指導(dǎo),大部分警告消除了.單還是有幾個(gè)問題導(dǎo)致連接不了.請(qǐng)看: Program Size: data=44.4 xdata=620 code=12135 LINK/LOCATE RUN COMPLETE. 4 WARNING(S), 0 ERROR(S)
*** WARNING L14: INCOMPATIBLE MEMORY MODEL MODULE: E:\8051單片機(jī)\單片機(jī)開發(fā)板\USB\程序\USB\CH375HFC.LIB (CH375BYT) MODEL: LARGE
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?CH375FILEENUMER?CH375HFT
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?CH375FILEQUERY?CH375HFT
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?CH375BYTEREAD?CH375BYT
*** FATAL ERROR L250: CODE SIZE LIMIT IN RESTRICTED VERSION EXCEEDED MODULE: E:\8051單片機(jī)\單片機(jī)開發(fā)板\USB\程序\USB\CH375HFC.LIB (-----) LIMIT: 1000H BYTE Download cancelled. 我的理解是1:矛盾的存儲(chǔ)器模式.是不是LIB調(diào)用的不對(duì)? 2跟3就不管了. 4嚴(yán)重的警告.內(nèi)存不夠? 麻煩你幫我看一下我應(yīng)該怎么解決.謝謝! 我是直接調(diào)用的CH375LIB下面的MSC51里面的CH375LIBC.我的C8051F020數(shù)字口并口直接與CH375相連.AO,CS,RD,WD,INT#等都是用的PO口控制.
進(jìn)入project-->Tool Chain....--->Compiler--->Customize--->Variable-->Large project-->Tool Chain....--->Compiler--->Customize--->Code Size --->64K 試試上面的設(shè)置.
呵呵現(xiàn)在編譯連接都沒問題了。但是我的程序好像進(jìn)入了一個(gè)死循環(huán)。我在開始用來每一步都用了一個(gè)LED燈顯示。結(jié)果是兩燈一閃一閃的。不管我屏蔽掉任何語句。他都不往下面走。搞不懂。麻煩你幫我看看。我全部是按例子做的。只是改了端口。如果我串口初始化不好的話是不是就不能用Printf? /* 2008.12.27 **************************************** ** Copyright (C) W.ch 1999-2004 ** ** Web: http://www.winchiphead.com ** **************************************** ** USB Host File Interface for CH375 ** ** TC2.0@PC, KC7.0@MCS51 ** **************************************** */ /* CH375 主機(jī)文件系統(tǒng)接口 */ /* 支持: FAT12/FAT16/FAT32 */
/* MCS-51單片機(jī)C語言的U盤文件讀寫示例程序 */ /* 用于以下情況的MCS51單片機(jī) 1. 高速M(fèi)CS51單片機(jī),機(jī)器周期小于0.3uS,或者在機(jī)器周期為12個(gè)時(shí)鐘時(shí)的時(shí)鐘頻率大于40MHz 2. 非總線MCS51單片機(jī),用普通I/O引腳模擬8位并行總線讀寫,與CH375之間采用并口連接 3. 單片機(jī)與CH375之間采用串口連接 */ /* 本程序用于演示將ADC模數(shù)采集的數(shù)據(jù)保存到U盤文件MY_ADC.TXT中 */ /* CH375的INT#引腳采用查詢方式處理,本例用普通I/O引腳模擬8位并行總線讀寫,同時(shí)提供串口連接示例, 以字節(jié)為單位讀寫U盤文件,讀寫速度較扇區(qū)模式慢,但是由于字節(jié)模式讀寫文件不需要文件數(shù)據(jù)緩沖區(qū)FILE_DATA_BUF, 所以總共只需要600字節(jié)的RAM,適用于單片機(jī)硬件資源有限、數(shù)據(jù)量小并且讀寫速度要求不高的系統(tǒng) */
/* C51 CH375HFT.C */ /* LX51 CH375HFT.OBJ , CH375HFC.LIB */ /* OHX51 CH375HFT */
#include #include #include
//#define MAX_BYTE_IO 35 /* 以字節(jié)為單位單次讀寫文件時(shí)的最大長度,默認(rèn)值是29,值大則占用內(nèi)存多,值小則超過該長度必須分多次讀寫 */
/* 以下定義的詳細(xì)說明請(qǐng)看CH375HFC.H文件 */ #define LIB_CFG_FILE_IO 1 /* 文件讀寫的數(shù)據(jù)的復(fù)制方式,0為"外部子程序",1為"內(nèi)部復(fù)制" */ #define LIB_CFG_INT_EN 0 /* CH375的INT#引腳連接方式,0為"查詢方式",1為"中斷方式" */ /*#define LIB_CFG_UPD_SIZE 1*/ /* 在添加數(shù)據(jù)后是否自動(dòng)更新文件長度: 0為"不更新",1為"自動(dòng)更新" */ /* 默認(rèn)情況下,如果扇區(qū)數(shù)/字節(jié)數(shù)不為0那么CH375FileWrite/CH375ByteWrite只負(fù)責(zé)寫入數(shù)據(jù)而不修改文件長度, 如果需要每次寫完數(shù)據(jù)后會(huì)自動(dòng)修改/更新文件長度,那么可以使全局變量CH375LibConfig的位4為1, 如果長時(shí)間不寫入數(shù)據(jù)則應(yīng)該更新文件長度,防止突然斷電后前面寫入的數(shù)據(jù)與文件長度不相符, 如果確定不會(huì)突然斷電或者后面很快有數(shù)據(jù)不斷寫入則不必更新文件長度,可以提高速度并減少U盤損耗(U盤內(nèi)部的內(nèi)存壽命有限,不宜頻繁改寫) */
/* 只使用單片機(jī)內(nèi)置的1KB外部RAM: 0000H-01FFH 為磁盤讀寫緩沖區(qū), 以字節(jié)為單位讀寫文件不需要文件數(shù)據(jù)讀寫緩沖區(qū)FILE_DATA_BUF */ #define DISK_BASE_BUF_ADDR 0x0000 /* 外部RAM的磁盤數(shù)據(jù)緩沖區(qū)的起始地址,從該單元開始的緩沖區(qū)長度為SECTOR_SIZE */ //#define FILE_DATA_BUF_ADDR 0x0000 /* 外部RAM的文件數(shù)據(jù)緩沖區(qū)的起始地址,緩沖區(qū)長度不小于一次讀寫的數(shù)據(jù)長度,字節(jié)模式不用該緩沖區(qū) */ /* 由于單片機(jī)內(nèi)置的外部RAM只有1KB, 有些單片機(jī)還要去掉256字節(jié)內(nèi)部RAM, 只剩下768字節(jié)的外部RAM, 其中前512字節(jié)由CH375子程序用于磁盤數(shù)據(jù)緩沖 */ //#define FILE_DATA_BUF_LEN 0x0200 /* 外部RAM的文件數(shù)據(jù)緩沖區(qū),緩沖區(qū)長度不小于一次讀寫的數(shù)據(jù)長度,字節(jié)模式不用該緩沖區(qū) */ /* 如果準(zhǔn)備使用雙緩沖區(qū)交替讀寫,那么不要定義FILE_DATA_BUF_LEN,而是在參數(shù)中指定緩沖區(qū)起址,用CH375FileReadX代替CH375FileRead,用CH375FileWriteX代替CH375FileWrite */
//#define CH375_INT_WIRE INT0 /* P3.2, INT0, CH375的中斷線INT#引腳,連接CH375的INT#引腳,用于查詢中斷狀態(tài) */
#define NO_DEFAULT_CH375_F_ENUM 1 /* 未調(diào)用CH375FileEnumer程序故禁止以節(jié)約代碼 */ #define NO_DEFAULT_CH375_F_QUERY 1 /* 未調(diào)用CH375FileQuery程序故禁止以節(jié)約代碼 */
//#include "..\CH375HFC.H"
/* 在P1.4連接一個(gè)LED用于監(jiān)控演示程序的進(jìn)度,低電平LED亮,當(dāng)U盤插入后亮 */ //sbit P1_4 = P1^4; //#define LED_OUT_INIT( ) { P1_4 = 1; } /* P1.4 高電平 */ //#define LED_OUT_ACT( ) { P1_4 = 0; } /* P1.4 低電平驅(qū)動(dòng)LED顯示 */ //#define LED_OUT_INACT( ) { P1_4 = 1; } /* P1.4 低電平驅(qū)動(dòng)LED顯示 */ //sbit P1_5 = P1^5; /* 在P1.5連接一個(gè)LED用于監(jiān)控演示程序的進(jìn)度,低電平LED亮,當(dāng)對(duì)U盤操作時(shí)亮 */ //#define LED_RUN_ACT( ) { P1_5 = 0; } /* P1.5 低電平驅(qū)動(dòng)LED顯示 */ //#define LED_RUN_INACT( ) { P1_5 = 1; } /* P1.5 低電平驅(qū)動(dòng)LED顯示 */ //sbit P1_6 = P1^6; /* 在P1.6連接一個(gè)LED用于監(jiān)控演示程序的進(jìn)度,低電平LED亮,當(dāng)對(duì)U盤寫操作時(shí)亮 */ //#define LED_WR_ACT( ) { P1_6 = 0; } /* P1.6 低電平驅(qū)動(dòng)LED顯示 */ //#define LED_WR_INACT( ) { P1_6 = 1; } /* P1.6 低電平驅(qū)動(dòng)LED顯示 */
/* 本例用I/O引腳模擬產(chǎn)生CH375的并口讀寫時(shí)序 */ /* 本例中的硬件連接方式如下(實(shí)際應(yīng)用電路可以參照修改下述3個(gè)并口讀寫子程序) */ /* 單片機(jī)的引腳 CH375芯片的引腳 P2.5 INT# P4.5 A0 P2.2 CS# 如果模擬出的并口上只有CH375,那么CS#可以直接接低電平,強(qiáng)制片選 P4.7 WR# P4.6 RD# P5(8位端口) D7-D0 */ sbit CH375_CS = P2^2; sbit CH375_INT_WIRE = P2^5;
void mDelay1_2uS( ) /* 至少延時(shí)1.2uS,根據(jù)單片機(jī)主頻調(diào)整 */ { return; }
void CH375_PORT_INIT( ) /* 由于使用通用I/O模塊并口讀寫時(shí)序,所以進(jìn)行初始化 */ { CH375_CS = 0;/*CH375_CS = 1;*/ P4 = 0xDF; /*CH375_WR = 1;CH375_RD = 1;CH375_A0 = 0;P0 = 0xFF; */ P6 = 0xFF; /* 并口輸入 */ }
void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定義的被CH375程序庫調(diào)用的子程序,向CH375寫命令 */ { //*(UINT8XV *)0XBDF1 = mCmd; //return; mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延時(shí)1uS */ P6 = mCmd; /* 向CH375的并口輸出數(shù)據(jù) */ CH375_CS = 0; P4 = 0x7F; /* 輸出有效寫控制信號(hào), 寫CH375芯片的命令端口 */ CH375_CS = 0; /* 該操作無意義,僅作延時(shí),CH375要求讀寫脈沖寬度大于100nS */ P4 = 0xDF; /* 輸出無效的控制信號(hào), 完成操作CH375芯片 */ CH375_CS = 1; P6 = 0xFF; /* 禁止數(shù)據(jù)輸出 */ mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延時(shí)2uS */ }
void xWriteCH375Data( UINT8 mData ) /* 外部定義的被CH375程序庫調(diào)用的子程序,向CH375寫數(shù)據(jù) */ { //*(UINT8XV *)0XBCF0 = mData; //return; P6 = mData; /* 向CH375的并口輸出數(shù)據(jù) */ CH375_CS = 0; P4 = 0x5F; /* 輸出有效寫控制信號(hào), 寫CH375芯片的數(shù)據(jù)端口 */ CH375_CS = 0; /* 該操作無意義,僅作延時(shí),CH375要求讀寫脈沖寬度大于100nS */ P4 = 0xDF;; /* 輸出無效的控制信號(hào), 完成操作CH375芯片 */ CH375_CS = 1; P6 = 0xFF; /* 禁止數(shù)據(jù)輸出 */ mDelay1_2uS( ); /* 至少延時(shí)1.2uS */ }
UINT8 xReadCH375Data( void ) /* 外部定義的被CH375程序庫調(diào)用的子程序,從CH375讀數(shù)據(jù) */ { UINT8 mData; //return( *(UINT8XV *)0XBCF0 ); mDelay1_2uS( ); /* 至少延時(shí)1.2uS */ P6 = 0xFF; /* 輸入 */ CH375_CS = 0; P4=0x9F; /* 輸出有效寫控制信號(hào), 讀CH375芯片的數(shù)據(jù)端口 */ CH375_CS = 0; /* 該操作無意義,僅作延時(shí),CH375要求讀寫脈沖寬度大于100nS */ mData = P0; /* 從CH375的并口輸入數(shù)據(jù) */ P4 = 0xDF;; /* 輸出無效的控制信號(hào), 完成操作CH375芯片 */ CH375_CS = 1; return( mData ); }
/* 如果單片機(jī)與CH375是串口連接,那么參考下面的子程序 void CH375_PORT_INIT( ) { SCON = 0xD0; 設(shè)置串口為9位數(shù)據(jù) 設(shè)置波特率和其它串口參數(shù) }
void xWriteCH375Cmd( UINT8 mCmd ) { TI = 0; TB8 = 1; SBUF = mCmd; while ( TI == 0 ); }
void xWriteCH375Data( UINT8 mData ) { TI = 0; TB8 = 0; SBUF = mData; while ( TI == 0 ); }
UINT8 xReadCH375Data( void ) { while ( RI == 0 ); RI = 0; return( SBUF ); } */
/* 以毫秒為單位延時(shí),不精確,適用于24MHz時(shí)鐘 */ void mDelaymS( UINT8 delay ) { unsigned char i, j, c; for ( i = delay; i != 0; i -- ) { for ( j = 200; j != 0; j -- ) c += 3; /* 在24MHz時(shí)鐘下延時(shí)500uS */ for ( j = 200; j != 0; j -- ) c += 3; /* 在24MHz時(shí)鐘下延時(shí)500uS */ } }
/* 將程序空間的字符串復(fù)制到外部RAM中,返回字符串長度 */ UINT8 mCopyCodeStringToXRAM( UINT8 xdata *iDestination, UINT8 code *iSource ) { UINT8 i = 0; while ( *iDestination = *iSource ) { iDestination ++; iSource ++; i ++; } return( i ); }
/* 檢查操作狀態(tài),如果錯(cuò)誤則顯示錯(cuò)誤代碼并停機(jī) */ void mStopIfError( UINT8 iError ) { if ( iError == ERR_SUCCESS ) return; /* 操作成功 */ printf( "Error: %02X\n", (UINT16)iError ); /* 顯示錯(cuò)誤 */ while ( 1 ) { // LED_OUT_ACT( ); /* LED閃爍 */ mDelaymS( 100 ); // LED_OUT_INACT( ); // mDelaymS( 100 ); } }
/* 為printf和getkey輸入輸出初始化串口 */ void mInitSTDIO( ) { SCON0 = 0x50; PCON = 0x80; TMOD = 0x20; TH1 = 0xf3; /* 24MHz晶振, 9600
#include 這個(gè)位置請(qǐng)不要改動(dòng),一定要在你屏蔽的位置的地方.否則肯定會(huì)有問題. 然后去做測(cè)試命令,看能不能正常通過.詳細(xì)參考CH375DS1 我們的例子程序是在普通的51MCU下面的,你不能把串口直接搬到你上面去,這是必然的.
研究了半天總算是明白了。謝謝了!
紅桃六,你再幫我好好看一下.我仔細(xì)的檢查了一下串口設(shè)置是沒問題的.頭文件的位置我也改了.可還是一樣的現(xiàn)象.死循環(huán).Printf還是不可用...謝謝!
出現(xiàn)錯(cuò)誤就會(huì)死循環(huán)的,你看看錯(cuò)誤狀態(tài)是什么,測(cè)試命令做了嗎?返回值是否正確呢,那你現(xiàn)在先自己另外建立一個(gè)工程,不用我們的程序,printf能成功嗎
沒有錯(cuò)誤出現(xiàn)。。。我是自己建立的工程。程序是在CH375LIB下面找的那個(gè)CH375HFT.只改了端口跟串口程序。一旦到Printf它就不動(dòng)了。我做了測(cè)試命令是正確的。
我現(xiàn)在也在用CH375B,老是出現(xiàn)問題,不知道怎么解決, CH375Reset( ); Delay(10); i = CH375LibInit( ); /* 初始化CH375程序庫和CH375芯片,操作成功返回0 */ mStopIfError( i ); while ( 1 ) { // while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( ); /* 查詢CH375中斷并更新中斷狀態(tài),等待U盤插入 */ while ( CH375DiskStatus < DISK_CONNECT ) { // 查詢CH375中斷并更新中斷狀態(tài),等待U盤插入 CH375DiskConnect( ); Delay(10); } Delay(10); /* 延時(shí),可選操作,有的USB存儲(chǔ)器需要幾十毫秒的延時(shí) */
/* 檢查U盤是否準(zhǔn)備好,有些U盤不需要這一步,但是某些U盤必須要執(zhí)行這一步才能工作 */ for ( i = 0; i < 5; i ++ ) /* 有的U盤總是返回未準(zhǔn)備好,不過可以被忽略 */ { Delay(10); j = CH375DiskReady( ); if ( j == ERR_SUCCESS ) break; /* 查詢磁盤是否準(zhǔn)備好 */ } 在調(diào)用CH375DiskReady( );函數(shù)時(shí)就跑飛了程序,
我也遇到這些問題!CH375init()跑飛,編譯有警告!請(qǐng)問是怎樣解決的?是怎樣消除這些警告的
int CH375_Write_To_UP( )
{ UINT8 i, c, SecCount; UINT16 NewSize, count; /* 因?yàn)镽AM容量有限,所以NewSize限制為16位,實(shí)際上如果文件較大,應(yīng)該分幾次讀寫并且將NewSize改為UINT32以便累計(jì) */ UINT8 *pCodeStr; CH375_PORT_INIT( ); LED_OUT_INIT( ); LED_OUT_ACT( ); /* 開機(jī)后LED亮一下以示工作 */ mDelaymS( 100 ); /* 延時(shí)100毫秒 */ LED_OUT_INACT( ); // mInitSTDIO( ); /* 為了讓計(jì)算機(jī)通過串口監(jiān)控演示過程 */ //printf( "Start\n" );
i = CH375LibInit( ); /* 初始化CH375程序庫和CH375芯片,操作成功返回0 */ mStopIfError( i ); /* 其它電路初始化 */
while ( 1 ) { //printf( "Wait Udisk\n" ); //while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( ); /* 查詢CH375中斷并更新中斷狀態(tài),等待U盤插入 */ while ( CH375DiskStatus < DISK_CONNECT ) { /* 查詢CH375中斷并更新中斷狀態(tài),等待U盤插入 */ if ( CH375DiskConnect( ) == ERR_SUCCESS ) break; /* 有設(shè)備連接則返回成功,CH375DiskConnect同時(shí)會(huì)更新全局變量CH375DiskStatus */ mDelaymS( 100 ); } LED_OUT_ACT( ); /* LED亮 */ mDelaymS( 200 ); /* 延時(shí),可選操作,有的USB存儲(chǔ)器需要幾十毫秒的延時(shí) */
/* 檢查U盤是否準(zhǔn)備好,有些U盤不需要這一步,但是某些U盤必須要執(zhí)行這一步才能工作 */ for ( i = 0; i < 10; i ++ ) { /* 有的U盤總是返回未準(zhǔn)備好,不過可以被忽略 */ mDelaymS( 100 ); //printf( "Ready ?\n" ); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查詢磁盤是否準(zhǔn)備好 */
} break; } strcpy( (char *)mCmdParam.Create.mPathName, "/NEWFILE.TXT" ); /* 新文件名,在根目錄下 */ i = CH375FileCreate( ); /* 新建文件并打開,如果文件已經(jīng)存在則先刪除后再新建 */ mStopIfError( i ); 我太明白程序 為什么 跑到 mStopIfError( i ); i總是不等于 成功 (i != ERR_SUCCESS) return ;
問題 :總是無法 新建文件 我用的是 并口 外部中斷 用INT# 低電平 進(jìn)中斷 這個(gè)沒有問題 就是無法新建文件 是文件格式有問題 還有什么地方出錯(cuò)了 希望大蝦們幫我看看 謝謝了 還有我不 Print()函數(shù)全刪除了 因?yàn)?keil-MDK 好像不支持 因?yàn)槌绦蛞?跑到 Print()就停止了 所以我把所以的 Print()都刪除了
//printf( "Write\n" );
int CH375_Write_To_UP( )
{ UINT8 i, c, SecCount; UINT16 NewSize, count; /* 因?yàn)镽AM容量有限,所以NewSize限制為16位,實(shí)際上如果文件較大,應(yīng)該分幾次讀寫并且將NewSize改為UINT32以便累計(jì) */ UINT8 *pCodeStr; CH375_PORT_INIT( ); LED_OUT_INIT( ); LED_OUT_ACT( ); /* 開機(jī)后LED亮一下以示工作 */ mDelaymS( 100 ); /* 延時(shí)100毫秒 */ LED_OUT_INACT( ); // mInitSTDIO( ); /* 為了讓計(jì)算機(jī)通過串口監(jiān)控演示過程 */ //printf( "Start\n" );
i = CH375LibInit( ); /* 初始化CH375程序庫和CH375芯片,操作成功返回0 */ mStopIfError( i ); /* 其它電路初始化 */
while ( 1 ) { //printf( "Wait Udisk\n" ); //while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( ); /* 查詢CH375中斷并更新中斷狀態(tài),等待U盤插入 */ while ( CH375DiskStatus < DISK_CONNECT ) { /* 查詢CH375中斷并更新中斷狀態(tài),等待U盤插入 */ if ( CH375DiskConnect( ) == ERR_SUCCESS ) break; /* 有設(shè)備連接則返回成功,CH375DiskConnect同時(shí)會(huì)更新全局變量CH375DiskStatus */ mDelaymS( 100 ); } LED_OUT_ACT( ); /* LED亮 */ mDelaymS( 200 ); /* 延時(shí),可選操作,有的USB存儲(chǔ)器需要幾十毫秒的延時(shí) */
/* 檢查U盤是否準(zhǔn)備好,有些U盤不需要這一步,但是某些U盤必須要執(zhí)行這一步才能工作 */ for ( i = 0; i < 10; i ++ ) { /* 有的U盤總是返回未準(zhǔn)備好,不過可以被忽略 */ mDelaymS( 100 ); //printf( "Ready ?\n" ); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查詢磁盤是否準(zhǔn)備好 */
} break; } strcpy( (char *)mCmdParam.Create.mPathName, "/NEWFILE.TXT" ); /* 新文件名,在根目錄下 */ i = CH375FileCreate( ); /* 新建文件并打開,如果文件已經(jīng)存在則先刪除后再新建 */ mStopIfError( i ); 我太明白程序 為什么 跑到 mStopIfError( i ); i總是不等于 成功 (i != ERR_SUCCESS) return ;
問題 :總是無法 新建文件 我用的是 并口 外部中斷 用INT# 低電平 進(jìn)中斷 這個(gè)沒有問題 就是無法新建文件 是文件格式有問題 還有什么地方出錯(cuò)了 希望大蝦們幫我看看 謝謝了 還有我不 Print()函數(shù)全刪除了 因?yàn)?keil-MDK 好像不支持 因?yàn)槌绦蛞?跑到 Print()就停止了 所以我把所以的 Print()都刪除了
//printf( "Write\n" );
CH375DiskReady( )返回多少