- SD卡底层驱动代码量不小功能稍微有点复杂,其他的功能不说了;本博文主要介绍SD卡V1.0和V2.0版本的SD卡的容量结算;
)会获取SD卡的三个重要信息作为f_fdisk和f_mkfs函数为整个SD卡分区和挂载文件系统的依据;
- 下面的代码来自于STM32官方提供的固件库的SD卡例程但是:例程里边有错误的地方需要修改,如果不修改有可能会影响到FatFS系统迻植时分区的问题在博文的最后有特别指出;
- 看懂本文需要有SD卡开发经验和FATFS文件系统移植经验基础的同志;
1.获取并处理CSD寄存器数据
-
获取SD鉲CSD寄存器数据。执行SD_GetCardInfo函数将CSD寄存器的值全部赋值到CSD结构体;要获取的数据如下表(来自SD卡V2.0协议)
对于V1.0的卡来说,要获取下面几组数据:
對于V2.0的卡来说只需获取一个数据:
所对应的代码下面列出来,但是注意我们所要用到的V1.0和V2.0的参数本身不多所有我对结构体做出适当的修剪:
* 这个结构体包含了SD卡的CSD寄存器和CID寄存器,这里我们只讨论CSD寄存器
- 通过上面一顿操作我们将想要的信息整理了出来分别是:
用于V2.0计算的:C_SIZE;(注意两个C_SIZE的位宽是不一样的)
特别注意:尤其是V2.0的SD卡最大可以达到32G类型,防止溢出;
4. 但是这里有一个问题(怎样启用内存卡卡小于等于4GB的请忽略下面)
问题:在对SD卡进行FatFS系统移植的时候我在实验中发现STM32官方提供的SD卡程序只能支持0~4G以内的SD卡(其实不能说是BUG,严格的说昰一个移植不兼容的问题);详细问题情况如下:
但是实际上厂家并不会这么精准(唉)所最终我的怎样启用内存卡卡的容量最终如下圖(我们暂且取14.6GB):
- 下面对这个SD卡直接用上面移植来的SD卡例程和FATFS文件系统对其进行平均4分区,分区后如下:
会发现:有4个相等的有效分区和一个12G的未分配区间,为什么会产生这个问题14.6GB的怎样启用内存卡不应该是都是3.65GB吗?
原因:看下面这段代码这段代码是FATFS文件系统中一個命令控制函数,FATFS文件系统用它来获取分区的依据;
case CTRL_TRIM: //告诉设备此扇区块(cmd中包含的地址)不再需要可以擦除;
对,就是V2.0的计算公式;然而再准确的说原因是:cardinfo->SD_csd.DeviceSize这个成员变量的数据类型,如下定义:
通过计算可知:uint32_t的最大表示值为0xFFFF FFFF = (4GB-1Byte)如果超出4G,则势必会发生溢出从而导致数据错误,再引起分区错误;
解决办法:修改如图两个地方即可:
基本上完成了4平分(最后的13M,强迫症表示接受不了!!!)
}