OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 15137|回复: 18

CH376初始化、读写U盘

[复制链接]

43

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1074
金钱
1074
注册时间
2012-1-10
在线时间
238 小时
发表于 2013-3-9 11:30:17 | 显示全部楼层 |阅读模式

    CH376_RST = 1;        /* 复位 */
    delay_ms( 20 );
    CH376_RST = 0;        /* 禁止复位 */
    delay_ms( 100 );        /* 延时100毫秒 */
    imInitCH376Host( ) ;   /* 初始化CH376 */



 /* 读写U盘 */
  if(CH376DiskConnect()==USB_INT_SUCCESS)/* 检查U盘是否连接,不支持SD卡 */
  {
   if(CH376DiskMount()==USB_INT_SUCCESS)/* 初始化磁盘并测试磁盘是否就绪 */
   {
/* 获取出厂信息 */
    i = CH376ReadBlock( buf );  /* 如果需要,可以读取数据块CH376_CMD_DATA.DiskMountInq,返回长度 */
    if ( i == sizeof( INQUIRY_DATA ) )  /* U盘的厂商和产品信息 */
    { 
     buf[ i ] = 0;
     printf( "UdiskInfo: %s\n", ((P_INQUIRY_DATA)buf) -> VendorIdStr );
    }
    printf( "DiskQuery: " );  /* 检查U盘或者SD卡的剩余空间 */
    s = CH376DiskQuery( (PUINT32)buf ); /* 查询磁盘剩余空间信息,扇区数 */
    printf("s=%02x \n",(unsigned short)s );
    printf( "free cap = %ld MB\n", *(PUINT32)buf / ( 1000000 / DEF_SECTOR_SIZE ) );
/* 创建 */
    printf( "Create file :" );
    strcpy( (char *)TarName, "\\ABC.TXT" ); /* 目标文件名 */
    s = CH376FileCreatePath( TarName );   /* 新建多级目录下的文件,支持多级目录路径,输入缓冲区必须在RAM中 */
    printf("s=%02x \n",(unsigned short)s );
/* 写入*/
    printf( "Write :" );
    strcpy((char *)buf, "测试成功1234567890" );
    s = CH376ByteWrite( buf, strlen((const char *)buf), NULL ); /* 以字节为单位向当前位置写入数据块 */
    printf("s=%02x \n",(unsigned short)s );
/* 关闭文件 */
    printf("close file " );
    s = CH376FileClose( TRUE );   /* 关闭文件,对于字节读写建议自动更新文件长度 */
    printf("s=%02x \n",(unsigned short)s );

   }
  }


完整工程http://www.openedv.com/posts/list/6006.htm

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

43

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1074
金钱
1074
注册时间
2012-1-10
在线时间
238 小时
 楼主| 发表于 2013-3-9 11:30:24 | 显示全部楼层
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-9 13:43:57 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

37

主题

140

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2013-6-4
在线时间
14 小时
发表于 2013-6-6 10:20:52 | 显示全部楼层
收了,最近正鼓捣这玩意,谢谢!
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2013-6-6 10:24:09 | 显示全部楼层
用这个芯片就可以使STM32变为USB HOST读取U盘了是么
回复 支持 反对

使用道具 举报

37

主题

140

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2013-6-4
在线时间
14 小时
发表于 2013-6-6 11:59:27 | 显示全部楼层
回复【5楼】wwjdwy:
---------------------------------
是的,就是这个目的。
回复 支持 反对

使用道具 举报

16

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2013-6-14
在线时间
8 小时
发表于 2014-2-24 16:47:16 | 显示全部楼层
求参考例程啊
回复 支持 反对

使用道具 举报

13

主题

314

帖子

0

精华

高级会员

Rank: 4

积分
713
金钱
713
注册时间
2012-7-20
在线时间
102 小时
发表于 2014-2-24 21:25:30 | 显示全部楼层
感谢分享了!
互联网,智能设备爱好者,欢迎讨论任何有意思的想法。
回复 支持 反对

使用道具 举报

