[求助]CH375写U盘

我的设计是CH375+单片机来接受仪器发过来的数据,我想把这些数据写到U盘上,以便在电脑上查看这些数据具体是什么,我的单片机是ATmega8,大概有8K字节的程序存储空间,1K的RAM数据存储空间,我应该参考贵网站的哪些读写U盘的资料啊?麻烦推荐一下,谢谢了。

推荐你使用CH376芯片,这款芯片自带文件系统,支持串口,并口以及SPI接口。单片机读写U盘需要FLASH空间在1.5K左右,RAM最少几十个字节。资料你可以去下载CH376EVT.ZIP。


我的硬件都已经做好了,不能换了,我本来是接打印机的,可是数据出了点小问题,主管让我把这些数据写到U盘上然后用电脑读出来,看看是哪出错了。只要能写到U盘就可以


CH376S的引脚和CH375B的引脚是兼容的。可以直接替换,如果使用CH375操作U盘,使用我们的库文件,则代码空间要在12K以上


关键是我其他的程序都编好了,也都调试通过了,往U盘写数据只是为了调试最后一步,写的数据量不是很大,ATmega8不能满足吗?


如果使用MEGA8的话,如果采用文件的方式往下写数据的话,FLASH肯定是不够的,按照3楼所说,的方式来操作。这个和写的数据量多少没什么直接的关系。


除非不对文件进行操作。对文件进行操作,要么你换MCU要么换CH376。这个和数据量大小没有关系。你写100G的文件和100K的文件,都需要文件系统。


哦,估计我的硬件是不能改了,那我按你们资料写的直接将U盘当作存储器来读写的话,是不是硬件就能满足了?还有这样的话,在计算机端要用什么工具来读取U盘的数据啊?你们资料上还说可以参考CH375UD.C 编写计算机程序以特殊方法读写无文件格式U 盘中的数据,CH375UD.C在哪可以下载啊?


如果把U盘当做FLASH存储器来做的话,硬件和软件都满足,计算机上面可以自己写软件,或者你可以发E-MAIL到tech@wch.cn来索取这个软件。


哦,好的,我已经发邮件了,谢谢。


我想问下,CH375写U盘的时候,这个mWriteSector写函数,是把数据写到CH375的缓冲区中吗?那它怎么就写到U盘里了?我把这个函数贴出来。


unsigned char mWriteSector( unsigned long iLbaStart, unsigned char iSectorCount ) /* iLbaStart 是写入的线起始性扇区号, iSectorCount 是写入的扇区数 */ { unsigned char mIntStatus; unsigned char *mBufferPoint; unsigned int mBlockCount; unsigned char mLength; CH375_WR_CMD_PORT( CMD_DISK_WRITE ); /* 向USB存储器写数据块 */ CH375_WR_DAT_PORT( (unsigned char)iLbaStart ); /* LBA的最低8位 */ CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 8 ) ); CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 16 ) ); CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 24 ) ); /* LBA的最高8位 */ CH375_WR_DAT_PORT( iSectorCount ); /* 扇区数 */ mBufferPoint = DATA_BUFFER; /* 指向缓冲区起始地址 */ for ( mBlockCount = iSectorCount * BlockPerSector; mBlockCount != 0; mBlockCount -- ) { /* 数据块计数 */ mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( mIntStatus == USB_INT_DISK_WRITE ) { /* USB存储器写数据块,请求数据写入 */ CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向CH375缓冲区写入数据块 */ mLength = CH375_BLOCK_SIZE; CH375_WR_DAT_PORT( mLength ); /* 后续数据的长度 */ while ( mLength ) { /* 根据长度写入数据 */ CH375_WR_DAT_PORT( *mBufferPoint ); /* 将数据写入 */ mBufferPoint ++; mLength --; } /* do { 对于C51,这个DO+WHILE结构比上面的WHILE效率高,速度快 CH375_WR_DAT_PORT( *mBufferPoint ); mBufferPoint ++; } while ( -- mLength );*/ CH375_WR_CMD_PORT( CMD_DISK_WR_GO ); /* 继续执行USB存储器的写操作 */ } else break; /* 返回错误状态 */ } if ( mBlockCount == 0 ) { mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( mIntStatus == USB_INT_SUCCESS ) return( 0 ); /* 操作成功 */ } // if ( mIntStatus == USB_INT_DISCONNECT ) return( mIntStatus ); /* U盘断开 */ mClearError( ); /* 清除U盘错误以便重试 */ return( mIntStatus ); /* 操作失败 */ }


CH375接到写扇区命令后,就发送了CBW命令,每次接完64个字节,然后把这64个字节发送给U盘。这些动作都由CH375芯片自动完成。


哦,那 要写到U盘里的数据应该先存放在哪啊?比如说从智能仪器采集的数据,我现在把从智能仪器接收的数据先放到缓冲区DATA_BUFFER里了,我要把这些数据写到U盘里,应该怎么办啊?


数据先放到缓冲区里面,在调用mWriteSector函数就可以往U盘里面写数据。


这样不会把DATA_BUFFER里的数据覆盖吗?比如我把从上位机采集到的数据先放到DATA_BUFFER里了,然后调用 mWriteSector函数以后,不是还是往DATA_BUFFER里写吗?这样原来的数据不会被覆盖吗?


只有登录才能回复,可以选择微信账号登录