logo

ch374调用CH374FileOpen卡死是什么原因,急等。

CH374DiskSize已经可以正确读出容量大小,但调用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中断并更新中断状态,等待U盘插入 */
   if ( CH374DiskConnect( ) == ERR_SUCCESS ) break;  /* 有设备连接则返回成功,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 ) 有可能前两个数据相乘后导致溢出, 所以修改成上式
  

  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);
  
/* 产生新文件 */
  //printf( "Create\n" );                                 //串口创建时间会超长
  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( );                               /* 新建文件并打开,如果文件已经存在则先删除后再新建 */
  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;                   /* 指定本次写入的字节数,单次读写的长度不能超过MAX_BYTE_IO */
  i = CH374ByteWrite( );                                /* 以字节为单位向文件写入数据,单次读写的长度不能超过MAX_BYTE_IO */
  mStopIfError( i );
 
  //printf( "Close\n" );
  mCmdParam.Close.mUpdateLen = 1;                       /* 不要自动计算文件长度,如果自动计算,那么该长度总是CH374vSectorSize的倍数 */
  i = CH374FileClose( );
  mStopIfError( i );  
  
  //printf( "Take out\n" );
  while ( 1 ) {
   delay_ms( 10 );                                   /* 没必要频繁查询 */
   if ( CH374DiskConnect( ) != ERR_SUCCESS ) break;  /* 查询方式: 检查磁盘是否连接并更新磁盘状态,返回成功说明连接 */
  }
  delay_ms( 200 );  
  
  
 }

这人很懒,什么都没留下

是卡在mStopIfError( i )函数,还是卡在CH374FileOpen函数,如果是mStopIfError函数,看一下i的值。如果是CH374FileOpen函数,看下调用完此函数后,INT管脚是否有中断电平变化(使用INT检测的情况下)。


卡在CH374FileOpen函数,当时用的是金士顿2G U盘,后来换成T卡转的U盘就可以正常读写了,不知道是什么原因?是因为库文件只对部分U盘支持吗?可以推荐一下购买哪些型号的U盘吗?

这人很懒,什么都没留下

更可能是硬件设计上的原因,而不是软件或U盘兼容性的原因。金士顿还是相对主流的U盘。对硬件上,可以逐一检查下:

(1)若VCC是3.3V供电,V3引脚需要短接VCC,VCC管脚附件可多加点滤波电容。若VCC为5V供电,V3引脚需要接103退耦电容对地。

(2)对于U盘供电电源5V,可以单独给U盘外部供5V稳压电源,与主控板共地。如果尝试可行,可能怀疑是U盘供电不足,或电压波动等原因。

 


VCC与V3是短接的,两个引脚附近均接有100nF电容。目前读写文件不卡死了,但从U盘里读文件时每次返回都是0X42(U盘里确认有这个文件的),写一个文件但到电脑上读该文件是提示该文件打不开(写完后如果继续用CH374FileOpen打开,可以返回0x00)。

/* 读文件 ,电脑里已经创建该文件*/
  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;  /* 计数,减去当前实际已经读出的字符数 */
  
    /* 实际读出的字符数少于要求读出的字符数,说明已经到文件的结尾 */
    if (iReadCount < sizeof(ucaDataBuf))
    {
     break;
    }    
   }   
   /* 关闭文件 */
   ucErr = ch374_CloseFile();
   mStopIfError(ucErr);
   break;
  } 

/* 读写文件测试 */
  ucErr = ch374_OpenFile("/test.txt");
  if (ucErr == ERR_SUCCESS)
  {   
   /* 将新数据添加到文件尾部,可以移动文件指针,形参取 0xffffffff */
   ch374_SeekFile(0xffffffff);
   for(i = 0; i < 10; i++)
    ucaDataBuf[i] = 0x30+i;
   ucaDataBuf[10] = 0; 
   ucErr = ch374_WriteFile(ucaDataBuf, 10); /* 在文件末尾写入刚才读取的数据 */
   mStopIfError(ucErr);
   /* 关闭文件 */
   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;                   /* 指定本次写入的字节数,单次读写的长度不能超过MAX_BYTE_IO */
   ucErr = CH374ByteWrite( );                                /* 以字节为单位向文件写入数据,单次读写的长度不能超过MAX_BYTE_IO */
   mStopIfError( ucErr );
   /* 关闭文件 */
   mCmdParam.Close.mUpdateLen = 1;
   ucErr = CH374FileClose();
   mStopIfError(ucErr);
  }

这人很懒,什么都没留下

直接用ch374HFM.h中函数调用,结果是一样的,每次均返回0X42。
  /* 读文件 ,电脑里已经创建该文件*/
  //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;   
    /* 实际读出的字符数少于要求读出的字符数,说明已经到文件的结尾 */
    if (iReadCount < sizeof(ucaDataBuf))
    {
     break;
    }    
   }   
   /* 关闭文件 */
   ucErr = CH374FileClose();
   mStopIfError(ucErr);
   break;
  } 

这人很懒,什么都没留下

目前374S已经可以实现键盘和扫码枪功能,但U盘读写未搞定,还请版主多多指点。不知道是否有STM32F103+CH374S读写U盘的例程?

这人很懒,什么都没留下

文件名用大写。


用大写果然可以读取文件数据了,谢谢斑竹细心指导!

在终端程序上,涉及文件名、目录名都需要用大写吗?

这人很懒,什么都没留下

符合短文件名规范即可。大写字母数字组合,下划线等。8+3结构。


好,解决大问题了,非常感谢斑竹指导!

这人很懒,什么都没留下
只有登录才能回复,可以选择微信和github账号登录