查看: 6257|回复: 3

[分享] LPC55S69之FatFs_SDCard

[复制链接]
  • TA的每日心情
    开心
    2025-7-10 13:07
  • 签到天数: 43 天

    连续签到: 1 天

    [LV.5]常住居民I

    56

    主题

    548

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    1528

    热心会员

    最后登录
    2025-7-23
    发表于 2020-4-3 13:07:37 | 显示全部楼层 |阅读模式
    LPC55S69之FatFs_SDCard


    LPC55S69的SD卡操作,需要使用FatFs文件系统,官方提供了个例子,是可用的,这里做少量改动,以便于实际使用。


    一、导入FatFs_SDCard例子。
    7.png
    把例子中的fatfs文件夹,拷贝到自己的工程中。
    8.png
    二、增加组件和设置源文件搜索路径。


    1、增加SD卡的相关组件。
    1.png
    2.png
    3.png
    2、设置源文件的搜索路径。
    4.png
    5.png
    在includes和general都要添加fatfs_include路径。


    三、引脚。
    6.png
    四、代码。


    1、fatfs_sdcard.h
    1. <font size="3" face="微软雅黑">
    2. #ifndef FATFS_SDCARD_H_
    3. #define FATFS_SDCARD_H_

    4. #include <stdio.h>
    5. #include <string.h>
    6. #include "fsl_sd.h"
    7. #include "fsl_debug_console.h"
    8. #include "ff.h"
    9. #include "diskio.h"
    10. #include "fsl_sd_disk.h"
    11. #include "board.h"

    12. #include "pin_mux.h"
    13. #include <stdbool.h>
    14. #include "fsl_iocon.h"

    15. /* buffer size (in byte) for read/write operations */
    16. #define BUFFER_SIZE (100U)

    17. extern FATFS g_fileSystem; /* File system object */
    18. extern FIL g_fileObject;   /* File object */

    19. extern SDK_ALIGN(uint8_t g_bufferWrite[SDK_SIZEALIGN(BUFFER_SIZE, SDMMC_DATA_BUFFER_ALIGN_CACHE)],
    20.           MAX(SDMMC_DATA_BUFFER_ALIGN_CACHE, SDMMCHOST_DMA_BUFFER_ADDR_ALIGN));
    21. extern SDK_ALIGN(uint8_t g_bufferRead[SDK_SIZEALIGN(BUFFER_SIZE, SDMMC_DATA_BUFFER_ALIGN_CACHE)],
    22.           MAX(SDMMC_DATA_BUFFER_ALIGN_CACHE, SDMMCHOST_DMA_BUFFER_ADDR_ALIGN));

    23. extern const sdmmchost_detect_card_t s_sdCardDetect;

    24. extern FRESULT error;
    25. extern UINT bytesWritten;
    26. extern UINT bytesRead;
    27. extern const TCHAR driverNumberBuffer[];
    28. extern TCHAR * fileName;

    29. void fatfs_sdcard_init(void);
    30. void fatfs_sdcard_read(void);
    31. void fatfs_sdcard_write(void);

    32. status_t sdcardWaitCardInsert(void);

    33. #endif /* FATFS_SDCARD_H_ */

    34. </font>
    复制代码
    2、fatfs_sdcard.c
    1. <font size="3" face="微软雅黑">#include "fatfs_sdcard.h"

    2. FATFS g_fileSystem; /* File system object */
    3. FIL g_fileObject;   /* File object */

    4. SDK_ALIGN(uint8_t g_bufferWrite[SDK_SIZEALIGN(BUFFER_SIZE, SDMMC_DATA_BUFFER_ALIGN_CACHE)],
    5.           MAX(SDMMC_DATA_BUFFER_ALIGN_CACHE, SDMMCHOST_DMA_BUFFER_ADDR_ALIGN));
    6. SDK_ALIGN(uint8_t g_bufferRead[SDK_SIZEALIGN(BUFFER_SIZE, SDMMC_DATA_BUFFER_ALIGN_CACHE)],
    7.           MAX(SDMMC_DATA_BUFFER_ALIGN_CACHE, SDMMCHOST_DMA_BUFFER_ADDR_ALIGN));

    8. const sdmmchost_detect_card_t s_sdCardDetect = {
    9.     .cdType = BOARD_SD_DETECT_TYPE,
    10.     .cdTimeOut_ms = (~0U),
    11. };

    12. FRESULT error;
    13. UINT bytesWritten;
    14. UINT bytesRead;
    15. const TCHAR driverNumberBuffer[3U] = {SDDISK + '0', ':', '/'};

    16. TCHAR * fileName = "/config.txt";

    17. void fatfs_sdcard_init(void) {
    18.         static uint8_t initFlag = 0;
    19.         if(initFlag == 0)  {
    20.                 CLOCK_EnableClock(kCLOCK_InputMux);
    21.                 CLOCK_AttachClk(BOARD_SDIF_CLK_ATTACH);
    22.                 CLOCK_SetClkDiv(kCLOCK_DivSdioClk, (uint32_t)(SystemCoreClock / FSL_FEATURE_SDIF_MAX_SOURCE_CLOCK + 1U), true);
    23.                 initFlag = 1;
    24.         }

    25.     if (sdcardWaitCardInsert() != kStatus_Success) {
    26.             PRINTF("\r\nPlease insert a card into board.\r\n");
    27.     }
    28.     if (f_mount(&g_fileSystem, driverNumberBuffer, 0U)) {
    29.         PRINTF("Mount volume failed.\r\n");
    30.     }
    31. #if (FF_FS_RPATH >= 2U)
    32.     error = f_chdrive((char const *)&driverNumberBuffer[0U]);
    33.     if (error) {
    34.         PRINTF("Change drive failed.\r\n");
    35.     }
    36. #endif
    37. }

    38. void fatfs_sdcard_write(void) {
    39.         uint8_t i;

    40.         PRINTF("Write.\r\n");
    41.     error = f_open(&g_fileObject, (const TCHAR*)fileName, (FA_WRITE | FA_CREATE_ALWAYS));
    42.     if (error) {
    43.         if (error == FR_EXIST) {
    44.             PRINTF("File exists.\r\n");
    45.         } else {
    46.             PRINTF("Open file failed.\r\n");
    47.         }
    48.         fatfs_sdcard_init();
    49.         error = f_open(&g_fileObject, (const TCHAR*)fileName, (FA_WRITE | FA_CREATE_ALWAYS));
    50.     }

    51.     for(i=0;i<8;i++) { // Writting Bytes
    52.             g_bufferWrite[i] = '0' +i;
    53.     }

    54.     error = f_write(&g_fileObject, g_bufferWrite, sizeof(g_bufferWrite), &bytesWritten);
    55.     if ((error) || (bytesWritten != sizeof(g_bufferWrite))) {
    56.             PRINTF("Write file failed. \r\n");
    57.     }

    58.     if (f_close(&g_fileObject)) {
    59.         PRINTF("\r\nClose file failed.\r\n");
    60.     }
    61. }

    62. void fatfs_sdcard_read(void) {
    63.         uint8_t i;

    64.         PRINTF("Read.\r\n");
    65.     error = f_open(&g_fileObject, (const TCHAR*)fileName, FA_READ);
    66.     if (error) {
    67.         if (error == FR_EXIST) {
    68.             PRINTF("File exists.\r\n");
    69.         } else {
    70.             PRINTF("Open file failed.\r\n");
    71.         }
    72.         fatfs_sdcard_init();
    73.         error = f_open(&g_fileObject, (const TCHAR*)fileName, FA_READ);
    74.     }
    75.     if (f_lseek(&g_fileObject, 0U)) {
    76.             PRINTF("Set file pointer position failed. \r\n");
    77.     }

    78.     memset(g_bufferRead, 0U, sizeof(g_bufferRead));
    79.     error = f_read(&g_fileObject, g_bufferRead, sizeof(g_bufferRead), &bytesRead);
    80.     if ((error) || (bytesRead != sizeof(g_bufferRead))) {
    81.             PRINTF("Read file failed. \r\n");
    82.     }

    83.     for(i=0;i<8;i++) { // Read Bytes
    84.             PRINTF("%c",g_bufferRead[i]);
    85.     }

    86.     if (f_close(&g_fileObject)) {
    87.         PRINTF("\r\nClose file failed.\r\n");
    88.     }
    89. }

    90. status_t sdcardWaitCardInsert(void) {
    91.     g_sd.host.base           = SD_HOST_BASEADDR;
    92.     g_sd.host.sourceClock_Hz = SD_HOST_CLK_FREQ;
    93.     g_sd.usrParam.cd = &s_sdCardDetect;
    94.     if (SD_HostInit(&g_sd) != kStatus_Success) {
    95.         PRINTF("\r\nSD host init fail\r\n");
    96.         return kStatus_Fail;
    97.     }
    98.     SD_PowerOffCard(g_sd.host.base, g_sd.usrParam.pwr);
    99.     if (SD_WaitCardDetectStatus(SD_HOST_BASEADDR, &s_sdCardDetect, true) == kStatus_Success) {
    100.         PRINTF("\r\nCard inserted.\r\n");
    101.         SD_PowerOnCard(g_sd.host.base, g_sd.usrParam.pwr);
    102.     } else {
    103.         PRINTF("\r\nCard detect fail.\r\n");
    104.         return kStatus_Fail;
    105.     }
    106.     return kStatus_Success;
    107. }</font>
    复制代码
    3、main.c
    1. <font size="3" face="微软雅黑">#include "fatfs_sdcard.h"

    2. int main(void) {
    3.     CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
    4.     BOARD_InitPins();
    5.     BOARD_BootClockPLL150M();
    6.     BOARD_InitDebugConsole();

    7.     PRINTF("FATFS SDCard example.\r\n");
    8.     fatfs_sdcard_init();
    9.     fatfs_sdcard_write();
    10.     fatfs_sdcard_read();
    11.     while(1){
    12.     }
    13. }

    14. </font>
    复制代码
    五、说明。


    编译、调试、运行后,可以在控制台上看到以下现象。


    在SD卡中写入字符0~7,再读出来。


    修改g_bufferWrite和g_bufferRead的值,再调用fatfs_sdcard_write()和fatfs_sdcard_read(),即可方便读写SD卡。


    六、其它问题。


    1、读写SD卡需要将g_bufferWrite和g_bufferRead都要做好4字符对齐,每次读写的字节数均可以被4整除,而且要小于512字节,否则读写速度很慢。


    2、测试用的SD卡为32G。






    文章出处:点击


    签到签到
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2025-8-8 16:43
  • 签到天数: 1504 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    97

    主题

    4693

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    10105
    最后登录
    2025-9-11
    发表于 2020-4-3 14:21:50 | 显示全部楼层
    这个示例很喜欢。
    学习和研究FATFS有些日子了
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-7-10 13:07
  • 签到天数: 43 天

    连续签到: 1 天

    [LV.5]常住居民I

    56

    主题

    548

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    1528

    热心会员

    最后登录
    2025-7-23
     楼主| 发表于 2020-4-7 09:31:59 | 显示全部楼层
    jobszheng5 发表于 2020-4-3 14:21
    这个示例很喜欢。
    学习和研究FATFS有些日子了

    一起加油
    签到签到
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-8-8 16:43
  • 签到天数: 1504 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    97

    主题

    4693

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    10105
    最后登录
    2025-9-11
    发表于 2020-4-7 10:02:17 | 显示全部楼层
    楼主您了已经领先好多了
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-12 04:02 , Processed in 0.095901 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表