- UID
- 1029342
- 性别
- 男
|
以上函数都只是实现一个框架,并没有做实际的事情,下一步就需要把操作SD卡的程序填充在这个框架里面。
4、实现disk_initialize()函数
该函数在挂载文件系统的时候会被调用,主要是实现读写SD卡前对SD卡进行初始化,根据SD卡的传输协议,我们按照如下步骤初始化SD卡:
a、判断SD卡是否插入,可以通过检查SD卡卡座的CD脚电平进行判断,一般插入卡后该引脚会变成低电平。
b、稍微延时一段时间后发送至少74个时钟给SD卡。
c、发送CMD0命令给SD卡,直到SD卡返回0x01为止,这里可以循环多次发送。
程序如下:
- /* Start send CMD0 till return 0x01 means in IDLE state */
- for(retry=0; retry<0xFFF; retry++)
- {
- r1 = MSD0_send_command(CMD0, 0, 0x95);
- if(r1 == 0x01)
- {
- retry = 0;
- break;
- }
- }
复制代码
d、发送CMD8获取卡的类型,不同类型的卡其初始化方式有所不同。
e、根据卡的类型对卡进行初始化。具体初始化方式可以参考附件程序。
注:在初始化SD卡之前应该初始化SPI接口和相关的管脚。
实现后的程序如下:
- DSTATUS disk_initialize (
- BYTE drv /* Physical drive nmuber (0..) */
- )
- {
- int Status;
- switch (drv)
- {
- case 0 :
- Status = MSD0_Init();
- if(Status==0){
- return RES_OK;
- }else{
- return STA_NOINIT;
- }
- case 1 :
- return RES_OK;
- case 2 :
- return RES_OK;
- case 3 :
- return RES_OK;
- default:
- return STA_NOINIT;
- }
- }
复制代码
MSD0_Init()函数在SPI_MSD0_Driver.c文件中实现。
5、实现disk_read()函数
该函数是读取SD卡扇区数据的函数,根据SD卡数据传输协议可知有读取单扇区和读取多扇区两种操作模式,为提高读文件的速度应该实现读取多扇区函数。
实现后的程序如下:
- DRESULT disk_read (
- BYTE drv, /* Physical drive nmuber (0..) */
- BYTE *buff, /* Data buffer to store read data */
- DWORD sector, /* Sector address (LBA) */
- BYTE count /* Number of sectors to read (1..255) */
- )
- {
- int Status;
- if( !count )
- {
- return RES_PARERR; /* count不能等于0,否则返回参数错误 */
- }
- switch (drv)
- {
- case 0:
- if(count==1) /* 1个sector的读操作 */
- {
- Status = MSD0_ReadSingleBlock( sector ,buff );
- if(Status == 0){
- return RES_OK;
- }else{
- return RES_ERROR;
- }
- }
- else /* 多个sector的读操作 */
- {
- Status = MSD0_ReadMultiBlock( sector , buff ,count);
- if(Status == 0){
- return RES_OK;
- }else{
- return RES_ERROR;
- }
- }
- case 1:
- if(count==1) /* 1个sector的读操作 */
- {
- return RES_OK;
- }
- else /* 多个sector的读操作 */
- {
- return RES_OK;
- }
- default:
- return RES_ERROR;
- }
- }
复制代码
MSD0_ReadSingleBlock()和MSD0_ReadMultiBlock()函数都是SD卡操作的底层函数,我们在SPI_MSD0_Driver.c文件中实现。 |
|