各位大虾好: 小弟在使用CH375时,初始化U盘成功后,就使用DISK_RESD命令读取U盘数据,可是读出来的数据全是0X1D(USB_INT_DISK_READ),不知是不是中间过程出了什么问题?
注:我的程序设计为;初始化成功后,就直接发送DISK_RESD命令,然后送出四个字节地址和扇区数,等待读取中断,产生中断后读取数据。
各位大虾好: 小弟在使用CH375时,初始化U盘成功后,就使用DISK_RESD命令读取U盘数据,可是读出来的数据全是0X1D(USB_INT_DISK_READ),不知是不是中间过程出了什么问题?
注:我的程序设计为;初始化成功后,就直接发送DISK_RESD命令,然后送出四个字节地址和扇区数,等待读取中断,产生中断后读取数据。
你可以不可以把DISK_READ这部分命令贴出来看下
/*=================================================================================== 函数功能:读取字符串,将读取字符存入数据缓冲区-----*data 输入数据:读取数据长度/接收数据指针 输出数据:无 函数说明:读取数据长度需单独送入。此函数只读取数据 =====================================================================================*/ void PARA_read_string(uchar len,uchar *data) { uchar i; for(i=0;i { data[i] = PARA_read_data(); //循环读取数据,知道完毕,data[]为数据缓冲区 putchar(data[i]); //显示读取数据 delay_ms(1); } }
/*=================================================================================== 函数功能:读取数据块(以扇区为单位) 输入参数:数据绝对地址/读取扇区数/读入数据缓冲区指针 输出参数:无 函数说明:数据绝对地址是一个四字节的数组(低在前)由于CH375的内置数据缓冲区只有64个字节 所以读取一个扇区(512)需9次中断(前8次读取数据,最后一次返回操作状态) ====================================================================================*/ void PARA_read_Sector(uchar *LbaStart,uchar Sector_Count,uchar *Data_Buffer) { uchar Intrupt_Count; //中断次数缓冲器 uchar status; //中断状态 PARA_send_com(DISK_READ); //发送读取数据命令 PARA_send_string(4,LbaStart); //发送地址 PARA_send_data(Sector_Count); //发送待读取扇区数 status = Wait_Intrupt(); //获取中断状态 //delay_ms(100); if(status == USB_INT_DISK_READ) { delay_ms(100); PARA_read_string(64,Data_Buffer); } }
不知道读写U盘程序流程是否为:初始化-----发送读取数据块命令-----发送4字节地址-----发送待读取扇区数-----等待中断----读取数据? 初始化后有必要进行“识别分析U盘文件系统吗”?
不需要,你是操作物理扇区,是不需要考虑文件系统的,不过你读的数据如果大于64字节的话,那么你要在读的后面加上一个CH375_WR_CMD_PORT( CMD_DISK_RD_GO ); /* 继续执行USB存储器的读操作 */ 的命令
我现在只读取64个字节,我又在前面加了一个获取容量命令,结果返回数据正确,但读取的数据依然是64个0XID DISK_READ是否只要产生USB_INT_DISK_READ中断后就直接读取数据了?还是中间还要有其他过程?
你用这段程序改下看下; CH375_WR_CMD_PORT( CMD_DISK_READ ); /* 从USB存储器读数据块 */ CH375_WR_DAT_PORT( (unsigned char)iLbaStart ); /* LBA的最低8位 */ CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 8 ) ); CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 16 ) ); CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 24 ) ); /* LBA的最高8位 */ CH375_WR_DAT_PORT( iSectorCount ); /* 扇区数 */ mBufferPoint = DATA_BUFFER; /* 指向缓冲区起始地址 */ for ( mBlockCount = iSectorCount * CH375_BLK_PER_SEC; mBlockCount != 0; mBlockCount -- ) { /* 数据块计数 */ mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( mIntStatus == USB_INT_DISK_READ ) { /* USB存储器读数据块,请求数据读出 */ CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 从CH375缓冲区读取数据块 */ mLength = CH375_RD_DAT_PORT( ); /* 后续数据的长度 */ while ( mLength ) { /* 根据长度读取数据 */ *mBufferPoint = CH375_RD_DAT_PORT( ); /* 读出数据并保存 */ mBufferPoint ++; mLength --; } CH375_WR_CMD_PORT( CMD_DISK_RD_GO ); /* 继续执行USB存储器的读操作 */ } else break; /* 返回错误状态 */ } if ( mBlockCount == 0 ) { mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( mIntStatus == USB_INT_SUCCESS ) return( 0 ); /* 操作成功 */ } return( mIntStatus ); /* 操作失败 */
现在的问题是我把地址该了,可读出的数据是一样的。我给的地址分别是0X00,0X00,0X00,0X00和0X00,0X00,0X01,0X00,读出的数据是:40 FA 33 C0 8E D0 BC 00 7C 8B F4 50 07 50 1F FB FC BF 00 06 B9 00 01 F2 A5 EA 1D 06 00 00 BE BE 07 B3 04 80 3C 80 74 0E 80 3C 00 75 1C 83 C6 10 FE CB 75 EF CD 18 8B 14 8B 4C 02 8B EE 83 C6 10 FE 其中40表示数据个数
请问,是不是因为我没有设置地址的原因呢?如果不设置不是默认地址0吗?
请问你所说的地址是什么意思??是LBA扇区号吗??
是
你要是读第一扇区的数据,那你的LBA扇区号要设置成0X00000000,你如果要是读第2扇区,那么你要输入的扇区号是0X00000001啊,你没输入扇区号,那当然是不能操作的拉
我在使用DISK_READ命令后发送的0X00,0X00,0X00,0X00和0X00,0X00,0X01,0X00不就是吗?
你现在读的是第0x00000000和0x00000100扇区啊
是,可这样两个扇区数据一样也不对吧?