16

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2013-6-14
在线时间
8 小时
发表于 2014-2-26 13:10:21 | 显示全部楼层
为什么我用这个工程写进tXT文件只有第一个字符
回复 支持 反对

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2016-3-3
在线时间
3 小时
发表于 2016-3-4 14:14:22 | 显示全部楼层
有没有实验扇区读写U盘的程序,我扇读U盘的时候,会出现部分数据丢失,还请指教,谢谢!
回复 支持 反对

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2016-3-3
在线时间
3 小时
发表于 2016-3-4 14:26:00 | 显示全部楼层
UINT16        total;               
UINT32        NewSize;       
UINT32        SIZE=0;       
UINT8        FileDataBuf[2048] __attribute__((at(0X68000000)));void        mFlushBufferToDisk( UINT8 force )
/* force = 0 自动刷新, force != 0 强制刷新*/
{
        UINT8        s;
        if ( force )
        {
                s = ( total + DEF_SECTOR_SIZE - 1 ) / DEF_SECTOR_SIZE;
                if ( s ) {
                        s = CH376SecWrite( FileDataBuf, s, NULL );  
                        //mStopIfError( s );
                        mDelaymS( 1 );
                        memcpy( FileDataBuf, & FileDataBuf[ total & ~ ( DEF_SECTOR_SIZE - 1 ) ], total & ( DEF_SECTOR_SIZE - 1 ) );  
                        total &= DEF_SECTOR_SIZE - 1;
                }
                NewSize = CH376GetFileSize( );
                if ( total ) NewSize -= DEF_SECTOR_SIZE - total;
                CH376WriteVar32( VAR_FILE_SIZE, NewSize );
                //printf( "Current file size is %ld\n", NewSize );
                s = CH376SecWrite( FileDataBuf, 0, NULL );
                //mStopIfError( s );
                s = CH376SecLocate( 0xFFFFFFFF );  
                //mStopIfError( s );
                s = CH376SecRead( FileDataBuf, 1, NULL );
        }
        else if ( total >= sizeof( FileDataBuf ) - DEF_SECTOR_SIZE )
                {  
                s = CH376SecWrite( FileDataBuf, (UINT8)( total / DEF_SECTOR_SIZE ), NULL );  
                //mStopIfError( s );
                memcpy( FileDataBuf, & FileDataBuf[ total & ~ ( DEF_SECTOR_SIZE - 1 ) ], total & ( DEF_SECTOR_SIZE - 1 ) );
                total &= DEF_SECTOR_SIZE - 1;
        }
}
下面是main()中的一段
while ( CH376DiskConnect( ) != USB_INT_SUCCESS )
{  
mDelaymS( 100 );
   }
           mDelaymS( 200 );
for ( i = 0; i < 100; i ++ )
{   
mDelaymS( 50 );
s = CH376DiskMount( );  
if ( s == USB_INT_SUCCESS )
break;                                          
else if ( s == ERR_DISK_DISCON )
break;  
if ( CH376GetDiskStatus( ) >= DEF_DISK_MOUNTED && i >= 5 )
break;
}         
if ( s == ERR_DISK_DISCON )
{  
while(1);
               //continue;
}       
if ( CH376GetDiskStatus( ) < DEF_DISK_MOUNTED )
{  
while(1);
}
i = CH376ReadBlock( buf );
if ( i == sizeof( INQUIRY_DATA ) )
{  
buf[ i ] = 0;
           sprintf(str, "%s", ((P_INQUIRY_DATA)buf) -> VendorIdStr );
}

s = CH376FileOpen( "/TEST.TXT" );
if ( s == USB_INT_SUCCESS )
{
NewSize = CH376GetFileSize( );
                        s = CH376SecLocate( 0xFFFFFFFF );
total = NewSize & ( DEF_SECTOR_SIZE - 1 );
if ( total )
{
s = CH376SecRead( FileDataBuf, 1, NULL );
s = CH376SecLocate( 0xFFFFFFFF );
}
}
else if ( s == ERR_MISS_FILE )
{  
s = CH376FileCreate( NULL );
//mStopIfError( s );
total = 0;  
NewSize = 0;
}
total += sprintf((char *)FileDataBuf + total, "在本次添加数据之前,该文件已有数据的长度是%ld字节\xd\xa", NewSize );  
mFlushBufferToDisk( 0 );
  for(aa=0;aa<100;aa++)//实验用数组
{
FileDataBuf[aa]=0XAA;
      total += sprintf((char *)FileDataBuf+ total, "FileDataBuf[aa]=%X\xd\xa", FileDataBuf[aa]);
    }//将二进制数转化成字符
         mFlushBufferToDisk( 0 );
