誰(shuí)幫我??!ATmega16/32+CH375組成單片機(jī)寫(xiě)優(yōu)盤(pán)。

電路:ATmega16/32+CH375組成單片機(jī)寫(xiě)優(yōu)盤(pán)。(存?zhèn)€數(shù)據(jù)就行) 單片機(jī)的引腳 CH375芯片的引腳 PINB.4 INT# PORTB.3 A0 PORTB.2 CS# PORTB.1 WR# PORTB.0 RD# PORTC(8位端口) D7-D0 */ CH375與單片機(jī)的連接圖: 20075281683824.jpg CH375模塊的電路圖: 2007528169411.jpg

程序:#include #include #include #include

/* 以下定義的詳細(xì)說(shuō)明請(qǐng)看CH375HF9.H文件 */ #define LIB_CFG_FILE_IO 1 /* 文件讀寫(xiě)的數(shù)據(jù)的復(fù)制方式,0為"外部子程序",1為"內(nèi)部復(fù)制" */ #define LIB_CFG_INT_EN 0 /* CH375的INT#引腳連接方式,0為"查詢方式",1為"中斷方式" */

/* 單片機(jī)的RAM有限,其中CH375子程序用512字節(jié),剩余RAM部分可以用于文件讀寫(xiě)緩沖 */ #define FILE_DATA_BUF_LEN 0x0200 /* 外部RAM的文件數(shù)據(jù)緩沖區(qū),緩沖區(qū)長(zhǎng)度不小于一次讀寫(xiě)的數(shù)據(jù)長(zhǎng)度 */ /* 如果準(zhǔn)備使用雙緩沖區(qū)交替讀寫(xiě),那么不要定義FILE_DATA_BUF_LEN,而是在參數(shù)中指定緩沖區(qū)起址,用CH375FileReadX代替CH375FileRead,用CH375FileWriteX代替CH375FileWrite */

#define CH375_INT_WIRE ( PINB & 0x10 ) /* PINB.4, CH375的中斷線INT#引腳,連接CH375的INT#引腳,用于查詢中斷狀態(tài) */

#include "CH375HFB.H"

/* 有些AVR單片機(jī)提供開(kāi)放系統(tǒng)總線,那么直接將CH375掛在其系統(tǒng)總線上,以8位I/O方式進(jìn)行讀寫(xiě) */ /* 雖然Atmega32提供系統(tǒng)總線,不過(guò)本例假定不開(kāi)放系統(tǒng)總線,所以用I/O引腳模擬產(chǎn)生CH375的并口讀寫(xiě)時(shí)序 */ /* 本例中的硬件連接方式如下(實(shí)際應(yīng)用電路可以參照修改下述3個(gè)并口讀寫(xiě)子程序) */ /* 單片機(jī)的引腳 CH375芯片的引腳 PINB.4 INT# PORTB.3 A0 PORTB.2 CS# PORTB.1 WR# PORTB.0 RD# PORTC(8位端口) D7-D0 */

void mDelay1uS( ) /* 至少延時(shí)1uS,根據(jù)單片機(jī)主頻調(diào)整 */ { UINT8 i; for ( i = 5; i != 0; i -- ); }

void CH375_PORT_INIT( ) /* 由于使用通用I/O模塊并口讀寫(xiě)時(shí)序,所以進(jìn)行初始化 */ { DDRC = 0x00; /* 設(shè)置8位并口為輸入 */ PORTB = 0x07; /* 設(shè)置CS,WR,RD默認(rèn)為高電平 */ DDRB = 0x0F; /* 設(shè)置CS,WR,RD,A0為輸出,設(shè)置INT#為輸入 */ }

void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定義的被CH375程序庫(kù)調(diào)用的子程序,向CH375寫(xiě)命令 */ { mDelay1uS( ); mDelay1uS( ); /* 至少延時(shí)1uS */ /* *(volatile unsigned char *)CH375_CMD_PORT_ADDR = mCmd; 通過(guò)并口直接讀寫(xiě)CH375而非普通I/O模擬 */ PORTB |= 0x08; /* 輸出A0=1 */ PORTC = mCmd; /* 向CH375的并口輸出數(shù)據(jù) */ DDRC = 0xFF; /* 并口D0-D7輸出 */ PORTB &= 0xF9; /* 輸出有效寫(xiě)控制信號(hào), 寫(xiě)CH375芯片的命令端口, A0=1; CS=0; WR=0; RD=1; */ DDRC = 0xFF; /* 該操作無(wú)意義,僅作延時(shí),CH375要求讀寫(xiě)脈沖寬度大于100nS */ PORTB |= 0x07; /* 輸出無(wú)效的控制信號(hào), 完成操作CH375芯片, A0=1; CS=1; WR=1; RD=1; */ DDRC = 0x00; /* 禁止數(shù)據(jù)輸出 */ PORTB &= 0xF7; /* 輸出A0=0; 可選操作 */ mDelay1uS( ); mDelay1uS( ); /* 至少延時(shí)2uS */ }

