我使用CH375+DSP509,单步运行都没有问题,可只要连续运行,程序就会跑飞,下面是我的写程序 /* 将缓冲区中的多个扇区的数据块写入U盘 */ Uint16 RBC_Write(Uint32 iLbaStart,Uint16 *mBufferPoint, Uint16 iSectorCount) { // iLbaStart 是写入的线起始性扇区号, iSectorCount 是写入的扇区数 Uint16 mIntStatus; Uint16 mBlockCount; Uint16 mLength; Uint16 i; Uint8 mWrite; iSectorCount=iSectorCount/512; CH375_CMD_PORT_d_out( CMD_DISK_WRITE); /* 向USB存储器写数据块 */ CH375_DAT_PORT_d_out((Uint16)iLbaStart); /* LBA的最低8位 */ CH375_DAT_PORT_d_out((Uint16)( iLbaStart >> 8 )); CH375_DAT_PORT_d_out((Uint16)( iLbaStart >> 16 )); CH375_DAT_PORT_d_out((Uint16)( iLbaStart >> 24 )); /* LBA的最高8位 */ CH375_DAT_PORT_d_out(iSectorCount); /* 扇区数 */ for ( mBlockCount = iSectorCount * 8; mBlockCount != 0; mBlockCount -- ) /* 数据块计数 */ { /* 数据块计数,SectorSize 由CMD_DISK_SIZE 获得,大多数U 盘的SectorSize 是512 */ while(1) { mDelay1uS( ); mIntStatus = mWaitInterrupt(); /* 等待中断并获取状态 */ if(mIntStatus==0x1E)break; } if(mIntStatus==0x1E) { /* USB 存储器写数据块,请求数据写入 */ CH375_CMD_PORT_d_out(0x2B); /* CH375缓冲区写入数据块 */ CH375_DAT_PORT_d_out(0x40); /* 后续数据的长度 */ mLength=32; while ( mLength -- ) { /* 根据长度写入数据 */ mWrite=(*mBufferPoint)&0x00FF; CH375_DAT_PORT_d_out(mWrite); /* 写入数据并保存 */ mWrite=((*mBufferPoint)&0xFF00)>>8; CH375_DAT_PORT_d_out(mWrite); mBufferPoint ++; } CH375_CMD_PORT_d_out(0x57); /* 继续执行USB 存储器的写操作 */ } else break; /* 返回错误状态 */ } if(mBlockCount==0) { /* 数据传输完成 */ mIntStatus = mWaitInterrupt(); /* 等待中断并获取状态 */ if(mIntStatus==0x14) { return( 0 ); /* 操作成功 */ } } return( mIntStatus ); /* 操作失败 */ } 是写程序有问题吗
主频120M,我的基本读写时序如下 /* 向CH375命令端口写命令数据 */ void CH375_CMD_PORT_d_out( Uint8 d_out ) { mDelay1uS( ); WriteIO_CH375Cmd(d_out); mDelay2uS( ); /* 至少延时2uS */ }
/* 向CH375数据端口写数据 */ void CH375_DAT_PORT_d_out( Uint8 d_out ) { Uint16 i; WriteIO_CH375Data(d_out) ; for(i=0;i<0x150;i++); }
/* 从CH375命令端口读数据 */ Uint16 CH375_DAT_PORT_in( ) { Uint16 i,j; for(i=0;i<0x150;i++); j=ReadIO_CH375Data(); return j; } 难道是时序问题?
这个时序还是看不出来,需要你自己看一下写数据的过程中的WR,RD,CS,A0各个时序.
恩,谢谢,我看看这几个时序