ch374調(diào)用CH374FileOpen卡死是什么原因,急等。

CH374DiskSize已經(jīng)可以正確讀出容量大小,但調(diào)用CH374FileOpen會卡死,不知道什么原因,LIB的版本號是0X19。MCU用的是STM32F103VE6。

?

int main()
{
?u32 isize = 0;
?u8 i;
?uart_init(115200);
?//printf("start\n");
?delay_init();
?LED_Init( LED0 | LED1 | LED2 | LED3 );
?NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);?
???
?CH374_Init();
?i = CH374LibInit( );????????????????????????????????????? /* 初始化CH375程序庫和CH375芯片,操作成功返回0 */
?mStopIfError( i );?
?
?while(1)
?{
??//printf( "Wait Udisk\n" );
??while ( CH374DiskStatus < DISK_CONNECT ) {??????????? /* 查詢CH375中斷并更新中斷狀態(tài),等待U盤插入 */
???if ( CH374DiskConnect( ) == ERR_SUCCESS ) break;? /* 有設(shè)備連接則返回成功,CH375DiskConnect同時會更新全局變量CH375DiskStatus */
???delay_ms( 100 );
??}
??delay_ms(200);
??
??//printf("Disk Init\n");
??for ( i = 0; i < 5; i ++ ) {????????????????????????? /* 有的U盤總是返回未準備好,不過可以被忽略 */
???delay_ms( 100 );
???printf( "Ready ?\n" );
???if ( CH374DiskReady( ) == ERR_SUCCESS ) break;??? /* 查詢磁盤是否準備好 */
??}
??
/* 查詢磁盤物理容量 */
??//printf( "DiskSize\n" );
??i = CH374DiskSize( );?
??mStopIfError( i );
??isize = mCmdParam.DiskSize.mDiskSizeSec * (CH374vSectorSize/512) / 2048;
???printf( "size = %d\n" ,isize);
??//printf( "TotalSize = %u MB \n", (unsigned int)( mCmdParam.DiskSize.mDiskSizeSec * (CH374vSectorSize/512) / 2048 ) );? // 顯示為以MB為單位的容量
??// 原計算方法 (unsigned int)( mCmdParam.DiskSize.mDiskSizeSec * CH374vSectorSize / 1000000 ) 有可能前兩個數(shù)據(jù)相乘后導(dǎo)致溢出, 所以修改成上式
??

??mCmdParam.Open.mPathName[0] = '/';
??mCmdParam.Open.mPathName[1] = '1';
??mCmdParam.Open.mPathName[2] = '.';
??mCmdParam.Open.mPathName[3] = 'C';
??mCmdParam.Open.mPathName[4] = 0;

??i = CH374FileOpen();
??mStopIfError( i );
??CH374FileReadX();
??printf( "size = %d\n" ,mCmdParam.ByteRead.mByteCount);
??
/* 產(chǎn)生新文件 */
??//printf( "Create\n" );???????????????????????????????? //串口創(chuàng)建時間會超長
??mCmdParam.Create.mPathName[0] = '/';
??mCmdParam.Create.mPathName[1] = '1';
??mCmdParam.Create.mPathName[2] = '.';
??mCmdParam.Create.mPathName[3] = 'C';
??mCmdParam.Create.mPathName[4] = 0;
??i = CH374FileCreate( );?????????????????????????????? /* 新建文件并打開,如果文件已經(jīng)存在則先刪除后再新建 */
??mStopIfError( i );

??printf( "Write some data to file 1.C \n" );
??mCmdParam.ByteWrite.mByteBuffer[0] = 'a';
??mCmdParam.ByteWrite.mByteBuffer[1] = 'b';
??mCmdParam.ByteWrite.mByteBuffer[2] = 'c';
??mCmdParam.ByteWrite.mByteBuffer[3] = 'd';
??mCmdParam.ByteWrite.mByteBuffer[4] = 'e';
??
??mCmdParam.ByteWrite.mByteCount = 5;?????????????????? /* 指定本次寫入的字節(jié)數(shù),單次讀寫的長度不能超過MAX_BYTE_IO */
??i = CH374ByteWrite( );??????????????????????????????? /* 以字節(jié)為單位向文件寫入數(shù)據(jù),單次讀寫的長度不能超過MAX_BYTE_IO */
??mStopIfError( i );
?
??//printf( "Close\n" );
??mCmdParam.Close.mUpdateLen = 1;?????????????????????? /* 不要自動計算文件長度,如果自動計算,那么該長度總是CH374vSectorSize的倍數(shù) */
??i = CH374FileClose( );
??mStopIfError( i );??
??
??//printf( "Take out\n" );
??while ( 1 ) {
???delay_ms( 10 );?????????????????????????????????? /* 沒必要頻繁查詢 */
???if ( CH374DiskConnect( ) != ERR_SUCCESS ) break;? /* 查詢方式: 檢查磁盤是否連接并更新磁盤狀態(tài),返回成功說明連接 */
??}
??delay_ms( 200 );??
??
??
?}

