首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM32的FATFS文件系统移植笔记(3)

STM32的FATFS文件系统移植笔记(3)

复制代码以上函数都只是实现一个框架,并没有做实际的事情,下一步就需要把操作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文件中实现。
    6、实现disk_write()函数
        该函数主要实现对SD卡进行写数据操作,和读数据操作一样也分单块写和多块写,建议实现多块写的方式,这样可以提高写数据速度。
        实现后的程序如下:
  • DRESULT disk_write (
  •                 BYTE drv,                        /* Physical drive nmuber (0..) */
  •                 const BYTE *buff,                /* Data to be written */
  •                 DWORD sector,                /* Sector address (LBA) */
  •                 BYTE count                        /* Number of sectors to write (1..255) */
  •         )
  •         {
  •                 int Status;
  •                 if( !count )
  •                 {
  •                         return RES_PARERR;  /* count不能等于0,否则返回参数错误 */
  •                 }
  •                 switch (drv)
  •                 {
  •                         case 0:
  •                             if(count==1)            /* 1个sector的写操作 */
  •                             {
  •                                         Status = MSD0_WriteSingleBlock( sector , (uint8_t *)(&buff[0]) );
  •                                         if(Status == 0){
  •                                                 return RES_OK;
  •                                         }else{
  •                                                 return RES_ERROR;
  •                                         }
  •                             }
  •                             else                    /* 多个sector的写操作 */
  •                             {
  •                                         Status = MSD0_WriteMultiBlock( sector , (uint8_t *)(&buff[0]) , 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;
  •                 }
  •         }
继承事业,薪火相传
返回列表