1.在我發(fā)送命令0AH和數(shù)據(jù)38H后,返回的是0x00,請(qǐng)問(wèn)在、返回的這個(gè)最大邏輯單元號(hào)正確嗎? 2.在我發(fā)送命令28H后,會(huì)去讀數(shù)據(jù),但為什么只能讀出數(shù)據(jù)長(zhǎng)度,得到的數(shù)據(jù)長(zhǎng)度是0x40,第二次讀就一直等待? 請(qǐng)幫幫忙!困擾我一天了,謝謝![Emot]1[/Emot][Emot]1[/Emot]
(1)如果這個(gè)設(shè)備只有一個(gè)邏輯單元的話,那么返回值是正確的 (2)能讀取到長(zhǎng)度之后,數(shù)據(jù)就已經(jīng)在CH375芯片內(nèi)部了,不需等待的,你的程序怎么寫的
1.請(qǐng)教一下邏輯單元怎么知道是多少? 2.讀取了數(shù)據(jù)長(zhǎng)度,下面不是要把數(shù)據(jù)從375讀出嗎?它是在讀第一個(gè)數(shù)據(jù)時(shí)就開始等待了!我用的是你們的庫(kù)函數(shù),程序我也改不了??!
觀察主控芯片的UART狀態(tài)寄存器發(fā)現(xiàn):不時(shí)的會(huì)出現(xiàn)幀錯(cuò)誤,溢出錯(cuò)誤。是不是我的串口通信有問(wèn)題???
(1)就是通過(guò)0AH命令來(lái)獲取的 (2)用了什么庫(kù)?如果是庫(kù)的話,不需要你去發(fā)讀命令的 (3)讀命令成功后,CH375會(huì)主動(dòng)發(fā)送數(shù)據(jù),如果沒(méi)有及時(shí)去取,是會(huì)溢出的,把375的三個(gè)接口函數(shù)貼出來(lái)看看
void xWriteCH375Cmd( uint8 mCmd ) { uint32 i=1; UART1_SendByte(mCmd); for(i=0;i<25;i++) delay2us();
}
void xWriteCH375Data( uint8 mData ) { //uint32 i=1; UART1_SendByte(mData); delay2us();
}
uint8 xReadCH375Data( void ) { uint8 xd; xd = UART1_GetByte(); //讀取XD0~7 delay2us(); return xd; }
這是主函數(shù),在執(zhí)行i = CH375FileCreate( ); 時(shí)這條指令出會(huì)讀數(shù)據(jù),但讀不出來(lái)! int main (void) { UINT8 i, c; UINT8 *pCodeStr; //for(i=0;i<5;i++) mDelaymS( 100 ); /* 延時(shí)100毫秒 */ gpio_init(); //IO初始化 mDelaymS( 100 ); /* 延時(shí)100毫秒 */ i = CH375LibInit( ); /* 初始化CH375程序庫(kù)和CH375芯片,操作成功返回0 */ mStopIfError( i ); while ( 1 ) { while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( ); /* 查詢CH375中斷并更新中斷狀態(tài),等待U盤插入 */ mDelaymS( 200 ); /* 延時(shí),可選操作,有的USB存儲(chǔ)器需要幾十毫秒的延時(shí) */
for ( i = 0; i < 10; i ++ ) { /* 有的U盤總是返回未準(zhǔn)備好,不過(guò)可以被忽略 */ mDelaymS( 100 ); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查詢磁盤是否準(zhǔn)備好 */ }
#ifdef EN_DISK_WRITE /* 子程序庫(kù)支持寫操作 */ /* 產(chǎn)生新文件 */ strcpy( (char *)mCmdParam.Create.mPathName, "/NEWFILE.TXT" ); /* 新文件名,在根目錄下,中文文件名 */ i = CH375FileCreate( ); /* 新建文件并打開,如果文件已經(jīng)存在則先刪除后再新建 */ mStopIfError( i ); pCodeStr = (UINT8 *)"Note: \xd\xa這個(gè)程序是以字節(jié)為單位進(jìn)行U盤文件讀寫,單片機(jī)只需要有600字節(jié)的RAM\xd\xa"; while( 1 ) { /* 分多次寫入文件數(shù)據(jù) */ for ( i=0; i { c = *pCodeStr; mCmdParam.ByteWrite.mByteBuffer[i] = c; if ( c == 0 ) break; /* 源字符串結(jié)束 */ pCodeStr++; } if ( i == 0 ) break; /* 源字符串結(jié)束,完成寫文件 */ mCmdParam.ByteWrite.mByteCount = i; /* 寫入數(shù)據(jù)的字符數(shù),單次讀寫的長(zhǎng)度不能超過(guò)MAX_BYTE_IO,第二次調(diào)用時(shí)接著剛才的向后寫 */ i = CH375ByteWrite( ); /* 向文件寫入數(shù)據(jù) */ mStopIfError( i ); }
mCmdParam.Close.mUpdateLen = 1; /* 自動(dòng)計(jì)算文件長(zhǎng)度,以字節(jié)為單位寫文件,建議讓程序庫(kù)關(guān)閉文件以便自動(dòng)更新文件長(zhǎng)度 */ i = CH375FileClose( ); mStopIfError( i );
#endif
while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( ); /* 查詢CH375中斷并更新中斷狀態(tài),等待U盤拔出 */ mDelaymS( 200 ); } return 0; }
CH375DiskReady( ) 返回值是0 ,應(yīng)該說(shuō)明可以對(duì)u盤進(jìn)行讀寫了吧,為什么不行呢,補(bǔ)充一下我用的庫(kù)文件是375庫(kù)文件中arm32里的CH375HF9.LIB,大俠幫忙分析一下!謝謝了!
CH375DiskReady通過(guò)說(shuō)明可以讀寫U盤了,你的意思是不是FileCreate始終不退出么? (1)建議測(cè)試一下磁盤緩沖區(qū)DISK_BASE_BUF,先寫入數(shù)據(jù),再讀出,比對(duì)是否相同 (2)三個(gè)接口函數(shù)中的延時(shí)要求精確點(diǎn),命令后延時(shí)1.5uS,數(shù)據(jù)后延時(shí)0.6uS
在執(zhí)行i = CH375FileCreate( )后返回0x82!但是ACT#顯示u盤還在連接狀態(tài),燈是亮的! 命令后延時(shí)1.5us的話,375初始化都不成功!不知道為什么,加大延時(shí)到50us才可以! 我先測(cè)試一下磁盤緩沖區(qū),非常感謝 SCM!
SCM,對(duì)DISK_BASE_BUF的寫和讀都是對(duì)的,執(zhí)行到FileCreate()以后還是返回0x82,無(wú)語(yǔ)了!在論壇里看到好像這個(gè)問(wèn)題一直沒(méi)有解決啊?。?/p>
那估計(jì)你的三個(gè)讀寫子函數(shù)還是有點(diǎn)有問(wèn)題,如果工作在串口方式下的話,寫命令是需要位9位1的,還有就是三個(gè)讀寫子函數(shù)是不需要延時(shí)的
void xWriteCH375Cmd( uint8 mCmd ) { uint32 i=1; UART1_SendByte(mCmd); for(i=0;i<25;i++) delay2us();
}
對(duì)于這個(gè)函數(shù)我要怎么修改才能發(fā)送第九位呢?UART1_SendByte(mCmd);只能發(fā)送8位?
這個(gè)需要去看該單片機(jī)的串口配置
我用的是lpc2138芯片,附件有它的寄存器說(shuō)明,寄存器最多只能配置數(shù)據(jù)位8位,還有沒(méi)有其他的方法呢?
可以用奇偶校驗(yàn)位來(lái)判斷啊,發(fā)送命令的時(shí)候奇偶校驗(yàn)位強(qiáng)制為1,發(fā)送數(shù)據(jù)的時(shí)候奇偶校驗(yàn)位強(qiáng)制為0,首先要把串口設(shè)置成帶有奇偶校驗(yàn)位模式.