当前位置:首页 > 在STM32中移植FATFS文件系统
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.
44. default:
45. return RES_ERROR; 46. } 47. }
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.
44. default:return RES_ERROR; 45. } 46. }
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; 20. case CTRL_POWER : 21. break; 22. case CTRL_LOCK : 23. break; 24. case CTRL_EJECT : 25. break; 26. /* MMC/SDC command */ 27. case MMC_GET_TYPE : 28. break;
29. case MMC_GET_CSD : 30. break;
31. case MMC_GET_CID : 32. break;
33. case MMC_GET_OCR : 34. break;
35. case MMC_GET_SDSTAT : 36. break; 37. } 38. }else if(drv==1){ 39. switch (ctrl) 40. {
41. case CTRL_SYNC : 42. return RES_OK; 43. case GET_SECTOR_COUNT : 44. return RES_OK;
45. case GET_SECTOR_SIZE : 46. return RES_OK; 47. case GET_BLOCK_SIZE : 48. return RES_OK; 49. case CTRL_POWER : 50. break; 51. case CTRL_LOCK : 52. break; 53. case CTRL_EJECT : 54. break; 55. /* MMC/SDC command */ 56. case MMC_GET_TYPE : 57. break;
58. case MMC_GET_CSD :
59. break;
60. case MMC_GET_CID : 61. break;
62. case MMC_GET_OCR : 63. break;
64. case MMC_GET_SDSTAT : 65. break; 66. } 67. }
68. else{ 69. return RES_PARERR; 70. }
71. return RES_PARERR; 72. }
复制代码
MSD0_GetCardInfo()函数也在SPI_MSD0_Driver.c文件中实现,其中SD0_CardInfo为PMSD_CARDINFO类型的全局变量,它在SPI_MSD0_Driver.h文件中被定义。
8、到此diskio.c这个文件中的所有函数就已经实现,下一步就是实现SPI_MSD0_Driver.c文件中的相关函数,SPI_MSD0_Driver.c文件可以在网上下载,参考的程序比较多,本工程使用的这个文件也是在网上下载并进行一定的修改过的。本文件中函数的实现方式可以参考源代码。
五、文件系统测试 1、测试写文件 测试代码如下:
1. //写文件测试
2. printf(\
3. res = f_open(&fdst, \4. if(res != FR_OK){
5. printf(\6. }else{
7. res=f_write(&fdst,textFileBuffer,sizeof(textFileBuffer),&bw);
/* Write it to the dst file */ 8. if(res == FR_OK){
9. printf(\10. }else{
11. printf(\12. }
13. /*close file */ 14. f_close(&fdst); 15. }
共分享92篇相关文档