1. 由于使用的是DSP芯片,总线速度400M,USB芯片速度跟不上,所以要读写需要延时。
2.一般bulk端点最大包长度为64字节,所以用usbview在电脑看到的512个字节是错的
3.建立一个文件的流程:
首先从文件开始的扇区开始查询,如果某个扇区中读出的字节内容为0x00,或者为0xe5则目录为空,将所要建立的目录写入到当前所读的扇区中。并将文件长度和偏移一簇的偏移量记为0。
4.打开一个文件的流程:
在打开文件时,需要查找文件名,查找文件名时,首先从目录开始的簇号开始查询
FAT16格式下的目录开始簇号为数据区的起始扇区 FirstDataSector=根目录开始的扇区+根目录所占的扇区。
FAT32格式,目录开始的簇号为BPB的第45,45,46,47字节的组合,一般建议为2.
找到了文件名后,将文件开始的簇号,目录所在的扇区,目录偏移该扇区的字节数记录下来,如果该文件时空文件,将该文件开始的簇号转化为该簇号所对应的扇区。如果不是空文件,则需要查找该文件的尾簇,文件的尾簇为0x0fffffff。
5.写文件的流程:
如果文件开始的簇号为0,说明该文件是个空文件,首先在FAT表中寻找一个空簇号给该文件的起始簇号,并将该簇号标记为文件的尾簇
如果文件不为空,从该文件的尾簇所对应的起始扇区开始读取一簇的内容保存起来,如果该要写入的文件长度加上文件起始长度大于一个簇的话,先算出该簇剩余的字节数,将要写入的数据的部分长度先写入到该簇的保存的变量中,并将该文件簇的偏移量置为设为0,然后寻找下一空簇号。方法:将该文件的尾簇所对应的起始扇区,开始查找,首先将该簇号转化成相对应在FAT表中的扇区位置,读取该扇区的内容,然后查找(查找范围为当前扇区到FAT结束的扇区,如果没有空簇,则回查),查找的目的就是就是将当前簇号链接到下一空簇的内容,再将下一空簇内容记为0x0fffffff(对于FAT32格式)或者记为0xffff(FAT16格式);
6.USB设备接口描述符对应的的bInterfaceClass=8,说明该设备为海量存储类设备
7. 当没有设备连接到USB端口时,和D+和D-线相连的下拉电阻(15K)保证数据线接地,USB设备必须至少在D+和D-线的任意一条上有一个上拉电阻(1.5K,电压3.0-3.6V)。全速设备D+上拉,低速设备D-上拉。保持时间2.5us。
8.如何在FAT表中寻找一个空簇,首先确定查找范围(FAT表的起始扇区到FAT表的结束扇区),分别读取每个扇区的内容,如果读取的内容值为0,说明该簇为空簇,记录下该簇的簇号,如果是FAT表中的第i个扇区的第j个字节,簇号为i*256+j(FAT16格式),簇号为i*128+j(FAT32格式)
9.如何将簇号转换成扇区呢? 数据区的簇号从2开始的,簇号N所对应的扇区为
(N-2)*每簇所占的扇区数+数据区的起始扇区
10.如果写入的文件长度+文件原有的长度大于一个簇的话,就需要链接到新的空
簇号,将该空簇号标记为已用簇,
11,簇的大小决定了该盘数据区的利用率。FAT16系统簇号用16位二进制数表示,从0002H到FFEFH个可用簇号(FFF0H到FFFFH另有定义,用来表示坏簇,文件结束簇等),允许每一逻辑盘的数据区最多不超过FFEDH(65518)个簇。FAT32系统簇号改用32位二进制数表示,大致从0000002H到FFFFFEFFH个可用簇号.
12 开发从机时碰到的一些问题:
1.设置地址时,要先设定地址,再发一个空包给主机
2.设备枚举过程:
1.主机发送80 06 00 01 00 00 40 00
从机回送端点0大小个字节
2.主机发送00 05 02 00 00 00 00 00
从机回送一个空包给主机
3.主机发送80 06 00 01 00 00 12 00
从机回送18个设备描述符
4.
文章评论(0条评论)
登录后参与讨论