是卡在mStopIfError( i )函數(shù),還是卡在CH374FileOpen函數(shù),如果是mStopIfError函數(shù),看一下i的值。如果是CH374FileOpen函數(shù),看下調(diào)用完此函數(shù)后,INT管腳是否有中斷電平變化(使用INT檢測的情況下)。


卡在CH374FileOpen函數(shù),當時用的是金士頓2G U盤,后來換成T卡轉(zhuǎn)的U盤就可以正常讀寫了,不知道是什么原因?是因為庫文件只對部分U盤支持嗎?可以推薦一下購買哪些型號的U盤嗎?


更可能是硬件設(shè)計上的原因,而不是軟件或U盤兼容性的原因。金士頓還是相對主流的U盤。對硬件上,可以逐一檢查下:

(1)若VCC是3.3V供電,V3引腳需要短接VCC,VCC管腳附件可多加點濾波電容。若VCC為5V供電,V3引腳需要接103退耦電容對地。

(2)對于U盤供電電源5V,可以單獨給U盤外部供5V穩(wěn)壓電源,與主控板共地。如果嘗試可行,可能懷疑是U盤供電不足,或電壓波動等原因。

?


VCC與V3是短接的,兩個引腳附近均接有100nF電容。目前讀寫文件不卡死了,但從U盤里讀文件時每次返回都是0X42(U盤里確認有這個文件的),寫一個文件但到電腦上讀該文件是提示該文件打不開(寫完后如果繼續(xù)用CH374FileOpen打開,可以返回0x00)。

/* 讀文件 ,電腦里已經(jīng)創(chuàng)建該文件*/
??ucErr = ch374_OpenFile("/123.txt");
??if (ucErr == ERR_SUCCESS)
??{?
???iReadCount = sizeof(ucaDataBuf);
???while(uiTotalCount == sizeof(ucaDataBuf))
???{?
????ucErr = ch374_ReadFile(ucaDataBuf, sizeof(ucaDataBuf), &iReadCount);
????mStopIfError(ucErr);
????Flash_Write( addr, ucaDataBuf, iReadCount? );????
????addr += iReadCount;?
????
????uiTotalCount -= iReadCount;? /* 計數(shù),減去當前實際已經(jīng)讀出的字符數(shù) */
??
????/* 實際讀出的字符數(shù)少于要求讀出的字符數(shù),說明已經(jīng)到文件的結(jié)尾 */
????if (iReadCount < sizeof(ucaDataBuf))
????{
?????break;
????}????
???}???
???/* 關(guān)閉文件 */
???ucErr = ch374_CloseFile();
???mStopIfError(ucErr);
???break;
??}?

