中级会员
 
- 积分
- 277
- 金钱
- 277
- 注册时间
- 2014-12-12
- 在线时间
- 30 小时
|
本帖最后由 JM哆啦a梦 于 2016-2-1 15:41 编辑
这几天用原子哥的USB读卡器例程来模拟U盘发现一个奇怪的问题,从模拟的U盘把文件复制进去,用FATFS文件系统居然找不到,插上读卡器在电脑上读取也找不到。再把文件通过读卡器复制到卡里面,这回打开通过32模拟出来的U盘里面找不到了。分析了一下代码,终于找到了问题所在,关键在于mass_mal.c文件中的MAL_Write()和MAL_Read( )函数,如图1所示,Memory_Offset中的变量是32bit的地址,虽然最终传递给SPI读写函数的地址已经变成扇区地址,即Memory_Offset>>9,但是地址传递进MAL_Write()和MAL_Read( )函数时候已经溢出了,即该函数最大还是只能支持4G卡,具体的修改方法如下:
1.mass_mal.c中的 u16 MAL_Write(u8 lun, u32 Memory_Offset, u32 *Writebuff, u16 Transfer_Length) 和 u16 MAL_Read(u8 lun, u32 Memory_Offset, u32 *Readbuff, u16 Transfer_Length)改成-> u16 MAL_Write(u8 lun, uint64_t Memory_Offset, u32 *Writebuff, u16 Transfer_Length) 和u16 MAL_Read(u8 lun, uint64_t Memory_Offset, u32 *Readbuff, u16 Transfer_Length) mass_mal.h中的函数声明也要修改成64bit的。
图1
2.调用MAL_Write()和 MAL_Read()的函数也要修改,使得传递给这两个函数的地址是64bit的,分别是void Write_Memory (u8 lun, u32 Memory_Offset, u32 Transfer_Length)和和函数void Write_Memory (u8 lun, u32 Memory_Offset, u32 Transfer_Length) ,如图2、3所示,两个函数中的static u32 Offset, Length;改成 static uint64_t Offset, Length;
图2
图3
3、第三个是SD_WriteDisk()和 SD_ReadDisk(),中的形参32bit 的sector,如果要执行函数里面的sector <<= 9;那么也是溢出的,但是SD卡是按照扇区地址来操作的,故不再执行 sector <<= 9(将扇区地址变成字节地址),即不会溢出,故SD_WriteDisk()和 SD_ReadDisk()函数可以可以不做修改。
图4
至此,4G以上的SD卡已成功支持。看一下实验现象。
8G 的TF卡,用了5G多了
8g的TF卡
普通读卡器读到的文件
普通读卡器读到的文件
修改程序前模拟U盘读到的文件
未修改程序前的文件
修改程序后模拟U盘读到的文件
修改程序后
可以看到修改程序后读取8G的内存卡,读到的文件和市面上卖的读卡器读到的是一样的,而未修改前的程序读到的则由很多乱码。上传源代码
实验50 USB读卡器实验(支持4G以上的SD卡).rar
(976.05 KB, 下载次数: 343)
|
|