我现在用的是51单片机控制ch375对u盘扇区进行读写操作。。。 连续读写时。。经常出现在在写入w_ch375cmd( CMD_DISK_READ ); /* 从USB存储器读数据块 */ w_ch375data(start_sector.mchar[3]); /* LBA的最低8位 */ w_ch375data(start_sector.mchar[2]); w_ch375data(start_sector.mchar[1]); w_ch375data(start_sector.mchar[0]); /* LBA的最高8位 */ w_ch375data( iSectorCount ); /* 扇区数 */ 命令后返回的中断状态是14h而不是USB_INT_DISK_READ。。为什么会这样啊、、 返回14h说明什么啊?
有人在吗?给看看啊。。
你在读之前去获取一下中断状态,(写CMD_DISK_READ 之前)这可能是由于上次的中断状态没有被取消所导致的.
不行啊。。还是一样。。我读了。。
在前面加了w_ch375cmd( CMD_GET_STATUS); mIntStatus = r_ch375data(); /* 获取中断状态 */ w_ch375cmd( CMD_DISK_READ ); /* 从USB存储器读数据块 */ w_ch375data(start_sector.mchar[3]); /* LBA的最低8位 */ w_ch375data(start_sector.mchar[2]); w_ch375data(start_sector.mchar[1]); w_ch375data(start_sector.mchar[0]); /* LBA的最高8位 */ w_ch375data( iSectorCount ); /* 扇区数 */ 结果还是一样。。。前两次是返回的USB_INT_DISK_READ。。到第三次。。有时候是第二次就出问题了。。。 想不明白到底为什么啊。。。
我刚查了一下。。发现是有一个时钟信号影响到了ch375的工作。。。 我想问一下ch375工作时晶振的稳定度要很高吗? 那个时钟信号加上时。。晶振还是12M但是有点晃。。晃的很小。。但是就是这个时钟信号上去之后就读不了数据了。。。。
那把你的代码贴出来看看流程是否正确.还有对375的读写子函数.
行。。。
/* 从U盘读取多个扇区的数据块到缓冲区 */ void mReadSector(unsigned char iSectorCount ) /* union long_char start_sector 是准备读取的线性起始扇区号, iSectorCount 是准备读取的扇区数 */ { unsigned int mBlockCount; uchar mLength; w_ch375cmd( CMD_DISK_READ ); /* 从USB存储器读数据块 */ w_ch375data(start_sector.mchar[3]); /* LBA的最低8位 */ w_ch375data(start_sector.mchar[2]); w_ch375data(start_sector.mchar[1]); w_ch375data(start_sector.mchar[0]); /* LBA的最高8位 */ w_ch375data( iSectorCount ); /* 扇区数 */ for ( mBlockCount = iSectorCount * BlockPerSector; mBlockCount >0; mBlockCount -- ) /* 数据块计数 */ {
while(!flag); flag=0; if ( mIntStatus == USB_INT_DISK_READ ) { /* USB存储器读数据块,请求数据读出 */ w_ch375cmd( CMD_RD_USB_DATA ); /* 从CH375缓冲区读取数据块 */ mLength = r_ch375data( ); /* 后续数据的长度*/ do {
*p=r_ch375data(); /* 读出数据并保存 */ p++; } while ( -- mLength ); w_ch375cmd( CMD_DISK_RD_GO ); /* 继续执行USB存储器的读操作 */ } else break; /* 返回错误状态 */ } while(!flag); flag=0; /* 等待中断并获取状态 */ _nop_(); _nop_(); } flag是中断标志位。。。我不上一个芯片的时候。。。中断申请的状态一直都正确。。。但是那个芯片上了之后就不行了。。。对晶振是有一点影响。。但影响很小。。我用3.3v供电的。。。无源晶振。。。。。。 我看有人说用有源晶振会好一点。。是不是这样啊。。
初始化和对第一个扇区的读写都成。。。上的片子上有时钟信号在跑。。。它可以先中断读取状态都正确。。突然就会出问题了。。。。读取状态就变成了14h。。死了。。