/* 讀寫文件測試 */
??ucErr = ch374_OpenFile("/test.txt");
??if (ucErr == ERR_SUCCESS)
??{? ?
???/* 將新數(shù)據(jù)添加到文件尾部,可以移動文件指針,形參取 0xffffffff */
???ch374_SeekFile(0xffffffff);
???for(i = 0; i < 10; i++)
????ucaDataBuf[i] = 0x30+i;
???ucaDataBuf[10] = 0;?
???ucErr = ch374_WriteFile(ucaDataBuf, 10);?/* 在文件末尾寫入剛才讀取的數(shù)據(jù) */
???mStopIfError(ucErr);
???/* 關(guān)閉文件 */
???ucErr = ch374_CloseFile();
???mStopIfError(ucErr);
??}
??else
??{
???ucErr = ch374_CreateFile("/test.txt");
???mStopIfError(ucErr);
???for(i = 0; i < 10; i++)
????mCmdParam.ByteWrite.mByteBuffer[i] = 0x30+i;
???mCmdParam.ByteWrite.mByteBuffer[10] = 0;??
???mCmdParam.ByteWrite.mByteCount = 10;?????????????????? /* 指定本次寫入的字節(jié)數(shù),單次讀寫的長度不能超過MAX_BYTE_IO */
???ucErr = CH374ByteWrite( );??????????????????????????????? /* 以字節(jié)為單位向文件寫入數(shù)據(jù),單次讀寫的長度不能超過MAX_BYTE_IO */
???mStopIfError( ucErr );
???/* 關(guān)閉文件 */
???mCmdParam.Close.mUpdateLen = 1;
???ucErr = CH374FileClose();
???mStopIfError(ucErr);
??}


直接用ch374HFM.h中函數(shù)調(diào)用,結(jié)果是一樣的,每次均返回0X42。
??/* 讀文件 ,電腦里已經(jīng)創(chuàng)建該文件*/
??//strcpy((char *)mCmdParam.Open.mPathName, (char *)"/123.txt");
??mCmdParam.Open.mPathName[0] = '/';
??mCmdParam.Open.mPathName[1] = '1';
??mCmdParam.Open.mPathName[2] = '2';
??mCmdParam.Open.mPathName[3] = '3';
??mCmdParam.Open.mPathName[4] = '.';
??mCmdParam.Open.mPathName[5] = 't';
??mCmdParam.Open.mPathName[6] = 'x';
??mCmdParam.Open.mPathName[7] = 't';
??mCmdParam.Open.mPathName[8] = 0;
??ucErr = CH374FileOpen();
??if (ucErr == ERR_SUCCESS)
??{?
???iReadCount = sizeof(ucaDataBuf);
???while(uiTotalCount == sizeof(ucaDataBuf))
???{?
????ucErr = ch374_ReadFile(ucaDataBuf, sizeof(ucaDataBuf), &iReadCount);
????mStopIfError(ucErr);
????Flash_Write( addr, ucaDataBuf, iReadCount? );????
????addr += iReadCount;???
????/* 實際讀出的字符數(shù)少于要求讀出的字符數(shù),說明已經(jīng)到文件的結(jié)尾 */
????if (iReadCount < sizeof(ucaDataBuf))
????{
?????break;
????}????
???}???
???/* 關(guān)閉文件 */
???ucErr = CH374FileClose();
???mStopIfError(ucErr);
???break;
??}?


目前374S已經(jīng)可以實現(xiàn)鍵盤和掃碼槍功能,但U盤讀寫未搞定,還請版主多多指點。不知道是否有STM32F103+CH374S讀寫U盤的例程?


文件名用大寫。


用大寫果然可以讀取文件數(shù)據(jù)了,謝謝斑竹細心指導(dǎo)!

在終端程序上,涉及文件名、目錄名都需要用大寫嗎?


符合短文件名規(guī)范即可。大寫字母數(shù)字組合,下劃線等。8+3結(jié)構(gòu)。


好,解決大問題了,非常感謝斑竹指導(dǎo)!


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

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