我的目標(biāo)是U盤讀寫
環(huán)境參數(shù): 51單片機(jī) STC11F32XE:32K flash,1280 on-chip RAM,接12M晶振 CH375B芯片:接12M晶振,交叉串口方式相連,INT#接P3.2; 采用文件級子程序CH375HF5.LIB,F(xiàn)ILELIB5/EXAM7示例程序為原型。
問題描述: 使用9600波特率(單片機(jī)12M晶振的誤差為7%,與PC通訊測試有數(shù)據(jù)差錯),執(zhí)行CH375LibInit()中的CH375Init()函數(shù),卡住沒有返回值。 進(jìn)而試用4800波特率(單片機(jī)12M晶振下串口測試無數(shù)據(jù)差錯),如下: 先在單片機(jī)9600下發(fā)出更改ch375波特率的命令: xWriteCH375Cmd(CMD_SET_BAUDRATE); //02H xWriteCH375Data(0x02); //4800波特率的分頻系數(shù) xWriteCH375Data(0x64); //4800波特率的分頻常數(shù)=256-750000/4800=99.75=100=64H 延時后,更改單片機(jī)波特率為4800,執(zhí)行CH375LibInit(),依然在CH375Init()卡住。
求指正,求解決方法!
關(guān)鍵程序如下:(省略部分皆依EXAM7示例程序中默認(rèn)設(shè)置)
/*---------CH375HFT2.C-----------*/ //CH375HFT2.C文件是在EXAM7的CH375HFT.C基礎(chǔ)上改的 #include #include
#define MAX_BYTE_IO 16 #define LIB_CFG_FILE_IO 1 #define LIB_CFG_INT_EN 0
#define DISK_BASE_BUF_ADDR 0x0000 #define FILE_DATA_BUF_ADDR 0x0000
#define FILE_DATA_BUF_LEN 0x0200
#define CH375_INT_WIRE INT0
#define NO_DEFAULT_CH375_F_ENUM 1 #define NO_DEFAULT_CH375_F_QUERY 1
#include "CH375HF5.H" #include "ST7920.H" //個人調(diào)試所加,為了在lcd上顯示
void mDelay1_2uS( ) /* 至少延時1.2uS,根據(jù)單片機(jī)主頻調(diào)整 */ { return; }
// 如果單片機(jī)與CH375是串口連接,那么參考下面的子程序 void CH375_PORT_INIT( ) { SCON = 0xD0; // 設(shè)置串口為9位數(shù)據(jù) //設(shè)置波特率和其它串口參數(shù) TMOD = 0x20; //timer 1, mode 2, 8-bits reload TH1 = 0xFD; //Baund: 9600bps 12M晶振(借用了11.0592M的初值) TL1 = 0xFD; PCON = 0x00; //波特率加倍控制:不加倍 TR1 = 1; //timer1 run
}
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 ); } //
/* 延時100毫秒,不精確 */ void mDelay100mS( ) { UINT8 i, j, c; for ( i = 200; i != 0; i -- ) for ( j = 200; j != 0; j -- ) c+=3; }
/* 將程序空間的字符串復(fù)制到內(nèi)部RAM中,返回字符串長度 */ UINT8 mCopyCodeStringToIRAM( UINT8 idata *iDestination, UINT8 code *iSource ) { UINT8 i = 0; while ( *iDestination = *iSource ) { iDestination ++; iSource ++; i ++; } return( i ); }
/* 檢查操作狀態(tài),如果錯誤則顯示錯誤代碼并停機(jī) */ void mStopIfError( UINT8 iError ) { if ( iError == ERR_SUCCESS ) { RefreshCurChDisp(3,6,55); //lcd顯示調(diào)試信息 return; /* 操作成功 */ }
RefreshCurChDisp(3,7,99); //lcd顯示調(diào)試信息 while ( 1 ) { } }
void Func375() { uchar ret;
RefreshCurChDisp(0,1,2); //lcd顯示調(diào)試信息 ret = CH375LibInit( ); /* 初始化CH375程序庫和CH375芯片,操作成功返回0 */ RefreshCurChDisp(0,2,3); //lcd顯示調(diào)試信息 mStopIfError( ret ); RefreshCurChDisp(0,3,4); //lcd顯示調(diào)試信息 }
void main() { SP = 0x5f; //lcd顯示初始 P4SW = 0x70; //單片機(jī)自己的IO口設(shè)置 init_lcd(); //lcd顯示初始
CH375_PORT_INIT( ); mDelay100mS( ); /* 延時100毫秒 */
//更改CH375的波特率 xWriteCH375Cmd(CMD_SET_BAUDRATE); //02H xWriteCH375Data(0x02); //4800波特率的分頻系數(shù) xWriteCH375Data(0x64); //4800波特率的分頻常數(shù)=256-750000/4800=99.75=100=64H TR1 = 0; TH1 = 0xF3; //設(shè)波特率為4800 TL1 = 0xF3; TR1 = 1;
mDelay100mS( ); /* 延時100毫秒 */
Func375();
while(1) {} }