void xWriteCH375Data( UINT8 mData ) /* 外部定義的被CH375程序庫(kù)調(diào)用的子程序,向CH375寫(xiě)數(shù)據(jù) */ { /* *(volatile unsigned char *)CH375_DAT_PORT_ADDR = mData; 通過(guò)并口直接讀寫(xiě)CH375而非普通I/O模擬 */ PORTC = mData; /* 向CH375的并口輸出數(shù)據(jù) */ DDRC = 0xFF; /* 并口D0-D7輸出 */ PORTB &= 0xF1; /* 輸出有效寫(xiě)控制信號(hào), 寫(xiě)CH375芯片的數(shù)據(jù)端口, A0=0; CS=0; WR=0; RD=1; */ DDRC = 0xFF; /* 該操作無(wú)意義,僅作延時(shí),CH375要求讀寫(xiě)脈沖寬度大于100nS */ PORTB |= 0x07; /* 輸出無(wú)效的控制信號(hào), 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */ DDRC = 0x00; /* 禁止數(shù)據(jù)輸出 */ mDelay1uS( ); /* 至少延時(shí)1.2uS */ }

UINT8 xReadCH375Data( void ) /* 外部定義的被CH375程序庫(kù)調(diào)用的子程序,從CH375讀數(shù)據(jù) */ { UINT8 mData; /* mData = *(volatile unsigned char *)CH375_DAT_PORT_ADDR; 通過(guò)并口直接讀寫(xiě)CH375而非普通I/O模擬 */ mDelay1uS( ); /* 至少延時(shí)1.2uS */ DDRC = 0x00; /* 數(shù)據(jù)輸入 */ PORTB &= 0xF2; /* 輸出有效讀控制信號(hào), 讀CH375芯片的數(shù)據(jù)端口, A0=0; CS=0; WR=1; RD=0; */ DDRC = 0x00; /* 該操作無(wú)意義,僅作延時(shí),CH375要求讀寫(xiě)脈沖寬度大于100nS */ mData = PINC; /* 從CH375的并口PA輸入數(shù)據(jù) */ PORTB |= 0x07; /* 輸出無(wú)效的控制信號(hào), 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */ return( mData ); }

/* 在P0.2連接一個(gè)LED用于監(jiān)控演示程序的進(jìn)度,低電平LED亮 */ #define LED_OUT_INIT( ) { PORTB |= 0x80; DDRB |= 0x80; } /* PORTB.7 高電平為輸出方向 */ #define LED_OUT_ACT( ) { PORTB &= 0x7F; } /* PORTB.7 低電平驅(qū)動(dòng)LED顯示 */ #define LED_OUT_INACT( ) { PORTB |= 0x80; } /* PORTB.7 低電平驅(qū)動(dòng)LED顯示 */