total += sprintf( (char *)FileDataBuf + total, " ********************************* " );  
total += sprintf( (char *)FileDataBuf + total, "这次的数据到此结束,程序即将退出\xd\xa" );
         mFlushBufferToDisk( 1 );
s = SetFileCreateTime( "/TEST.TXT", MAKE_FILE_DATE( 2016, 3, 3 ), MAKE_FILE_TIME( 11, 48, 20 ) );
s = CH376FileClose( FALSE );

mDelaymS( 200 );

以上是mian函数中的一部分,当首次往U盘的TXT文件中写数据时,会出现部分数据丢失;当U盘的TXT文件中已有数据再向其中写数据,会出现U盘的TXT文件中已存的数据部分丢失。请问这是为什么。还有就是只可以向U盘中写TXT文件吗?我新建doc文件之后,在电脑上打不开,说是不存在U盘中
回复 支持 反对

使用道具 举报

1

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2014-10-5
在线时间
10 小时
发表于 2016-7-6 21:36:56 | 显示全部楼层
谢谢分享!!!
回复 支持 反对

使用道具 举报

18

主题

109

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2016-8-11
在线时间
64 小时
发表于 2017-1-12 20:46:49 | 显示全部楼层
luo372601271 发表于 2016-3-4 14:26
UINT16        total;               
UINT32        NewSize;       
UINT32        SIZE=0;       

扇区读写,会把同扇区已有的数据擦掉。这是我的理解。可以先读出来再一起写。话说我遇到写u盘写不进,有时文件都创建不了。是什么原因?
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2015-12-2
在线时间
8 小时
发表于 2017-2-8 19:38:09 | 显示全部楼层
楼上的,请问我也是遇到用这个例程只能写进一个字符的问题,请问上面的大神们有解决的吗?
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2015-12-2
在线时间
8 小时
发表于 2017-2-9 10:05:16 | 显示全部楼层
问题已解决,楼上代码可用,写进一个字符是U盘问题,换一个兼容的U盘就可以了,谢谢了各位
回复 支持 反对

使用道具 举报

7

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2019-3-7
在线时间
15 小时
发表于 2019-4-12 10:12:43 | 显示全部楼层
孤独的流浪人 发表于 2017-2-9 10:05
问题已解决,楼上代码可用,写进一个字符是U盘问题,换一个兼容的U盘就可以了,谢谢了各位

请问操作过程是怎么样的?是把U盘插在CH376上,然后U盘再插到电脑上看有没有成功新建一个txt文件吗?
回复 支持 反对

使用道具 举报

7

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2019-3-7
在线时间
15 小时
发表于 2019-4-12 10:13:05 | 显示全部楼层
s1q23 发表于 2014-2-26 13:10
为什么我用这个工程写进tXT文件只有第一个字符

请问操作过程是怎么样的?是把U盘插在CH376上,然后U盘再插到电脑上看有没有成功新建一个txt文件吗?
回复 支持 反对

使用道具 举报

7

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2019-3-7
在线时间
15 小时
发表于 2019-4-12 10:13:26 | 显示全部楼层
bht890811 发表于 2013-6-6 10:20
收了,最近正鼓捣这玩意,谢谢!

请问操作过程是怎么样的?是把U盘插在CH376上,然后U盘再插到电脑上看有没有成功新建一个txt文件吗?
回复 支持 反对

使用道具 举报

0

主题

295

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
335
金钱
335
注册时间
2019-3-26
在线时间
9 小时
发表于 2019-4-12 10:22:20 | 显示全部楼层
谢谢分享!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 16:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表