ch375 读写的是物理扇区 还是 逻辑扇区?
物理扇区。
因为我只用单片机的512bytes ram,可以每读 64 个字节 处理完后,再发 CMD_DISK_RD_GO,再处理 下一64字节,应该可以吧,可是 读 出来的 数据, 开始 十来个 对了,跟着就不对,什么原因?
请问下你处理的64字节的时间是多长?还有建议你先把64字节读取进来之后在处理,处理数据的时间不能超过10MS的时间。否则U盘挂起无法读取。
我要做的是这样,只用单片机的512bytes ram,能不能实现 查找文件TXT,读取文件内容到串口大师显示出来?能指点下吗,有没其他的想法?
可以把你的程序贴出来看看。你的意思是64个字节里面,有的数据正确,有的数据错误?
是的。我读的是mbr引导扇区,但串口发来开始几个数据正确,接着就不对,而且也不够 64 个字节?下面是程序段 ,感谢解答! unsigned char CH375_Read_Sector(unsigned long addr,unsigned char *pBuf) { unsigned char i=0,j=0;//,k=0 unsigned char status,len; unsigned char counter=0; //for(k=0;k<4;k++) //{ //counter=0; CH375_Write_Cmd(CMD_DISK_READ);//磁盘读取命令 CH375_Write_Dat(addr); CH375_Write_Dat(addr>>8); CH375_Write_Dat(addr>>16); CH375_Write_Dat(addr>>24); //送入32位扇区地址,物理扇区 CH375_Write_Dat(1); //送入扇区数
for(i=0;i<8;i++) //CH375的数据缓冲区为64字节,所以读取一个扇区要读8次 { status=CH375_Wait_Int(); //等待CH375中断信号,读取状态码 if(status==USB_INT_DISK_READ) //如果状态码是USB_INT_DISK_READ,就开始读取数据,否则发生错误 { CH375_Write_Cmd(CMD_RD_USB_DATA); //送入读数据的命令 delay(4); len=CH375_Read_Dat(); //先读到的是数据的长度 do //把随后CH375送过来的数据放入pBuf中 { pBuf[counter++]=CH375_Read_Dat(); }while(--len);counter=0; //for(i=0;i<64;i++)pBuf[i]=0; CH375_Write_Cmd(CMD_DISK_RD_GO); //送入继续读数据的命令,CH375会将下面64个字节放入缓冲区,等待单片机来读 UART_Send_Str(pBuf);// 主要是这里,我想把每 64 个字节 发到串口 显示出来,能不能 实现? //还是 放 到哪里 执行? } else { return 1; //发生错误,返回状态码 } // }
status=CH375_Wait_Int(); //读取8次以后,最后一次送入继续读数据的命令,等待CH375产生中断信号,并读取状态 if(status==USB_INT_SUCCESS) //如果状态码为USB_INT_SUCCESS,说明读取扇区成功,返回0 {UART_Send_Str("读取扇区成功"); return 0; } // else // if(status==USB_INT_DISK_ERR ) // { // delay(1000); // CH375_Write_Cmd(CMD_DISK_R_SENSE); /* 获取USB存储器的容量 */ // status=CH375_Wait_Int(); /* 等待中断并获取状态 */ // if(status!=USB_INT_SUCCESS) /* 出现错误 */ // return 1; // } } }
我想问题在这里: CH375_Write_Cmd(CMD_DISK_RD_GO); //送入继续读数据的命令,CH375会将下面64个字节放入缓冲区,等待单片机来读 UART_Send_Str(pBuf);// 主要是这里,我想把每 64 个字节 发到串口 显示出来,能不能 实现? //还是 放 到哪里 执行? }
status=CH375_Wait_Int(); 从你的函数来看,不管status是什么,最后都会通过串口发送数据。status到底有没有返回成功?
红桃六,我们能单独聊聊好么,我的问题比较大,不知怎么描述,我的邮箱是个人信息保护,已隐藏,QQ是418550674,小弟真的很着急呀
兄弟,别急,幸好你也用这个芯片,要不你就没了,这里 有问必有答。 红桃六,感谢你的帮忙,原来是我的串口发送函数遇到零就截断了。 现在可以发送64个字节正确的数据,但下一个64就没了? 下面程序 unsigned char CH375_Read_Sector(unsigned long addr,unsigned char *pBuf) { unsigned char i=0,j=0;//k=64 unsigned char status,len; unsigned char counter=0; //for(k=0;k<4;k++) //{ //counter=0; CH375_Write_Cmd(CMD_DISK_READ);//磁盘读取命令 CH375_Write_Dat(addr); CH375_Write_Dat(addr>>8); CH375_Write_Dat(addr>>16); CH375_Write_Dat(addr>>24); //送入32位扇区地址,物理扇区 CH375_Write_Dat(1); //送入扇区数
for(i=0;i<8;i++) //CH375的数据缓冲区为64字节,所以读取一个扇区要读8次 { status=CH375_Wait_Int(); //等待CH375中断信号,读取状态码 if(status==USB_INT_DISK_READ) //如果状态码是USB_INT_DISK_READ,就开始读取数据,否则发生错误 { CH375_Write_Cmd(CMD_RD_USB_DATA); //送入读数据的命令 delay(4); len=CH375_Read_Dat(); //先读到的是数据的长度 do //把随后CH375送过来的数据放入pBuf中 { UART_Send_Byte(CH375_Read_Dat());//pBuf[counter++]=CH375_Read_Dat(); }while(--len);//counter=0; //UART_Send_Str(pBuf); CH375_Write_Cmd(CMD_DISK_RD_GO); //送入继续读数据的命令,CH375会将下面64个字节放入缓冲区,等待单片机来读 //for(i=0;i<64;i++)UART_Send_Byte(pBuf[i]); } else { return 1; //发生错误,返回状态码 } // }
status=CH375_Wait_Int(); //读取8次以后,最后一次送入继续读数据的命令,等待CH375产生中断信号,并读取状态 if(status==USB_INT_SUCCESS) //如果状态码为USB_INT_SUCCESS,说明读取扇区成功,返回0 {UART_Send_Str("读取扇区成功"); return 0; } // else // if(status==USB_INT_DISK_ERR ) // { // delay(1000); // CH375_Write_Cmd(CMD_DISK_R_SENSE); /* 获取USB存储器的容量 */ // status=CH375_Wait_Int(); /* 等待中断并获取状态 */ // if(status!=USB_INT_SUCCESS) /* 出现错误 */ // return 1; // } } }
需要看下你的三个读写函数:CH375_Write_Cmd();CH375_Write_Dat();以及CH375_Read_Dat();看下你的时序是否有问题。
回复8楼: 可以给我电话或者发邮件联系。QQ不方便 回复9楼: status=CH375_Wait_Int(); //等待CH375中断信号,读取状态码 status返回的是什么?程序怎么执行的?