CH375对U盘写数据出错,老在等待中断。

我用ATMEGA 16对U盘写数据的时候,不知道是哪里的问题,只能在文件中写1K大小就写不进去了,经过分析是在等待中断中等待去了。谁有单片机写U盘程序没?给我参考下啊。我都是自己写的函数,不太好。还有创建文件给它分配大小的时候只能分配不到1M的空间,就出错了。是不是有坏簇呢? 按道理375对扇区的操作是稳定的,可是我读写的时候,375回复我的中断状态总是有不对的地方,有时候还收不到读写数据的中断状态,不知道是什么原因,希望有人帮忙解决下, 下面是我的读写函数: //读扇区函数 unsigned char mReadSector( unsigned long int iLbaStart, unsigned char iSectorCount, unsigned char *oDataBuffer ) { unsigned int mBlockCount; unsigned char c; xWriteCH375Cmd( CMD_DISK_READ ); // 从USB存储器读数据块 xWriteCH375Data( (unsigned char)iLbaStart ); // LBA的最低8位 xWriteCH375Data( (unsigned char)( iLbaStart >> 8 ) ); xWriteCH375Data( (unsigned char)( iLbaStart >> 16 ) ); xWriteCH375Data( (unsigned char)( iLbaStart >> 24 ) ); // LBA的最高8位 xWriteCH375Data( iSectorCount ); // 扇区数 //delay_ms(10); for ( mBlockCount = iSectorCount *8; mBlockCount != 0; mBlockCount-- ) { c = WaitINT( ); // 等待中断并获取状态 if ( c == USB_INT_DISK_READ ) { // 等待中断并获取状态,请求数据读出 xWriteCH375Cmd(CMD_RD_USB_DATA); // 从CH375缓冲区读取数据块 c = xReadCH375Data(); // 后续数据的长度 while (c --) *oDataBuffer++ = xReadCH375Data(); xWriteCH375Cmd(CMD_DISK_RD_GO); // 继续执行USB存储器的读操作 } else break; // 返回错误状态 } if ( mBlockCount == 0 ) { c = WaitINT( ); // 等待中断并获取状态 if ( c== USB_INT_SUCCESS ) return( 0 ); // 操作成功 } return( c ); // 操作失败 }

//写扇区函数 unsigned char mWriteSector( unsigned long int iLbaStart, unsigned char iSectorCount, unsigned char *oDataBuffer ) { unsigned int mBlockCount; unsigned char c; xWriteCH375Cmd( CMD_DISK_WRITE ); // 向USB存储器读数据块 xWriteCH375Data( (unsigned char)iLbaStart ); // LBA的最低8位 xWriteCH375Data( (unsigned char)( iLbaStart >> 8 ) ); xWriteCH375Data( (unsigned char)( iLbaStart >> 16 ) ); xWriteCH375Data( (unsigned char)( iLbaStart >> 24 ) ); // LBA的最高8位 xWriteCH375Data( iSectorCount ); // 扇区数 //delay_ms(10); for ( mBlockCount = iSectorCount *8; mBlockCount != 0; mBlockCount-- ) { c = WaitINT( ); // 等待中断并获取状态 if ( c == USB_INT_DISK_WRITE ) { // 等待中断并获取状态,请求数据写入 xWriteCH375Cmd(CMD_WR_USB_DATA7); // 从CH375缓冲区写入u盘数据块 c = 64; xWriteCH375Data(c); while (c--) xWriteCH375Data(*oDataBuffer++); //*oDataBuffer++ = xReadCH375Data() xWriteCH375Cmd(CMD_DISK_WR_GO); // 继续执行USB存储器的写操作 } else break; // 返回错误状态 } if ( mBlockCount == 0 ) { c = WaitINT( ); // 等待中断并获取状态 if ( c== USB_INT_SUCCESS ) return( 0 ); // 操作成功 } return( c ); //操作失败 }

这个读写函数逻辑有问题吗?

(1)在进行文件操作之前,最好先做一下大批量扇区读写实验,能否正常!以便区分是底层还是FAT层的问题 (2)我们有另一款CH376芯片,内置文件系统,对单片机资源要求不高,调用相关函数即可读写U盘,可以先看看相关资料


谢谢贵公司的热心帮助。我做了测试,发现是读写遇到不能读的扇区就出错,很有规律的256个扇区就有一个扇区写不了。也读不了。是可能是坏扇区的缘故么?还是什么原因?另你们说的CH376能给我两个样品不?我电话是15311308772.我们做项目急用。


请问在发一些地址过去写的时候发完地址就没反应了,检查发现应该是CH375死机了。有什么方法可以检测发那些地址不能用或者检测那些地址CH375不能够与U盘通信的么?检查USB存储设备出错,怎么用的?


现在发现问题了,原来是读写0x05,0x500,0x50000,0x5000000。这些地址都会出错。这是什么原因呢?


可能是你的读写时序不对导致的?因为0x05是ch375的复位命令 把三个读写函数贴出来看看


非常感谢贵公司的耐心指导。确实是时序问题,不过这个时序问题太诡异了。现在已经调试通过。谢谢。。。困扰了好几天啊。


你只需要按照我们说明书上面的时序来操作就可以。


你们的CH376读取速度多快?CH375按计算的话只能到达1K左右,太慢了。如果你们的CH376快的话,可以考虑换芯片的。批量的话多少钱呢?能给我几个样片么?我的邮箱:个人信息保护,已隐藏.谢谢了哦。


 这个速度是不正常的,需要优化你的程序,主要优化你的三个读写函数,把里面的延时可以去掉. CH376的速度和ch375差不多.在CH376EVT\EVT\CH376EVT.PDF 文档里面有说明.


如果采用模拟I/O口同时按照字节方式读写的话那速度肯定很慢,随便你换哪个芯片速度都快不了。还是按照楼上的来优化下你的速度吧。


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