版主好,我发现例程里扇区写好像有错误。

for ( mBlockCount = iSectorCount * DEF_SECTOR_SIZE / CH376_DAT_BLOCK_LEN; mBlockCount != 0; -- mBlockCount ) { /* 数据块计数 */ s = Wait376Interrupt( ); /* 等待中断并获取状态 */ if ( s == USB_INT_DISK_WRITE ) { /* USB存储器写数据块,请求数据写入 */ CH376WriteHostBlock( buf, CH376_DAT_BLOCK_LEN ); /* 向USB主机端点的发送缓冲区写入数据块 */ xWriteCH376Cmd( CMD0H_DISK_WR_GO ); /* 继续执行USB存储器的写操作 */ xEndCH376Cmd( ); buf += CH376_DAT_BLOCK_LEN; } else break; /* 返回错误状态 */ } if ( mBlockCount == 0 ) { s = Wait376Interrupt( ); /* 等待中断并获取状态 */ if ( s == USB_INT_SUCCESS ) return( USB_INT_SUCCESS ); /* 操作成功 */ }

这段按照资料上的介绍,好像只能写入一个扇区的数据。一个扇区8个64字节的数据,一旦写完8块后返回USB_INT_SUCCES。这样的话就会跳出循环,但是这时mBlockCount!=0,所以这时应该不会下面的写入缓冲操作才对。。不知道我理解的对不对。请版主指教

资料上没有说这个命令只能写一个扇区。资料上是以一个扇区举例说明的。写完最后一个64个字节数据返回USB_INT_SUCCES


您的意思是如果我有128个扇区要写,那么我就可以执行128*8=1024次以下程序段 { CH376WriteHostBlock( buf, CH376_DAT_BLOCK_LEN ); /* 向USB主机端点的发送缓冲区写入数据块 */ xWriteCH376Cmd( CMD0H_DISK_WR_GO ); /* 继续执行USB存储器的写操作 */ xEndCH376Cmd( ); } 当最后一次64个字节写入成功以后,CH376将会给出中断码为0x14的中断对吗? 可是我连续写入19个64字节的数据后,再执行CMD0H_DISK_WR_GO命令就再也没有中断产生了。这是怎么回事呢?


还有斑竹,资料上:“那么可以由CMD_RD_USB_DATA0命令依次获取逻辑盘的总扇区数(以低字节在前的 4 个字节表示的 32 位双字数据),当前逻辑盘的剩余扇区数(以低字节在前的 4 个字节表示的 32 位 双字数据),逻辑盘的FAT文件系统类型(参考 CH376INC.H 文件中的CH376_CMD_DATA结)”这里看起来在发送命令后要读9个字节。但是为什么历程里读了10次呢? xWriteCH376Cmd( CMD01_RD_USB_DATA0 ); xReadCH376Data( ); /* 长度总是sizeof(CH376_CMD_DATA.DiskQuery) */ xReadCH376Data( ); /* CH376_CMD_DATA.DiskQuery.mTotalSector */ xReadCH376Data( ); xReadCH376Data( ); xReadCH376Data( ); c0 = xReadCH376Data( ); /* CH376_CMD_DATA.DiskQuery.mFreeSector */ c1 = xReadCH376Data( ); c2 = xReadCH376Data( ); c3 = xReadCH376Data( ); *DiskFre = c0 | (UINT16)c1 << 8 | (UINT32)c2 << 16 | (UINT32)c3 << 24; xReadCH376Data( ); /* CH376_CMD_DATA.DiskQuery.mDiskFat */ xEndCH376Cmd( );


读10次是正确的,第一个数据代表的是后续数据长度,后面9个数据才是DiskQuery结构里面的数据


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