CH376支持FAT12/16/32,那么在格式化U盘时选择FAT或FAT32,分配单元大小选择默认值,都是可以的吗?
请问新建文件的时候是否需要指定扇区号,或者向某个文件中写数据时是否要指向该文件的指针,文件系统我不太了解,不知道这样理解对不对。我的应用只是用基本的命令新建个TXT文件,然后就向文件中写数据,最后关闭文件。整个过程中并没控制CH376关于扇区和指针方面的操作,CH376内部能自动处理吗?感觉上我写的数据跟文件名没有关联上,在计算机上打开的时候,显示的数据并不是我所操作的扇区!
新建文件肯定需要指定扇区号,但是我们CH376内部集成了文件系统,所以只需要通过发送相关命令来实现。按照流程,新建成功即可直接按照字节写。看了你写入的数据,感觉是你文件系统里面的数据写进文件中去了。很我们只支持FAT格式文件系统的USB存储器,格式化默认就行。
谢谢,我再看看!正用的芯片丝印:CH376S 206255227 “看了你写入的数据,感觉是你文件系统里面的数据写进文件中去了” 您的意思是把U盘中其他文件的数据写到了我要操作的文件中了是吗,有这个可能,我发现望U盘里放点文件,打开我建的文件才会看到乱码,而格式化后的U盘,我建的文件只有0x00或只有0xff(虽然数据个数是对的)。 或者是写文件的扇区与打开文件看到的扇区不同! 为什么会有这种情况呢?
读写U盘那部分的程序发您邮箱里了! 今天早上又发现个情况,重新找个U盘,里面有些文件,格式化后,用单片机向U盘根目录新建了2014.TXT文档并写入64k的单一字节0x39(9),在电脑上打开后发现一些乱码,还有格式化前某个文档中的数据,格式、换行都跟原文件相同,然后又是一些乱码,感觉就是扇区号不对!(U盘格式化不是完全清空数据吗?)
看了你的程序,注意以下几点: (1)写数据最好像读数据ReadCH376Data()做成一个函数。 (2)中断那块处理的流程是,读到中断状态,需要发送获取中断状态的命令0x22的命令来获取中断值并取消中断 (3)看了你的写函数的流程,有点问题在发送CMD01_WR_REQ_DATA(2DH)命令之后,应该读取可以往CH376数据长度。接着根据读到的长度循环写数据;而不是你直接给0xFF况且你发送0x3C之后的数据长度是0x4000你可以先少点数据来测试,详细你可以参考一下CH376编程指南。 (4)我们的函数都已经做好了在FILE_SYS.C函数里面,你只需要修改读写子函数即可。 另外,U盘格式化只是将启动扇区,FAT表恢复到原来的数据,当然不是清空数据。
SPI2_transfer(0x2D);//发送写数据命令 delay(100); n=SPI2_transfer(0xFF);//读可以写入的数据长度0~255,目的不是发送0xff,是接收可以写入的数据长度
硬件SPI通讯,主机模式,要想读从机的一个字节数据,是要发送8个时钟脉冲。主机模式读数据是要先写数据才能在SPI缓冲区接收到从机数据,与其他芯片之间的SPI通讯也是这样做的,是可以的!
写入的数据长度从0x0001到0xffff之间试过很多了!
printf( "Write begin\n" ); s = sprintf( buf, "此前文件长度= %ld 字节\xd\xa", CH376GetFileSize( ) ); /* 注意字符串长度不能溢出 buf,否则加大缓冲区或者分多次写入 */
printf( "Current offset ( file point ) is %ld\n", CH376ReadVar32( VAR_CURRENT_OFFSET ) ); /* 读取当前文件指针 */
例子7当中的这两部分,是不是只是显示信息用的,如果不执行该代码对文件的操作是否有影响呢? 主要是:CH376GetFileSize( )和 CH376ReadVar32( VAR_CURRENT_OFFSET )
现在的问题应该是写文件的扇区没有跟文件名关联上,写的数据不知道写哪了,这样的问题应该从哪方面着手来解决呢?
我们找可写的扇区都是通过命令CH376内部实现的,只要你文件打开或者创建成功(返回中断状态正确)应该就是能够关联上。你自己写的函数话流程可能会有问题,按照21楼的注意点,结合中断状态,只能一步一步分析。23楼的函数对写操作是没有影响的。
初始化的时候读版本号返回是0x44,设置文件名之前去读版本号返回是0x01。芯片工作过程中25和26号引脚一直是低电平!(有网友说应该一个高一个地)SPI硬件接口有这个说法吗?
重新移植了芯片的库函数,基本上成功了,但文件前面总是:格: ) Generic STORAGE DEVICE 0250,后面的数据是对的!感谢您的热心帮助!
初始化完成之后CH376S的25脚应该是低电平,你说的25和26脚一高一低应该是CH375。 新建或者打开文件之后,你可以使用字节偏移,偏移到第0位再开始写。
问题解决了,是因为先执行了: i = CH376ReadBlock( buffer ); /* 如果需要,可以读取数据块CH376_CMD_DATA.DiskMountInq,返回长度 */ s = CH376DiskQuery( (PUINT32)buffer ); /* 查询磁盘剩余空间信息,扇区数 */ 改变了buffer前部分的数据,现在完全可以了!
请问一下,用字节模式写USB,写入超过255个字节后,之后有几个字节会乱码,请问一下是什么原因