/* 延時(shí)指定毫秒時(shí)間,根據(jù)單片機(jī)主頻調(diào)整,不精確 */ void mDelaymS( UINT8 ms ) { UINT16 i; while ( ms -- ) for ( i = 2600; i != 0; 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 ); } } void mInitSTDIO(void) { UCSRA=0x00; UCSRB=0xD8; UCSRC=0x86; UBRRH=0x00; UBRRL=0x0C; } void USART_Transmit( unsigned char data ) { /* 等待發(fā)送緩沖器為空 */ while ( !( UCSRA & (1<; /* 將數(shù)據(jù)放入緩沖器,發(fā)送數(shù)據(jù) */ UDR = data; }

void USART_Transmit_String( unsigned char *data,unsigned char lenth ) { unsigned char i=0; for(i=0;i USART_Transmit(data[i]); }

void main( ) { UINT8 i, c, SecCount; UINT16 NewSize, count; /* 因?yàn)镽AM容量有限,所以NewSize限制為16位,實(shí)際上如果文件較大,應(yīng)該分幾次讀寫(xiě)并且將NewSize改為UINT32以便累計(jì) */ UINT8 *pCodeStr; CH375_PORT_INIT( ); LED_OUT_INIT( ); LED_OUT_ACT( ); /* 開(kāi)機(jī)后LED亮一下以示工作 */ mDelaymS( 100 ); /* 延時(shí)100毫秒 */ mDelaymS( 100 ); /* 延時(shí)100毫秒 */ mDelaymS( 100 ); /* 延時(shí)100毫秒 */ mDelaymS( 100 ); /* 延時(shí)100毫秒 */ LED_OUT_INACT( ); mInitSTDIO( ); /* 為了讓計(jì)算機(jī)通過(guò)串口監(jiān)控演示過(guò)程 */ printf( "Start\n" ); i = CH375LibInit( ); /* 初始化CH375程序庫(kù)和CH375芯片,操作成功返回0 */ mStopIfError( i ); /* 其它電路初始化 */

while ( 1 ) { printf( "Wait Udisk\n" ); while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( ); /* 查詢CH375中斷并更新中斷狀態(tài),等待U盤(pán)插入 */ LED_OUT_ACT( ); /* LED亮 */ mDelaymS( 200 ); /* 延時(shí),可選操作,有的USB存儲(chǔ)器需要幾十毫秒的延時(shí) */

/* 檢查U盤(pán)是否準(zhǔn)備好,有些U盤(pán)不需要這一步,但是某些U盤(pán)必須要執(zhí)行這一步才能工作 */ for ( i = 0; i < 5; i ++ ) { /* 有的U盤(pán)總是返回未準(zhǔn)備好,不過(guò)可以被忽略 */ mDelaymS( 100 ); printf( "Ready ?\n" ); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查詢磁盤(pán)是否準(zhǔn)備好 */ } /* 查詢磁盤(pán)物理容量 */ /* printf( "DiskSize\n" ); i = CH375DiskSize( ); mStopIfError( i ); printf( "TotalSize = %d MB \n", (unsigned int)( mCmdParam.DiskSize.mDiskSizeSec >> 11 ) ); 顯示為以MB為單位的容量 */

#ifdef EN_DISK_WRITE /* 子程序庫(kù)支持寫(xiě)操作 */ /* 產(chǎn)生新文件 */ printf( "Create\n" ); strcpy( (char *)mCmdParam.Create.mPathName, "\\NEWFILE.TXT" ); /* 新文件名,在根目錄下 */ i = CH375FileCreate( ); /* 新建文件并打開(kāi),如果文件已經(jīng)存在則先刪除后再新建 */ mStopIfError( i ); printf( "Write\n" ); mCmdParam.Write.mSectorCount = SecCount; /* 寫(xiě)入所有扇區(qū)的數(shù)據(jù) */ /* current_buffer = & FILE_DATA_BUF[0]; 如果文件讀寫(xiě)的數(shù)據(jù)的復(fù)制方式為"外部子程序",那么需要設(shè)置存放數(shù)據(jù)的緩沖區(qū)的起始地址 */ i = CH375FileWrite( ); /* 向文件寫(xiě)入數(shù)據(jù) */ mStopIfError( i ); //printf( "Modify\n" ); //mCmdParam.Modify.mFileAttr = 0xff; /* 輸入?yún)?shù): 新的文件屬性,為0FFH則不修改 */ //mCmdParam.Modify.mFileTime = 0xffff; /* 輸入?yún)?shù): 新的文件時(shí)間,為0FFFFH則不修改,使用新建文件產(chǎn)生的默認(rèn)時(shí)間 */ //mCmdParam.Modify.mFileDate = MAKE_FILE_DATE( 2004, 5, 18 ); /* 輸入?yún)?shù): 新的文件日期: 2004.05.18 */ //mCmdParam.Modify.mFileSize = NewSize; /* 輸入?yún)?shù): 如果原文件較小,那么新的文件長(zhǎng)度與原文件一樣長(zhǎng),否則被RAM所限,如果文件長(zhǎng)度大于64KB,那么NewSize必須為UINT32 */ //i = CH375FileModify( ); /* 修改當(dāng)前文件的信息,修改日期和長(zhǎng)度 */ //mStopIfError( i ); printf( "Close\n" ); mCmdParam.Close.mUpdateLen = 0; /* 不要自動(dòng)計(jì)算文件長(zhǎng)度,如果自


熱門(mén)產(chǎn)品 : CH390:以太網(wǎng)控制器芯片

庫(kù)的初始化CH375LibInit過(guò)不了,說(shuō)明你的硬件上還存在問(wèn)題。你在程序上來(lái)之后,先不調(diào)用這個(gè)庫(kù)的初始化函數(shù),先用測(cè)試命令CHECK_EXIST測(cè)試一下硬件連接。你可以先用示波器看一下晶振是不是起振了,375是不是正常復(fù)位了(測(cè)375的25腳、26腳,正常復(fù)位的話,25腳應(yīng)該為低電平,26腳應(yīng)該為高電平)。


那你在庫(kù)初始化之前做下測(cè)試,發(fā)測(cè)試命令,寫(xiě)一個(gè)數(shù)據(jù)進(jìn)去,然后讀出來(lái)看是不是原數(shù)據(jù)的取反.


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

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