我用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 ); //操作失败 }
这个读写函数逻辑有问题吗?