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

STM32的FATFS文件系统移植笔记

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

      1. case 0:
      2. if(count==1) /* 1个sector的写操作 */
      3. {
      4. return RES_OK;
      5. }
      6. else /* 多个sector的写操作 */
      7. {
      8. return RES_OK;
      9. }
      10. case 1:
      11. if(count==1) /* 1个sector的写操作 */
      12. {
      13. return RES_OK;
      14. }
      15. else /* 多个sector的写操作 */
      16. {
      17. return RES_OK;
      18. }
      19. default:return RES_ERROR;
      20. }
      21. }

      复制代码

      FATFS磁盘控制函数:

      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. switch (ctrl)
      10. {
      11. case CTRL_SYNC :
      12. return RES_OK;
      13. case GET_SECTOR_COUNT :
      14. return RES_OK;
      15. case GET_BLOCK_SIZE :
      16. return RES_OK;
      17. case CTRL_POWER :
      18. break;
      19. case CTRL_LOCK :
      20. break;
      21. case CTRL_EJECT :
      22. break;
      23. /* MMC/SDC command */
      24. case MMC_GET_TYPE :
      25. break;
      26. case MMC_GET_CSD :
      27. break;
      28. case MMC_GET_CID :
      29. break;
      30. case MMC_GET_OCR :
      31. break;
      32. case MMC_GET_SDSTAT :
      33. break;
      34. }
      35. }else if(drv==1){
      36. switch (ctrl)
      37. {
      38. case CTRL_SYNC :
      39. return RES_OK;
      40. case GET_SECTOR_COUNT :
      41. return RES_OK;
      42. case GET_SECTOR_SIZE :
      43. return RES_OK;
      44. case GET_BLOCK_SIZE :
      45. return RES_OK;
      46. case CTRL_POWER :
      47. break;
      48. case CTRL_LOCK :
      49. break;
      50. case CTRL_EJECT :
      51. break;
      52. /* MMC/SDC command */
      53. case MMC_GET_TYPE :
      54. break;
      55. case MMC_GET_CSD :
      56. break;
      57. case MMC_GET_CID :
      58. break;
      59. case MMC_GET_OCR :
      60. break;
      61. case MMC_GET_SDSTAT :
      62. break;
      63. }
      64. }
      65. else{
      66. return RES_PARERR;
      67. }
      68. return RES_PARERR;
      69. }

      复制代码

      以上函数都只是实现一个框架,并没有做实际的事情,下一步就需要把操作SD卡的程序填充在这个框架里面。
      4、实现disk_initialize()函数
      该函数在挂载文件系统的时候会被调用,主要是实现读写SD卡前对SD卡进行初始化,根据SD卡的传输协议,我们按照如下步骤初始化SD卡:
      a、判断SD卡是否插入,可以通过检查SD卡卡座的CD脚电平进行判断,一般插入卡后该引脚会变成低电平。
      b、稍微延时一段时间后发送至少74个时钟给SD卡。
      c、发送CMD0命令给SD卡,直到SD卡返回0x01为止,这里可以循环多次发送。
      程序如下:

      1. /* Start send CMD0 till return 0x01 means in IDLE state */
      2. for(retry=0; retry<0xFFF; retry++)
      3. {
      4. r1 = MSD0_send_command(CMD0, 0, 0x95);
      5. if(r1 == 0x01)
      6. {
      7. retry = 0;
      8. break;
      9. }
      10. }

      复制代码

      d、发送CMD8获取卡的类型,不同类型的卡其初始化方式有所不同。
      e、根据卡的类型对卡进行初始化。具体初始化方式可以参考附件程序。
      注:在初始化SD卡之前应该初始化SPI接口和相关的管脚。
      实现后的程序如下:

      1. DSTATUS disk_initialize (
      2. BYTE drv /* Physical drive nmuber (0..) */
      3. )
      4. {
      5. int Status;
      6. switch (drv)
      7. {
      8. case 0 :
      9. Status = MSD0_Init();
      10. if(Status==0){
      11. return RES_OK;
      12. }else{
      13. return STA_NOINIT;
      14. }
      15. case 1 :
      16. return RES_OK;
      17. case 2 :
      18. return RES_OK;
      19. case 3 :
      20. return RES_OK;
      21. default:
      22. return STA_NOINIT;
      23. }
      24. }

      复制代码

      MSD0_Init()函数在SPI_MSD0_Driver.c文件中实现。
      5、实现disk_read()函数
      该函数是读取SD卡扇区数据的函数,根据SD卡数据传输协议可知有读取单扇区和读取多扇区两种操作模式,为提高读文件的速度应该实现读取多扇区函数。
      实现后的程序如下:

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

网站地图

Top