我自己參考沁恒公司的CH372芯片的中文版說明書 版本3.5.pdf,的竄口方式,做了一個作品,新型單片機編程器,但是做到CH375識別U盤時,卻無法識別,我用1602做跟蹤顯示,但顯示模塊只顯示初始化時的第一句“Please insert U pan!”,但當我插入U盤后它卻沒顯示“The U pan had been inserted! ”,即,CH375無法識別U盤已經插入,不知道是我的原理圖有錯還是我的硬件電路有錯,我測量了CH375和AVR單片機的電壓都正常為5V,但就識別不了U 盤,現(xiàn)在特急,因為這是畢設,過些天就要交上去,懇請各位大蝦給小弟指導指導!以下時我的原理圖,以及程序CH375test為測試程序,1602.h為顯示模塊的程序,AVR為控制單片機,51為下載終端單片機。UploadImages/20094141535419.rar
你的硬件結構是:單片機<---------->CH375<---------->U盤? 串口 USB 若是,那么你的程序參考錯了,現(xiàn)在的程序我們U盤讀寫模塊的例程 下載CH375EVT.ZIP,參考\CH375EVT\PUB\MCS51C\MISCELL下的程序,只要把375的接口函數(shù)改為串口方式即可,不知道你是用了什么單片機,操作U盤的話,建議采用我們的子程序庫:\CH375EVT\PUB\CH375HF.PDF
你的硬件結構是:單片機<---------->CH375<---------->U盤 串口 USB
我的參考程序是PUB/SER_SYNC,是看CH375HM.PDF所說的,里面的:示例程序->(8)三線串口連接,串口等待狀態(tài),它給出了51單片機的例子。我用的時AVR單片機。非常謝謝您的解答,我用您的建議試試!
我看了您說的,\CH375EVT\PUB\MCS51C\MISCELL,里面的四個示例程序,在程序部分/* 設置CH375為USB主機方式 */說到,CH375出錯,例如芯片型號錯或者處于串口方式或者不支持 ,那不是不支持串口嗎?那不是不能用這個參考程序?
我們的例程是并口方式,在主機模式下可以采用串口通信,以51為例,對于例程只要做2個部分修改 (1)串口初始化為9位數(shù)據(jù)方式,默認波特率為9600 (2)void CH375_WR_CMD_PORT( unsigned char cmd ) { /* 向CH375的命令端口寫入命令,周期不小于4uS,如果單片機較快則延時 */ delay2us(); TI = 0; TB8 = 1; /* 表示命令 */ SBUF = cmd; while( TI == 0 ); delay2us(); }
void CH375_WR_DAT_PORT( unsigned char dat ) { /* 向CH375的數(shù)據(jù)端口寫入數(shù)據(jù),周期不小于1.5uS,如果單片機較快則延時 */ TI = 0; TB8 = 0; /* 表示數(shù)據(jù) */ SBUF = dat; while( TI == 0 ); delay1us(); /* 因為MCS51單片機較慢所以實際上無需延時 */ }
unsigned char CH375_RD_DAT_PORT() { /* 從CH375的數(shù)據(jù)端口讀出數(shù)據(jù),周期不小于1.5uS,如果單片機較快則延時 */ UINT8 dat; delay1us(); /* 因為MCS51單片機較慢所以實際上無需延時 */ while( RI == 0 ); dat = SBUF; RI = 0; return( dat ); } 另,程序中串口打印輸出printf去掉
我參照CH375芯片的中文版說明書 版本3.5.pdf里的串口連接圖,我的原理圖里,CH375的A0,CS,WR,RE,都沒跟單片機連接到,復位鍵RSTI也是照它的連接個電容再接地,但看程序里卻有寫入命令和寫入數(shù)據(jù)之分,看了看資料說是根據(jù)A0的電平決定的,還有你寫入數(shù)據(jù)和命令的WR管腳我沒接,讀命令的RE管腳我也沒接,我這樣的接法是不是錯了?
非常感謝您的指導.請原諒我大膽舉動,可以加您的QQ嗎?我希望在這最關鍵的幾天,遇到關于CH375的問題,可以盡快的問您,及時的得到您的解答,身邊的人都不熟悉CH375芯片,導師也沒用過,出差去了還沒回來.現(xiàn)在一頭霧水!若能得您的及時幫助,我將感激不盡,并能出色的完成任務!
(1)我們工作期間只可以通過郵件或BBS與客戶交流 (2)想確一下,究竟是通過什么口操作CH375的,并口或串口?感覺你把這兩種接口混淆了,建議參考CH375DS1.PDF中對這兩種接口的解釋
串口啊,U盤的-UD,+UD與CH375的-UD,+UD相連,CH375的TXD,RXD與AVRM16單片機的TXD,RXD相連,現(xiàn)在我做了幾根跳線,讓CH375的A0,CS,WR,RE管腳與M16的幾個管腳相連.這個不是很明顯的串口連接嗎?并口的話要將RXD管腳直接接地,我看CH375芯片的中文版說明書 版本3.5.pdf,里面是這么說的!
(1)并口模式下,是把TXD接地,RXD懸空 (2)串口模式下,不需要關系A0,CS,WR,RD,它們都是懸空的 請再把8.2. 串口方式部分看看
哦,我看了你們公司給的我的參考程序是PUB/SER_SYNC,是看CH375HM.PDF所說的,里面的:示例程序->(8)三線串口連接,串口等待狀態(tài),它給出了51單片機的例子。難道我參考的串口程序真的錯了嗎?可是CH375HM.PDF里面明明是這樣說的啊!
現(xiàn)在頭腦好亂,您讓我參考的程序CH375EVT\PUB\MCS51C\MISCELL里面有/* 設置CH375為USB主機方式 */這個函數(shù),還有void CH375Interrupt( ) interrupt 0 using 1這個函數(shù),unsigned char mCH375Init( )這幾個函數(shù)都用得到嗎?或者更具體一點,可以給我說說我這個作品需要到那些具體函數(shù)嗎?
如果是工作在串口模式下的話,那么你需要在CH375LIB.ZIP里面的MCS51文件夾下面的FILELIB5的例子程序,你只需要修改三個讀寫子函數(shù)以及中斷引腳的定義(查詢方式)或者中斷的配置(中斷方式)就可以實現(xiàn)讀寫U盤
CH375EVT\PUB\MCS51C\MISCELL 這里面的例程你可以用,只需要修改一下三個讀寫函數(shù),參考4樓程序,把單片機串口設置成9位數(shù)據(jù)模式,波特率為9600bps ,CH375的TXD,RXD分別與AVRM16單片機的RXD,TXD相連
CH375HM.PDF是我們U盤讀寫模塊的說明文檔。其次,你需要參考CH375EVT\PUB\MCS51C\MISCELL下的程序,但是不要參考EXAM0下的device那是CH375做設備的例子程序,參考MISCELL下的EXAM1例子程序,你的接口方式不是并口,你需要修改的接口函數(shù)就是第四樓所列舉出的.
現(xiàn)在我打算做一個簡單測試程序,測試CH375識別U盤。參考12樓的建議。自己根據(jù)CH375HFT.C修改了部分程序,用ICC編譯,可是程序一直提示出錯貴公司給的頭文件出錯。錯誤如下: CH375HF5.H(407): syntax error; found `*' expecting `;'
406到408行代碼如下: #ifndef PUINT8C typedef unsigned char code *PUINT8C; #endif 這是我的簡單測試程序,請問是不是我的程序哪里寫錯了?
程序如下:
#include #include #include "CH375HF5.H" #include "1602.h"
void mDelay1_2uS( ) /* 至少延時1.2uS,根據(jù)單片機主頻調整 */ { return; } void delay2us( ) { unsigned char i; for ( i = 2; i != 0; i -- ); }
/* 延時1微秒,不精確 */ void delay1us( ) { unsigned char i; for ( i = 1; i != 0; i -- ); }
UINT8 TI,TB8,SBUF,RI; void xWriteCH375Cmd( UINT8 mCmd ) { TI = 0; TB8 = 1; SBUF = mCmd; while ( TI == 0 ); delay2us( ); delay2us( ); }
void xWriteCH375Data( UINT8 mData ) { TI = 0; TB8 = 0; SBUF = mData; while ( TI == 0 ); delay1us( ); }
UINT8 xReadCH375Data( void ) { delay1us(); while ( RI == 0 ); RI = 0; return( SBUF ); }
/* 延時100毫秒,不精確 */ void mDelay100mS( ) { UINT8 i, j, c; for ( i = 200; i != 0; i -- ) for ( j = 200; j != 0; j -- ) c+=3; }
/* 檢查操作狀態(tài),如果錯誤則顯示錯誤代碼并停機 */ void mStopIfError( UINT8 iError ) { if ( iError == ERR_SUCCESS ) return; /* 操作成功 */ LCD_write_string(0,0,"Error: %02X"); /* 顯示錯誤 */ } void mInitSTDIO( ) { UBRRH = 0; UBRRL = 47; /* 9600bps@7.3728MHz */ UCSRB = 0x1C; /* BIT(RXEN) | BIT(TXEN);|BIT(UCSZ2) */ UCSRC = 0x06; /* BIT(UCSZ1) | BIT(UCSZ0); 9個數(shù)據(jù)位 設置串口為9位數(shù)據(jù)設置波特率和其它串口參數(shù)*/ }
main( ) { UINT8 i; mInitSTDIO( ); LCD_write_string(0,0, "Start" ); mDelay100mS( ); mDelay100mS( ); i = CH375LibInit( ); /* 初始化CH375程序庫和CH375芯片,操作成功返回0 */ mStopIfError( i ); /* 其它電路初始化 */
while ( 1 ) { LCD_write_string(0,0,"Wait Udisk" ); mDelay100mS( ); mDelay100mS( ); while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( ); /* 查詢CH375中斷并更新中斷狀態(tài),等待U盤插入 */ mDelay100mS( );
/* 檢查U盤是否準備好,有些U盤不需要這一步,但是某些U盤必須要執(zhí)行這一步才能工作 */ for ( i = 0; i < 5; i ++ ) { /* 有的U盤總是返回未準備好,不過可以被忽略 */ mDelay100mS( ); LCD_write_string(0,0,"Ready ?" ); mDelay100mS( ); mDelay100mS( ); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查詢磁盤是否準備好 */ } #if DISK_BASE_BUF_LEN if ( DISK_BASE_BUF_LEN < CH375vSectorSize ) { /* 檢查磁盤數(shù)據(jù)緩沖區(qū)是否足夠大,CH375vSectorSize是U盤的實際扇區(qū)大小 */ LCD_write_string(0,0,"Too large sector"); LCD_write_string(0,1,"size"); mDelay100mS( ); mDelay100mS( ); while ( CH375DiskConnect( ) == ERR_SUCCESS ) mDelay100mS( ); continue; } #endif LCD_write_string(0,0,"Open" ); mDelay100mS( ); mDelay100mS( ); } }