大家好,小弟刚接触CH375生成U盘文件的技术,想请教个问题,比如说我要在U盘里生成一个名字为a.txt的文件,文件内容为12345,需要通过CH375向U盘发送哪些数据?
(1)文件名必须是大写的:A.TXT (2)TXT的内容是ASIIC,文件内容为12345的话,那么写入的数据是0x31,0x32,0x33,0x34,0x35
你这是直接调用CH375库函数使用时用的吧?库函数里有很多程序用不着,我想知道一些读写引导区的方法,自己尝试写底层的程序。
(1)不是,只要想实现你要的效果,就必须这样做 (2)如果你是想自己写底层读写物理扇区的话,那么下载CH375EVT.ZIP,参考MISCELL下的例程,FAT的驱动没有例程,只能自己参考FAT协议去编写了,论坛内有个精简例程:http://wch.cn/bbs/View.asp?S=101&I=531
没有必要,库里面的函数大部分都是必须的,而且已经做了精简,功能比较完善,而且经过非常严格的测试,兼容性非常高,推荐使用库函数.
如果你做完整的文件的话我也建议你用他们的库,因为我现在就为兼容性头疼。你如果执意写引导区和扇区一级的话,那就要去查看你所需要的文件系统内容,甚至要看USB相关的协议。
好的,谢谢大家的回复,我先尝试去熟悉使用库函数,这样也可以节省我的工作量。在电子设计方面,我工作经验比较欠缺,会有很多琐碎的问题向大家咨询。 我想请问我想用通用型51做一个CH375并口的U盘文件生成的程序,请问先参考哪个例程效率会高些? 此外,看到一些例程里有PrintF函数,是不是在Keil的仿真软件上显示一些函数的时候用的?
(1)下载CH375LIB.ZIP,根据\CH375LIB\DOC\LIB_LIST.TXT选择相应的库,例程参考MCS51下的 (2)printf输出一些调试信息,由于涉及到CH375芯片,不好软件仿真
CH375EV4.c里有一段看不明白 if ( DISK_BUFFER[0] != 0xEB && DISK_BUFFER[0] != 0xE9 ) { /* 不是逻辑引导扇区 */ DiskStart = DISK_BUFFER[0x1C6] | (UINT16)DISK_BUFFER[0x1C7] << 8 | (UINT32)DISK_BUFFER[0x1C8] << 16 | (UINT32)DISK_BUFFER[0x1C9] << 24; Status = mReadSector( DiskStart, 1, DISK_BUFFER ); /* 根据新的起始扇区号读取逻辑盘引导信息 */ if ( Status != 0 ) return( Status ); }
其中DISK_BUFFER[0] != 0xEB && DISK_BUFFER[0] != 0xE9 这2个判断条件是与的关系,一个RAM怎么会等于2个值?这判断不是肯定不成立吗?
DISK_BUFFER中是0号扇区的内容,在FAT文件系统中,0号扇区的首字节可能是0xEB或0xE9 如果该位置的内容既不为0xEB也不为0xE9,则该扇区就不是逻辑引导扇区
这个是文件系统中规定的:逻辑引导扇区的首字节可以是0xEB或者0xE9,只不过现在的U盘中在逻辑引导扇区的首字节用0xEB比使用0xE9的更普遍.所以这个语句是没有问题的. 你想了解的话可以去看看FAT文件系统.
呵呵,谢谢各位,边干活边研究程序容易出问题,我把!=想成==了,所以觉得很奇怪。 你说的FAT文件系统是指doc里的FAT32那篇文章吗?我想先了解海量存储的基础,之前粗略看过《硬盘扇区读写技术--修复硬盘与恢复文件》这篇文章,但由于手上工作较多,没有很系统的看,结果看完了几乎啥都没有了解到,对引导区的相关信息几乎不了解。不过今天把CH375跟CH375HF4.c的文件对照着看了部分,多了解CH375读写U盘的方法以及一些引导区的信息知道。真是非常感谢各位的帮助。
网上找了些资料,还是没弄懂 DiskStart = DISK_BUFFER[0x1C6] | (UINT16)DISK_BUFFER[0x1C7] << 8 | (UINT32)DISK_BUFFER[0x1C8] << 16 | (UINT32)DISK_BUFFER[0x1C9] << 24; 判断第1个扇区不是引导区后,从分区表的第8个字节(1C6)起读的4个字节数据就可以直接作为U盘的数据区域起始地址了吗?
偏移地址 01BF ~ 01C1 字节数 3 含义分析 分区的起始地址(磁头/扇区/柱面):通常第一分区的起始地址开始于1磁头0柱面1扇区,因此这三个字节应为010100
请问010100是不是应该是010001?
01C6 ~ 01C9 该分区起始逻辑扇区[在线性寻址方式下的分区相对扇区地址],搜到这个信息,嘻嘻,大概知道那条语句用来干嘛了,不过010100那个总觉得有问题,麻烦各位解答一下^_^
void mStopIfError( UINT8 iErrCode ) { /* 如果错误则停止运行并显示错误状态,正式应用还需要分析处理 */ if ( iErrCode == 0 ) return; printf( "Error status, %02X\n", (UINT16)iErrCode ); }
运行到此语句printf( "Error status, %02X\n", (UINT16)iErrCode );,PC上的仿真软件是不是就输出错误信息并停止仿真器的运行?