微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32的FATFS文件系统移植笔记

STM32的FATFS文件系统移植笔记

时间:11-26 来源:互联网 点击:

      1. DRESULT disk_read (
      2. BYTE drv, /* Physical drive nmuber (0..) */
      3. BYTE *buff, /* Data buffer to store read data */
      4. DWORD sector, /* Sector address (LBA) */
      5. BYTE count /* Number of sectors to read (1..255) */
      6. )
      7. {
      8. int Status;
      9. if( !count )
      10. {
      11. return RES_PARERR;/* count不能等于0,否则返回参数错误 */
      12. }
      13. switch (drv)
      14. {
      15. case 0:
      16. if(count==1) /* 1个sector的读操作 */
      17. {
      18. Status =MSD0_ReadSingleBlock( sector ,buff );
      19. if(Status == 0){
      20. return RES_OK;
      21. }else{
      22. return RES_ERROR;
      23. }
      24. }
      25. else /* 多个sector的读操作 */
      26. {
      27. Status = MSD0_ReadMultiBlock( sector , buff ,count);
      28. if(Status == 0){
      29. return RES_OK;
      30. }else{
      31. return RES_ERROR;
      32. }
      33. }
      34. case 1:
      35. if(count==1) /* 1个sector的读操作 */
      36. {
      37. return RES_OK;
      38. }
      39. else /* 多个sector的读操作 */
      40. {
      41. return RES_OK;
      42. }
      43. default:
      44. return RES_ERROR;
      45. }
      46. }

      复制代码

      MSD0_ReadSingleBlock()和MSD0_ReadMultiBlock()函数都是SD卡操作的底层函数,我们在SPI_MSD0_Driver.c文件中实现。
      6、实现disk_write()函数
      该函数主要实现对SD卡进行写数据操作,和读数据操作一样也分单块写和多块写,建议实现多块写的方式,这样可以提高写数据速度。
      实现后的程序如下:

      1. DRESULT disk_write (
      2. BYTE drv, /* Physical drive nmuber (0..) */
      3. const BYTE *buff, /* Data to be written */
      4. DWORD sector, /* Sector address (LBA) */
      5. BYTE count /* Number of sectors to write (1..255) */
      6. )
      7. {
      8. int Status;
      9. if( !count )
      10. {
      11. return RES_PARERR;/* count不能等于0,否则返回参数错误 */
      12. }
      13. switch (drv)
      14. {
      15. case 0:
      16. if(count==1) /* 1个sector的写操作 */
      17. {
      18. Status = MSD0_WriteSingleBlock( sector , (uint8_t *)(&buff[0]) );
      19. if(Status == 0){
      20. return RES_OK;
      21. }else{
      22. return RES_ERROR;
      23. }
      24. }
      25. else /* 多个sector的写操作 */
      26. {
      27. Status = MSD0_WriteMultiBlock( sector , (uint8_t *)(&buff[0]) , count );
      28. if(Status == 0){
      29. return RES_OK;
      30. }else{
      31. return RES_ERROR;
      32. }
      33. }
      34. case 1:
      35. if(count==1) /* 1个sector的写操作 */
      36. {
      37. return RES_OK;
      38. }
      39. else /* 多个sector的写操作 */
      40. {
      41. return RES_OK;
      42. }
      43. default:return RES_ERROR;
      44. }
      45. }

      复制代码

      MSD0_WriteSingleBlock()和MSD0_WriteMultiBlock()函数都是SD卡操作的底层函数,我们在SPI_MSD0_Driver.c文件中实现。
      7、实现disk_ioctl()函数
      该函数在磁盘格式化、获取文件系统信息等操作时会被调用。
      实现后的程序如下:

      1. DRESULT disk_ioctl (
      2. BYTE drv, /* Physical drive nmuber (0..) */
      3. BYTE ctrl, /* Control code */
      4. void *buff /* Buffer to send/receive control data */
      5. )
      6. {
      7. if (drv==0)
      8. {
      9. MSD0_GetCardInfo(&SD0_CardInfo);
      10. switch (ctrl)
      11. {
      12. case CTRL_SYNC :
      13. return RES_OK;
      14. case GET_SECTOR_COUNT :
      15. *(DWORD*)buff = SD0_CardInfo.Capacity/SD0_CardInfo.BlockSize;
      16. return RES_OK;
      17. case GET_BLOCK_SIZE :
      18. *(WORD*)buff = SD0_CardInfo.BlockSize;
      19. return RES_OK;

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top