電路圖是按照資料提供的串口模式連接直接接MCU,5V供電,現(xiàn)在問(wèn)題是確認(rèn)硬件連接無(wú)誤,不插U盤(pán)時(shí)ACT#為高,INT#也為高,RST為低,RST#為高,TXD為5V,RXD為3.75,晶振2.2V左右用示波器測(cè)得振蕩波形正常,但查了U盤(pán)后,U盤(pán)里面的燈閃爍很正常,但是,ACT#還是為高,INT#也為高,RST還是為低,RST#為高,用KEIL4編譯,程序總是在unsigned char xReadCH375Data( void ) { while ( RI0 == 0 );//每次都卡在這,等待UART0接受中斷 RI0 = 0; return( SBUF0 ); } 程序用的FILELIB5里面的CH375HF5.LIB和CH375HF5.H及EXAM7里面的CH375HFT.C,只是將并口的讀寫(xiě)屏蔽了用的串口的讀寫(xiě),然后寫(xiě)了串口初始化程序,同時(shí)添加了C8051F060初始化的幾個(gè)函數(shù),如下 /* CH375 主機(jī)文件系統(tǒng)接口 */ /* 支持: FAT12/FAT16/FAT32 */
/* MCS-51單片機(jī)C語(yǔ)言的U盤(pán)文件讀寫(xiě)示例程序 */ /* 用于以下情況的MCS51單片機(jī) 1. 高速M(fèi)CS51單片機(jī),機(jī)器周期小于0.3uS,或者在機(jī)器周期為12個(gè)時(shí)鐘時(shí)的時(shí)鐘頻率大于40MHz 2. 非總線MCS51單片機(jī),用普通I/O引腳模擬8位并行總線讀寫(xiě),與CH375之間采用并口連接 3. 單片機(jī)與CH375之間采用串口連接 */ /* 本程序用于演示將ADC模數(shù)采集的數(shù)據(jù)保存到U盤(pán)文件MY_ADC.TXT中 */ /* CH375的INT#引腳采用查詢方式處理,本例用普通I/O引腳模擬8位并行總線讀寫(xiě),同時(shí)提供串口連接示例, 以字節(jié)為單位讀寫(xiě)U盤(pán)文件,讀寫(xiě)速度較扇區(qū)模式慢,但是由于字節(jié)模式讀寫(xiě)文件不需要文件數(shù)據(jù)緩沖區(qū)FILE_DATA_BUF, 所以總共只需要600字節(jié)的RAM,適用于單片機(jī)硬件資源有限、數(shù)據(jù)量小并且讀寫(xiě)速度要求不高的系統(tǒng) */
#include #include #include "CH375HF5.H" #define BAUDRATE 9600 // UART波特率bps #define SYSCLK 22118400 // System clock frequency in Hz
#define MAX_BYTE_IO 35 /* 以字節(jié)為單位單次讀寫(xiě)文件時(shí)的最大長(zhǎng)度,默認(rèn)值是29,值大則占用內(nèi)存多,值小則超過(guò)該長(zhǎng)度必須分多次讀寫(xiě) */
/* 以下定義的詳細(xì)說(shuō)明請(qǐng)看CH375HF5.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為"中斷方式" */ /*#define LIB_CFG_UPD_SIZE 1*/ /* 在添加數(shù)據(jù)后是否自動(dòng)更新文件長(zhǎng)度: 0為"不更新",1為"自動(dòng)更新" */ /* 默認(rèn)情況下,如果扇區(qū)數(shù)/字節(jié)數(shù)不為0那么CH375FileWrite/CH375ByteWrite只負(fù)責(zé)寫(xiě)入數(shù)據(jù)而不修改文件長(zhǎng)度, 如果需要每次寫(xiě)完數(shù)據(jù)后會(huì)自動(dòng)修改/更新文件長(zhǎng)度,那么可以使全局變量CH375LibConfig的位4為1, 如果長(zhǎng)時(shí)間不寫(xiě)入數(shù)據(jù)則應(yīng)該更新文件長(zhǎng)度,防止突然斷電后前面寫(xiě)入的數(shù)據(jù)與文件長(zhǎng)度不相符, 如果確定不會(huì)突然斷電或者后面很快有數(shù)據(jù)不斷寫(xiě)入則不必更新文件長(zhǎng)度,可以提高速度并減少U盤(pán)損耗(U盤(pán)內(nèi)部的內(nèi)存壽命有限,不宜頻繁改寫(xiě)) */
/* 只使用單片機(jī)內(nèi)置的1KB外部RAM: 0000H-01FFH 為磁盤(pán)讀寫(xiě)緩沖區(qū), 以字節(jié)為單位讀寫(xiě)文件不需要文件數(shù)據(jù)讀寫(xiě)緩沖區(qū)FILE_DATA_BUF */ #define DISK_BASE_BUF_ADDR 0x0000 /* 外部RAM的磁盤(pán)數(shù)據(jù)緩沖區(qū)的起始地址,從該單元開(kāi)始的緩沖區(qū)長(zhǎng)度為SECTOR_SIZE */ #define DISK_BASE_BUF_LEN 2048 /* 默認(rèn)的磁盤(pán)數(shù)據(jù)緩沖區(qū)大小為512字節(jié),建議選擇為2048甚至4096以支持某些大扇區(qū)的U盤(pán),為0則禁止在.H文件中定義緩沖區(qū)并由應(yīng)用程序在pDISK_BASE_BUF中指定 */ #define FILE_DATA_BUF_ADDR 0x0000 /* 外部RAM的文件數(shù)據(jù)緩沖區(qū)的起始地址,緩沖區(qū)長(zhǎng)度不小于一次讀寫(xiě)的數(shù)據(jù)長(zhǎng)度,字節(jié)模式不用該緩沖區(qū) */ /* 由于單片機(jī)內(nèi)置的外部RAM只有1KB, 有些單片機(jī)還要去掉256字節(jié)內(nèi)部RAM, 只剩下768字節(jié)的外部RAM, 其中前512字節(jié)由CH375子程序用于磁盤(pán)數(shù)據(jù)緩沖 */ #define FILE_DATA_BUF_LEN 0x0800 /* 外部RAM的文件數(shù)據(jù)緩沖區(qū),緩沖區(qū)長(zhǎng)度不小于一次讀寫(xiě)的數(shù)據(jù)長(zhǎng)度,字節(jié)模式不用該緩沖區(qū) */
#define CH375_INT_WIRE P3^2 /* 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 "..\CH375HF5.H"
/* 在P1.4連接一個(gè)LED用于監(jiān)控演示程序的進(jìn)度,低電平LED亮,當(dāng)U盤(pán)插入后亮 */ 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盤(pán)操作時(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盤(pán)寫(xiě)操作時(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顯示 */
void SYSCLK_Init (void) { char old_SFRPAGE = SFRPAGE; int i; SFRPAGE = CONFIG_PAGE; // Switch to Configuration Page OSCXCN = 0x67; // start external oscillator with // 22.1184MHz crystal on TB for (i=0; i <5000; i++) ; // XTLVLD blanking interval (>1ms) while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle RSTSRC = 0x04; // enable missing clock detector reset CLKSEL = 0x01; // change to external crystal OSCICN = 0x00; // disable internal oscillator SFRPAGE = old_SFRPAGE; // restore SFRPAGE }
void Port_Init (void) { char old_SFRPAGE = SFRPAGE; SFRPAGE = CONFIG_PAGE; // Switch to configuration page XBR0 = 0x07; // Enable UART0 on crossbar XBR2 = 0x44; // Enable crossbar and weak pull-ups P1MDOUT |= 0xF0; // Set P1.4 P1.6 1.7(LED) to push-pull P3MDOUT =0x00; P7MDOUT =0xff; // Set P7 to push-pull SFRPAGE = old_SFRPAGE; // restore SFRPAGE } void EMIF_Init (void) { char SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page SFRPAGE = EMI0_PAGE; // Save SFR_PAGE EMI0CF = 0x00; // upper ports; non-muxed mode; 選擇內(nèi)部存儲(chǔ)器 // split mode w/o bank select EMI0TC = 0x45; // timing (7-cycle MOVX) SFRPAGE = CONFIG_PAGE; P3MDOUT =0x00; P4MDOUT |= 0xFF; // all EMIF pins configured as P5MDOUT |= 0xFF; // push-pull P6MDOUT |= 0xFF; P7MDOUT |= 0xFF;
SFRPAGE = SFRPAGE_SAVE; // restore SFR_PAGE } //----------------------------------------------------------------------------- // UART0 初始化 //----------------------------------------------------------------------------- // // 配置UART0 使用定時(shí)器1為波特率發(fā)生器 // /*void UART0_Init (void) { SCON0 = 0xD0; // SCON0: 模式9, 9 位UART, 使能RX //SCON0 = 0x50; // SCON0: 模式1, 8 位UART, 使能RX TMOD = 0x20; // TMOD: 定時(shí)器1, 模式2, 8 位重裝 TH1 = -(SYSCLK/BAUDRATE/16); // 根據(jù)波特率的值設(shè)定定時(shí)器1重裝值 TR1 = 1; // 啟動(dòng)定時(shí)器1 CKCON |= 0x10; // 定時(shí)器1使用系統(tǒng)時(shí)鐘作為時(shí)基 PCON |= 0x80; // SMOD00 = 1 TI0 = 1; // 表示TX0就緒 }*/ void T0_Wait_us (unsigned char us) { SFRPAGE = TIMER01_PAGE; TCON &= ~0x30; // 停止定時(shí)器T0并清除溢出標(biāo)志 TMOD &= ~0x0f; // 配置定時(shí)器T0為16位模式 TMOD |= 0x01; CKCON |= 0x08; // 定時(shí)器T0計(jì)數(shù)系統(tǒng)時(shí)鐘 while (us) { TR0 = 0; // Stop Timer0 TH0 = -(SYSCLK/1000000 >> 8); // Overflow in 1us TL0 = -(SYSCLK/1000000); TF0 = 0; // Clear overflow indicator TR0 = 1; // Start Timer0 while (!TF0); // Wait for overflow us--; // Update ms counter } TR0 = 0; } void T0_Wait_ms (unsigned char ms) { char SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page SFRPAGE = TIMER01_PAGE; TCON &= ~0x30; // Stop Timer0; Clear TF0 TMOD &= ~0x0f; // 16-bit free run mode TMOD |= 0x01; CKCON |= 0x08; // Timer0 counts SYSCLKs while (ms) { TR0 = 0; // Stop Timer0 TH0 = -(SYSCLK/1000 >> 8); // Overflow in 1ms