|
想了想,还是发在这里~用着硬汉哥的SDIO驱动蛮稳定的(目前使用大半年)。当然也魔改了一点点的。本来项目里sd卡用的操作不多,就新增、读、写、删除;
今天偶然用来格式化sd卡,发现有问题。乱码;容量不对,偏大的32g变500g;偏小的写成fat磁盘格式(16mb大小)
光修改入参,最好的条件是写成fat磁盘格式。能用,但浪费了32g那么大的容量,怎么能忍。
后面查了下驱动代码,改了disk_ioctl函数就好了。
下面是解题思路;哈哈哈
测试环境基于stm32f407zg、标准库、 fatfs是R0.10b 版本的
稳定版本驱动来源是硬汉哥的sdio dma驱动;下面这个
- https://forum.anfulai.cn/forum.php?mod=viewthread&tid=98560&highlight=sdio
复制代码
disk_ioctl更改后的函数
- DRESULT disk_ioctl (
- BYTE pdrv, /* Physical drive nmuber (0..) */
- BYTE cmd, /* Control code */
- void *buff /* Buffer to send/receive control data */
- )
- {
- DRESULT res;
- switch (pdrv) {
- case FS_SD :
- switch(cmd)
- {
- case CTRL_SYNC:
- res = RES_OK;
- break;
- case GET_SECTOR_SIZE:
- *(DWORD*)buff = 512;
- res = RES_OK;
- break;
- case GET_BLOCK_SIZE:
- *(WORD*)buff = SDCardInfo.CardBlockSize;
- res = RES_OK;
- break;
- case GET_SECTOR_COUNT:
- *(DWORD*)buff = SDCardInfo.CardCapacity/512;
- res = RES_OK;
- break;
- default:
- res = RES_PARERR;
- break;
- }
- return res;
- case FS_NAND :
- res = RES_OK;
- return res;
- }
- return RES_PARERR;
- }
复制代码 分析原因就是在格式化的时候,调用disk_ioctl 并没有返回合适的sd卡尺寸大小,导致无法选为fat32格式。
在格式化的前面,需要马上挂载文件系统;f_mount(&fs, FS_VOLUME_SD, 1);
操作完了,马上卸载文件系统即可;f_mount(NULL, FS_VOLUME_SD, 1);
貌似是不能延迟挂载的。
|
评分
-
查看全部评分
|