|
之前一直用Fatfs尝试读写U盘,实现了功能,但却发现连续高速写入之后会出现卡顿,也就意味着需要1-2M的缓存才能实现连续的高速写入
在这个帖子里问过,关于卡顿的问题:
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=22562
之后多方咨询,基本确认是一定会出现卡顿,所以就想换方法,想到V5的开发板本身自带2M的外部SRAM,用这2M做缓存应该能实现。
但我自己画的电路板已经加工了,没办法加上缓存,所以就想着是不是能直接去操作底层的函数,绕过Fatfs,也就不会产生卡顿了。
在例程里找到底层函数
Fatfs的底层函数在diskio.c里,再下一层函数在在usbh_bsp_msc.h里,直接操作的话应该就是用
USBH_MSC_Read10(&USB_OTG_Core, buff,sector,512 * count);
USBH_MSC_Write10(&USB_OTG_Core,(BYTE*)buff,sector, 512 * count);
这两个函数进行读写了吧。
我主要是用写的函数,通过观察例程里上层函数的变量传递,大致确定了里边的几个参数的意义。
&USB_OTG_Core 这个是u盘的相关结构体,跟USBH_Process()保持一致应该就行
(BYTE*)buff 这个是要写入的数据所在变量的指针
sector 这个是要写入的U盘的扇区
512 * count 这个是要写入的数据的长度,必须是512的倍数
查找了关于U盘的FAT32的大致说明,格式化U盘、新建文件,看这说明对比观察自己的u盘,用winHex观察U盘各个位置的改变,大致理解了FAT32的规则。
有了几点疑惑。
1、如果我提前先创建文件,并且把每个文件用空字符0x00写成我要的大小,那么之后我直接对着文件数据所占用的空间,
用USBH_MSC_Write10()这个函数写入数据的话,应该就能做到把数据写入U盘,同时文件还能被电脑查看了,对吗?
2、直接写入的话,并没有修改根目录所在的文件信息区域,所以只能提前用Fatfs去创建并填满文件,才能实现写入内容能被电脑查看。
USBH_MSC_Write10()这个函数一次只能写入一个扇区,也就是512Byte,但目录中一个文件的信息只占用16Byte,那如果我想要用来修改目录的某个文件的话,我应该怎么去修改呢?
(其实也就是说,Fatfs本身是怎么实现修改文件目录的呢?)
3、实际使用USBH_MSC_Write10()的时候发现,这个函数单独使用能够实现写入,但实际上还需要加上diskio.c中的部分函数才能写入,因为这个函数只是写入,并不会去等待U盘返回状态,连续写入会出现跳过的情况。
所以我截取了diskio.c中disk_write()函数的一小段,等待返回busy的值,
使用这个的话,貌似是能够连续的正确写入U盘了,写入速度也非常快,一次写入80kB的话,大概是8M/s的样子。
但总归还是担心,用这种方式使用底层函数,没有对U盘的各种信息和状态进行读取,数据写入的扇区也是通过人工查看来确定扇区的规律并确定具体的扇区数值,会出现什么潜在的问题吗? |
|