//CH432 接收FIFO中斷先讀入idata,再存入dataBuf,扇區(qū)寫U盤不ok //注意定時器和波特率定時器的TMOD設(shè)置不要沖突。 #include #include #include #include //absacc.h是絕對地址映射。也就是你把外圍電路視作片外數(shù)據(jù)存儲器時,用這個定義它的地址。
/*【【【【============================CH375聲明================================】】】】*/ // 以下定義的詳細(xì)說明請看CH375HF6.H文件 // #define LIB_CFG_DISK_IO 2 //磁盤讀寫的數(shù)據(jù)的復(fù)制方式,1為"單DPTR復(fù)制",2為"雙DPTR復(fù)制",3為"單DPTR和P2+R0復(fù)制" */ #define LIB_CFG_FILE_IO 2 //文件讀寫的數(shù)據(jù)的復(fù)制方式,0為"外部子程序",1為"單DPTR復(fù)制",2為"雙DPTR復(fù)制",3為"單DPTR和P2+R0復(fù)制" */ #define LIB_CFG_INT_EN 0 //CH375的INT#引腳連接方式,0為"查詢方式",1為"中斷方式" *///網(wǎng)友:中斷方式和查詢方式,速度沒有太大的差別,因?yàn)閹斓牡讓右彩怯貌樵兎绞健? /*#define LIB_CFG_FILE_IO_DEFAULT 1*/ //使用CH375HF6.H提供的默認(rèn)"外部子程序" */ #define CH375_CMD_PORT_ADDR 0x3DF1 //CH375命令端口的I/O地址 */ #define CH375_DAT_PORT_ADDR 0x3CF0 //CH375數(shù)據(jù)端口的I/O地址 */ /*單片機(jī)引腳接線 P2.0 A0 P2.7 CS P3.2 INT P3.6 WR P3.7 RD P0.0~P0.7 D0~D7 */ /* 只使用單片機(jī)內(nèi)置的1KB外部RAM: 0000H-01FFH 為磁盤讀寫緩沖區(qū), 以字節(jié)為單位讀寫文件不需要文件數(shù)據(jù)讀寫緩沖區(qū)FILE_DATA_BUF */ #define DISK_BASE_BUF_ADDR 0x0100 //外部RAM的磁盤數(shù)據(jù)緩沖區(qū)的起始地址,從該單元開始的緩沖區(qū)長度為SECTOR_SIZE */ //下面這個一定義會出現(xiàn)"Too large sector size.",所以不要手動定義 #define DISK_BASE_BUF_LEN 512 //默認(rèn)的磁盤數(shù)據(jù)緩沖區(qū)大小為512字節(jié),建議選擇為2048甚至4096以支持某些大扇區(qū)的U盤,為0則禁止在.H文件中定義緩沖區(qū)并由應(yīng)用程序在pDISK_BASE_BUF中指定 */ /* 如果需要復(fù)用磁盤數(shù)據(jù)緩沖區(qū)以節(jié)約RAM,那么可將DISK_BASE_BUF_LEN定義為0以禁止在.H文件中定義緩沖區(qū),而由應(yīng)用程序在調(diào)用CH375Init之前將與其它程序合用的緩沖區(qū)起始地址置入pDISK_BASE_BUF變量 */ //#define FILE_DATA_BUF_ADDR 0x0500 //外部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 */ /*磁盤緩沖區(qū)用于分析U盤文件系統(tǒng),處理FAT和文件名等。文件緩沖區(qū)是可選的,但是為了提高速度,文件緩沖區(qū)FILE_DATA_BUF應(yīng)該有幾K到幾十K的大小?!? 在字節(jié)模式下完全不需要文件緩沖區(qū),使用下述的方法禁止文件緩沖區(qū):在主程序中不要定義常量 FILE_DATA_BUF_LEN,那么就不需要文件緩沖區(qū)。*/ #define CH375_INT_WIRE INT0 //P3.2, INT0, CH375的中斷線INT#引腳,連接CH375的INT#引腳,用于查詢中斷狀態(tài) */ //#define CH375_INT_NO 0 /* CH375中斷號, CH375的中斷線INT#引腳連接單片機(jī)的INT0引腳 */ //#define CH375_INT_FLAG IE0 /* IE0,CH375中斷標(biāo)志 */ //#define CH375_INT_EN EX0 /* EX0,CH375中斷允許 */
#define NO_DEFAULT_CH375_F_ENUM 1 /* 未調(diào)用CH375FileEnumer程序故禁止以節(jié)約代碼 *///★ #define NO_DEFAULT_CH375_F_QUERY 1 /* 未調(diào)用CH375FileQuery程序故禁止以節(jié)約代碼 */ //★
#include "CH375HF4.H" //如果不需要支持FAT32,那么請選用CH375HF4.H */
#define BUFNUM 512 #define BUFCOT 1 unsigned char xdata dataBuf[BUFNUM] _at_ 0x0300; //; //sbit P10=P1^0; //發(fā)送空中斷 //sbit P11=P1^1; //接收中斷 //sbit P12=P1^2; //超時中斷 //-------------------------子函數(shù)聲明----------------------// //void mDelay100mS(); UINT8 mCopyCodeStringToIRAM( UINT8 idata *iDestination, UINT8 code *iSource ); void mStopIfError( UINT8 iError );
UINT8 i,flag_WR;//由于main()和中斷函數(shù)中都要用到flag,所以需定義成全局變量 //flag==1時,把word寫入U盤 unsigned int tt,RcvNum;//min,sec; //不要寫成int //=================================CH375聲明 END==========================================// /*【【【【================================CH432聲明===============================】】】】*/ #pragma NOAREGS #include "BASE.C" #include "PARA.C" // CH432與單片機(jī)的硬件接口層// 硬件標(biāo)準(zhǔn)8位并口方式子程序, CH432Q sbit P35=P3^5; //控制485發(fā)送/接收 (因?yàn)橛幸粋€板子上的432自動控制功能沒有實(shí)現(xiàn))
//#define CH432_BPS 19200 // 定義CH432串口0通訊波特率 // #define CH432_BPS1 1382400 // 定義CH432串口1通訊波特率 ////11.0592M下最高波特率1382400bps #define Fpclk 22118400 // 定義內(nèi)部時鐘頻率 // #define CH432_INT_WIRE INT1// P3.3 // #define CH432_INT0_WIRE INT1 // #define CH432_INT1_WIRE INT1
//UINT8 SEND_STRING[ ] = { "44444455" }; //UINT8 SEND_STRING1[ ] = { "33333" }; //UINT8 buf[8]={"ILoveYou"}; //=================================CH432聲明 END==========================================// void InitCH432( void ) // 初始化CH432 // { UINT16 div; UINT8 DLL, DLM; //**********************設(shè)置CH432串口1的寄存器*************************// div = ( Fpclk >> 4 ) / CH432_BPS1; DLM = div >> 8; DLL = div & 0xff; WriteCH432Data( CH432_LCR1_PORT, BIT_LCR_DLAB ); // 設(shè)置DLAB為1 // WriteCH432Data( CH432_DLL1_PORT, DLL ); // 設(shè)置波特率 // //Status = ReadCH432Data( CH432_DLL1_PORT ); WriteCH432Data( CH432_DLM1_PORT, DLM ); WriteCH432Data( CH432_FCR1_PORT, BIT_FCR_RECVTG1 | BIT_FCR_FIFOEN ); // 設(shè)置FIFO模式,觸發(fā)點(diǎn)為14 // WriteCH432Data( CH432_LCR1_PORT, BIT_LCR_PAREN | BIT_LCR_WORDSZ1| BIT_LCR_WORDSZ0 ); // 字長8位,1位停止位、奇校驗(yàn) // WriteCH432Data( CH432_IER1_PORT, BIT_IER_IERECV | BIT_IER1_CK2X); // 使能中斷 // WriteCH432Data( CH432_IER_PORT,BIT_IER_LOWPOWER);//關(guān)串口0 WriteCH432Data( CH432_MCR1_PORT, BIT_MCR_OUT2 | BIT_MCR_RTS | BIT_MCR_DTR ); // 中斷方式下這個必須開,允許中斷輸出,DTR,RTS為1 // } /* void UART1_SendByte( UINT8 dat ) // CH432串口1發(fā)送一字節(jié)子程序 // { P35=1;//控制485收發(fā)。0時接收,1時發(fā)送 while( ( ReadCH432Data( CH432_LSR1_PORT ) & BIT_LSR_THRE ) == 0 ); // 等待數(shù)據(jù)發(fā)送完畢 // WriteCH432Data( CH432_THR1_PORT, dat ); }*/
/*UINT8 UART1_RcvByte() // CH432串口1接收一字節(jié)子程序 // { UINT8 Rcvdat; //P35=0;//控制485收發(fā)。0時接收,1時發(fā)送 if( !( ReadCH432Data( CH432_LSR1_PORT ) & (BIT_LSR_BREAKINT | BIT_LSR_FRAMEERR | BIT_LSR_PARERR | BIT_LSR_OVERR ) ) ) // b1-b4無錯誤 // { while( ( ReadCH432Data( CH432_LSR1_PORT ) & BIT_LSR_DATARDY ) == 0 ); // 等待數(shù)據(jù)準(zhǔn)備好 // Rcvdat = ReadCH432Data( CH432_RBR1_PORT ); // 從接收緩沖寄存器讀出數(shù)據(jù) // return( Rcvdat ); } else ReadCH432Data( CH432_RBR1_PORT ); // b1-b4有錯誤清除 // }*/ /* void UART1_SendStr( UINT8 *str ) // CH432串口1發(fā)送一字符串子程序 // { while(1) { if( *str == '\0' ) break; UART1_SendByte( *str++ ); } }*/ /* void CH432Seril1Send( UINT8 *Data, UINT8 Num ) // 禁用FIFO,CH432串口1發(fā)送多字節(jié)子程序 // { do { while( ( ReadCH432Data( CH432_LSR1_PORT ) & BIT_LSR_THRE ) == 0 ); // 等待數(shù)據(jù)發(fā)送完畢 // WriteCH432Data( CH432_THR1_PORT, *Data++ ); } while( --Num ); } */ /*UINT8 CH432Seril1Rcv( UINT8 *buf ) // 禁用FIFO,CH432串口1接收多字節(jié)子程序// { UINT8 RcvNum = 0; if( !( ReadCH432Data( CH432_LSR1_PORT ) & ( BIT_LSR_BREAKINT | BIT_LSR_FRAMEERR | BIT_LSR_PARERR | BIT_LSR_OVERR ) ) ) // b1-b4無錯誤 // { while( ( ReadCH432Data( CH432_LSR1_PORT ) & BIT_LSR_DATARDY ) == 0 ); // 等待數(shù)據(jù)準(zhǔn)備好// do { *buf++ = ReadCH432Data( CH432_RBR1_PORT ); // 從接收緩沖寄存器讀出數(shù)據(jù) // RcvNum++; } while( ( ReadCH432Data( CH432_LSR1_PORT ) & BIT_LSR_DATARDY ) == 0x01 ); //CH432_LSR1_PORT:CH432線路狀態(tài)寄存器1。BIT_LSR_DATARDY該位為1表示