查看: 1894|回复: 3

[分享] 逐飞LPC55S69 IOT开发板之SD及FATFS

[复制链接]
  • TA的每日心情

    2024-2-5 12:06
  • 签到天数: 627 天

    [LV.9]以坛为家II

    94

    主题

    1628

    帖子

    2

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    4429

    热心会员

    最后登录
    2024-2-5
    发表于 2020-12-15 18:30:19 | 显示全部楼层 |阅读模式
    今天有空,移植了一下FATFS,当然还是在MCUXpresso的开发环境下。首先工程需要支持的外设库,如果一开始新建工程未选择的话。我们可以这样调出SDK元件的管理:
    X0.png
    X2.jpg
    X3.jpg

    选择对应的,自己需要的。然后开始配置SD的引脚:

    X5.jpg
    然后更新代码,将改动生成到代码中。如果程序中使用了FreeRTOS那么会报一个冲突。就是fsl_sdmmc_event.h里面也对systick_handle 进行了定义。报错重复重复定义。
    我们这里有2中选择:
    1、如果程序中目前用到FreeRTOS,那fsl_sdmmc_event.h里面的延时全部换成FreeRTOS的延时函数。
    2、自己定义一个延时函数。我们这里展示没开FreeRTOS,我就把之前的延时函数放到该处了。
    对应fsl_sdmmc_event.c里面的程序修改
    1. #include "fsl_sdmmc_event.h"
    2. #include "delay.h"  //自己定义的,用的utick
    3. ....
    4. void SDMMCEVENT_InitTimer(void)
    5. {
    6.     /* Set systick reload value to generate 1ms interrupt */
    7.     //SysTick_Config(CLOCK_GetFreq(kCLOCK_CoreSysClk) / 1000U);
    8. }

    9. //void SysTick_Handler(void)
    10. //{
    11. //    g_eventTimeMilliseconds++;
    12. //}
    13. void SDMMCEVENT_Delay(uint32_t milliseconds)
    14. {
    15.         /*
    16.     uint32_t startTime = g_eventTimeMilliseconds;
    17.     uint32_t periodTime = 0;
    18.     while (periodTime < milliseconds)
    19.     {
    20.         periodTime = g_eventTimeMilliseconds - startTime;
    21.     }
    22.     */
    23.         delay_ms(milliseconds);
    24. }
    复制代码
    然后在delay.c 及utick的中断函数中,增加SD的延时函数计时标志:
    1. //SD FATFS的延时 1ms触发一次
    2. extern volatile uint32_t g_eventTimeMilliseconds;

    3. //utick的中断回调函数
    4. void UTICK0_Callback(void)
    5. {
    6.         delay_count++;
    7.         //
    8.         if(delay_count%5000==0)
    9.         {
    10.                 g_eventTimeMilliseconds++;
    11.         }
    12. }
    复制代码
    接下来,我们开始写SD的初始化及挂载FATFA,及几个测试程序(挂载,创建系统,创建文件夹,读写TXT,遍历目录):
    sd.h:
    1. /*
    2. * sd.h
    3. *
    4. *  Created on: 2020年12月15日
    5. *      Author: Administrator
    6. */

    7. #ifndef SD_H_
    8. #define SD_H_

    9. #include "clock_config.h"
    10. #include "fsl_common.h"
    11. #include "fsl_reset.h"
    12. #include "fsl_gpio.h"

    13. #include <stdio.h>
    14. #include <string.h>
    15. #include "fsl_sd.h"
    16. #include "fsl_debug_console.h"
    17. #include "ff.h"
    18. #include "diskio.h"
    19. #include "fsl_sd_disk.h"

    20. #include "pin_mux.h"
    21. #include <stdbool.h>
    22. #include "fsl_iocon.h"




    23. #define BOARD_SDIF_BASEADDR SDIF
    24. #define BOARD_SDIF_CLKSRC kCLOCK_SDio
    25. #define BOARD_SDIF_CLK_FREQ CLOCK_GetSdioClkFreq()
    26. #define BOARD_SDIF_CLK_ATTACH kMAIN_CLK_to_SDIO_CLK
    27. #define BOARD_SDIF_IRQ SDIO_IRQn
    28. #define BOARD_MMC_VCC_SUPPLY kMMC_VoltageWindows270to360
    29. #define BOARD_SD_CARD_DETECT_PIN 17
    30. #define BOARD_SD_CARD_DETECT_PORT 0
    31. #define BOARD_SD_CARD_DETECT_GPIO GPIO
    32. #define BOARD_SD_DETECT_TYPE kSDMMCHOST_DetectCardByHostCD

    33. #define BOARD_SDIF_CD_GPIO_INIT()                                                                    \
    34.     {                                                                                                \
    35.         CLOCK_EnableClock(kCLOCK_Gpio2);                                                             \
    36.         GPIO_PinInit(BOARD_SD_CARD_DETECT_GPIO, BOARD_SD_CARD_DETECT_PORT, BOARD_SD_CARD_DETECT_PIN, \
    37.                      &(gpio_pin_config_t){kGPIO_DigitalInput, 0U});                                  \
    38.     }
    39. #define BOARD_SDIF_CD_STATUS() \
    40.     GPIO_PinRead(BOARD_SD_CARD_DETECT_GPIO, BOARD_SD_CARD_DETECT_PORT, BOARD_SD_CARD_DETECT_PIN)

    41. #define BOARD_SDIF_CLK_ATTACH kMAIN_CLK_to_SDIO_CLK

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

    44. extern FATFS g_fileSystem; /* File system object */
    45. extern FIL g_fileObject;   /* File object */

    46. extern SDK_ALIGN(uint8_t g_bufferWrite[SDK_SIZEALIGN(BUFFER_SIZE, SDMMC_DATA_BUFFER_ALIGN_CACHE)],
    47.           MAX(SDMMC_DATA_BUFFER_ALIGN_CACHE, SDMMCHOST_DMA_BUFFER_ADDR_ALIGN));
    48. extern SDK_ALIGN(uint8_t g_bufferRead[SDK_SIZEALIGN(BUFFER_SIZE, SDMMC_DATA_BUFFER_ALIGN_CACHE)],
    49.           MAX(SDMMC_DATA_BUFFER_ALIGN_CACHE, SDMMCHOST_DMA_BUFFER_ADDR_ALIGN));

    50. extern const sdmmchost_detect_card_t s_sdCardDetect;

    51. extern FRESULT error;
    52. extern UINT bytesWritten;
    53. extern UINT bytesRead;
    54. extern const TCHAR driverNumberBuffer[];
    55. extern TCHAR * fileName;

    56. void fatfs_sdcard_init(void);
    57. uint8_t fatfs_sdcard_mkfs(void);
    58. uint8_t fatfs_sdcard_mkdir(char* dirname);
    59. uint8_t fatfs_sdcard_readdir(char* dirname);
    60. void fatfs_sdcard_writetxt(char* fileName,char* writedata );
    61. void fatfs_sdcard_readtxt(char* fileName,uint32_t len);
    62. uint8_t fatfs_sdcard_readMaxtxt(char* fileName);

    63. status_t sdcardWaitCardInsert(void);

    64. void MySD_Init(void);


    65. #endif /* SD_H_ */
    复制代码
    sd.c
    1. /*
    2. * sd.c
    3. *
    4. *  Created on: 2020年12月15日
    5. *      Author: Administrator
    6. */

    7. #include "sd.h"
    8. #include "string.h"

    9. FATFS g_fileSystem; /* File system object */
    10. FIL   g_fileObject;   /* File object */
    11. DIR   directory; /* Directory object */
    12. FILINFO fileInformation;

    13. //数据对其格式
    14. SDK_ALIGN(uint8_t g_bufferWrite[SDK_SIZEALIGN(BUFFER_SIZE, SDMMC_DATA_BUFFER_ALIGN_CACHE)],
    15.           MAX(SDMMC_DATA_BUFFER_ALIGN_CACHE, SDMMCHOST_DMA_BUFFER_ADDR_ALIGN));
    16. SDK_ALIGN(uint8_t g_bufferRead[SDK_SIZEALIGN(BUFFER_SIZE, SDMMC_DATA_BUFFER_ALIGN_CACHE)],
    17.           MAX(SDMMC_DATA_BUFFER_ALIGN_CACHE, SDMMCHOST_DMA_BUFFER_ADDR_ALIGN));

    18. const sdmmchost_detect_card_t s_sdCardDetect = {
    19.     .cdType = BOARD_SD_DETECT_TYPE,
    20.     .cdTimeOut_ms = (~0U),
    21. };

    22. FRESULT error;
    23. UINT bytesWritten;
    24. UINT bytesRead;
    25. const TCHAR driverNumberBuffer[3U] = {SDDISK + '0', ':', '/'};
    26. volatile bool failedFlag           = false;
    27. char ch                            = '0';
    28. BYTE work[FF_MAX_SS];//

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

    30. //初始化SD并挂载到FATFS系统上
    31. void fatfs_sdcard_init(void) {
    32.         static uint8_t initFlag = 0;
    33.         if(initFlag == 0)  {
    34.                 CLOCK_EnableClock(kCLOCK_InputMux);
    35.                 CLOCK_AttachClk(BOARD_SDIF_CLK_ATTACH);
    36.                 CLOCK_SetClkDiv(kCLOCK_DivSdioClk, (uint32_t)(SystemCoreClock / FSL_FEATURE_SDIF_MAX_SOURCE_CLOCK + 1U), true);
    37.                 initFlag = 1;
    38.         }

    39.     if (sdcardWaitCardInsert() != kStatus_Success) {
    40.             PRINTF("\r\nPlease insert a card into board.\r\n");
    41.     }
    42.     if (f_mount(&g_fileSystem, driverNumberBuffer, 1U)) {
    43.         PRINTF("Mount volume failed.\r\n");
    44.     }
    45. #if (FF_FS_RPATH >= 2U)
    46.     error = f_chdrive((char const *)&driverNumberBuffer[0U]);
    47.     if (error) {
    48.         PRINTF("Change drive failed.\r\n");
    49.     }
    50. #endif
    51. }

    52. //f_mkfs  会格式化掉现有的分区  不常用
    53. /*
    54. 在驱动器上创建一个文件系统
    55. FRESULT f_mkfs (

    56. BYTE  Drive,            //逻辑驱动器号

    57. BYTE  PartitioningRule, //分区规则

    58. WORD  AllocSize         //分配单元大小

    59. );
    60. 参数:
    61. Drive 待格式化的逻辑驱动器号(0-9)。
    62. PartitioningRule
    63. 当给定0时,首先在驱动器上的第一个扇区创建一个分区表,然后文件系统被创建在分区上。这被称为FDISK格式化,用于硬盘和存储卡。当给定1时,文件系统从第一个扇区开始创建,而没有分区表。这被称为超级软盘(SFD)格式化,用于软盘和可移动磁盘。
    64. AllocSize
    65. 指定每簇中以字节为单位的分配单元大小。数值必须是0或从512到32K之间2的幂。当指定0时,簇大小取决于卷大小。
    66. 返回值
    67. FR_OK (0)  函数成功。
    68. FR_INVALID_DRIVE 驱动器号无效。
    69. FR_NOT_READY 由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。
    70. FR_WRITE_PROTECTED 驱动器被写保护。
    71. FR_NOT_ENABLED 逻辑驱动器没有工作区。
    72. FR_DISK_ERR由于底层磁盘I/O函数中的错误,而导致该函数失败。
    73. FR_MKFS_ABORTED 由于下列原因之一,而导致函数在开始格式化前终止:
    74. 磁盘容量太小
    75. 参数无效
    76. 该驱动器不允许的簇大小。
    77. 描述
    78. f_mkfs函数当_FS_READOLNY == 0并且_USE_MKFS == 1时可用。
    79. f_mkfs函数在驱动器中创建一个FAT文件系统。对于可移动媒介,有两种分区规则:FDISK和SFD,通过参数PartitioningRule选择。FDISK格式在大多数情况下被推荐使用。该函数当前不支持多分区,因此,物理驱动器上已存在的分区将被删除,并且重新创建一个占据全部磁盘空间的新分区。

    80. 根据Microsoft发布的FAT规范,FAT分类:FAT12/FAT16/FAT32,由驱动器上的簇数决定。因此,选择哪种FAT分类,取决于卷大小和指定的簇大小。簇大小影响文件系统的性能,并且大簇会提高性能
    81. */
    82. uint8_t fatfs_sdcard_mkfs(void)
    83. {
    84. #if FF_USE_MKFS   //Create an FAT/exFAT volume
    85.         PRINTF("\r\nMake file system......The time may be long if the card capacity is big.\r\n");
    86.         if (f_mkfs(driverNumberBuffer, FM_ANY, 0U, work, sizeof work))
    87.         {
    88.                 PRINTF("Make file system failed.\r\n");
    89.                 return -1;
    90.         }
    91. #endif /* FF_USE_MKFS */
    92.         return 0;

    93. }

    94. //创建一个新文件夹
    95. uint8_t fatfs_sdcard_mkdir(char* dirname)
    96. {
    97.         PRINTF("\r\nCreate directory......\r\n");
    98.         //error = f_mkdir(_T("/dir_1"));
    99.         error = f_mkdir(_T(dirname));
    100.         if (error)
    101.         {
    102.                 if (error == FR_EXIST)
    103.                 {
    104.                         PRINTF("Directory exists.\r\n");
    105.                 }
    106.                 else
    107.                 {
    108.                         PRINTF("Make directory failed.\r\n");
    109.                         return -1;
    110.                 }
    111.         }

    112.         PRINTF("\r\nCreate a file in that directory......\r\n");
    113.         return 0;
    114. }

    115. //遍历路径下文件
    116. uint8_t fatfs_sdcard_readdir(char* dirname)
    117. {

    118.         PRINTF("\r\nList the file in that directory......\r\n");
    119.         if (f_opendir(&directory, dirname))
    120.         {
    121.                 PRINTF("Open directory failed.\r\n");
    122.                 return -1;
    123.         }

    124.         for (;;)
    125.         {
    126.                 error = f_readdir(&directory, &fileInformation);

    127.                 /* To the end. */
    128.                 if ((error != FR_OK) || (fileInformation.fname[0U] == 0U))
    129.                 {
    130.                         break;
    131.                 }
    132.                 if (fileInformation.fname[0] == '.')
    133.                 {
    134.                         continue;
    135.                 }
    136.                 if (fileInformation.fattrib & AM_DIR)
    137.                 {
    138.                         PRINTF("Directory file : %s.\r\n", fileInformation.fname);
    139.                 }
    140.                 else
    141.                 {
    142.                         PRINTF("General file : %s.\r\n", fileInformation.fname);
    143.                 }
    144.         }
    145.         return 0;
    146. }



    147. void fatfs_sdcard_writetxt(char* fileName,char* writedata ) {
    148.         uint8_t i;

    149.         memset(g_bufferWrite, ' ', sizeof(g_bufferWrite));
    150.         g_bufferWrite[BUFFER_SIZE - 2U] = '\r';
    151.         g_bufferWrite[BUFFER_SIZE - 1U] = '\n';

    152.         PRINTF("Write.\r\n");
    153.     error = f_open(&g_fileObject, (const TCHAR*)fileName, (FA_WRITE | FA_CREATE_ALWAYS));
    154.     if (error) {
    155.         if (error == FR_EXIST) {
    156.             PRINTF("File exists.\r\n");
    157.         } else {
    158.             PRINTF("Open file failed.\r\n");
    159.         }
    160.         fatfs_sdcard_init();
    161.         error = f_open(&g_fileObject, (const TCHAR*)fileName, (FA_WRITE | FA_CREATE_ALWAYS));
    162.     }


    163.     for(i=0;i<BUFFER_SIZE;i++) { // Writting Bytes
    164.             if(writedata[i]=='\0') break;
    165.             g_bufferWrite[i] = writedata[i];
    166.     }

    167.     error = f_write(&g_fileObject, g_bufferWrite, sizeof(g_bufferWrite), &bytesWritten);
    168.     if ((error) || (bytesWritten != sizeof(g_bufferWrite))) {
    169.             PRINTF("Write file failed. \r\n");
    170.     }

    171.     if (f_close(&g_fileObject)) {
    172.         PRINTF("\r\nClose file failed.\r\n");
    173.     }
    174. }

    175. void fatfs_sdcard_readtxt(char* fileName,uint32_t len) {
    176.         uint8_t i;

    177.         PRINTF("Read.\r\n");
    178.     error = f_open(&g_fileObject, (const TCHAR*)fileName, FA_READ);
    179.     if (error) {
    180.         if (error == FR_EXIST) {
    181.             PRINTF("File exists.\r\n");
    182.         } else {
    183.             PRINTF("Open file failed.\r\n");
    184.         }
    185.         fatfs_sdcard_init();
    186.         error = f_open(&g_fileObject, (const TCHAR*)fileName, FA_READ);
    187.     }
    188.     if (f_lseek(&g_fileObject, 0U)) {
    189.             PRINTF("Set file pointer position failed. \r\n");
    190.     }

    191.     memset(g_bufferRead, 0U, sizeof(g_bufferRead));
    192.     error = f_read(&g_fileObject, g_bufferRead, sizeof(g_bufferRead), &bytesRead);
    193.     if ((error) || (bytesRead != sizeof(g_bufferRead))) {
    194.             PRINTF("Read file failed. \r\n");
    195.     }

    196.     for(i=0;i<len;i++) { // Read Bytes
    197.             PRINTF("%c",g_bufferRead[i]);
    198.     }

    199.     if (f_close(&g_fileObject)) {
    200.         PRINTF("\r\nClose file failed.\r\n");
    201.     }
    202. }

    203. uint8_t fatfs_sdcard_readMaxtxt(char* fileName) {
    204.         uint8_t i;

    205.         PRINTF("Read ALL TEXT.\r\n");
    206.         error = f_open(&g_fileObject, (const TCHAR*)fileName, FA_READ);
    207.         if (error) {
    208.                 if (error == FR_EXIST) {
    209.                         PRINTF("File exists.\r\n");
    210.                 } else {
    211.                         PRINTF("Open file failed.\r\n");
    212.                 }
    213.                 fatfs_sdcard_init();
    214.                 error = f_open(&g_fileObject, (const TCHAR*)fileName, FA_READ);
    215.         }

    216.         /* Move the file pointer */
    217.         if (f_lseek(&g_fileObject, 0U))
    218.         {
    219.                 PRINTF("Set file pointer position failed. \r\n");
    220.                 failedFlag = true;
    221.         }

    222.         //读取数据,最大值100个

    223.         memset(g_bufferRead, 0U, sizeof(g_bufferRead));
    224.         error = f_read(&g_fileObject, g_bufferRead, sizeof(g_bufferRead), &bytesRead);
    225.         if ((error) || (bytesRead != sizeof(g_bufferRead)))
    226.         {
    227.                 PRINTF("Read file failed. \r\n");
    228.                 failedFlag = true;
    229.         }
    230.         //输出读取的数据
    231.         for(i=0;i<BUFFER_SIZE;i++) { // Read Bytes

    232.                 if(g_bufferRead[i]=='\n')  break;
    233.                 PRINTF("%c",g_bufferRead[i]);
    234.         }

    235.         if (f_close(&g_fileObject))
    236.         {
    237.                 PRINTF("\r\nClose file failed.\r\n");
    238.                 return -1;
    239.         }
    240.         return 0;
    241. }
    242. uint8_t fatfs_sdcard_write_readAlltxt(char* fileName,uint32_t len) {

    243.         memset(g_bufferWrite, 'a', sizeof(g_bufferWrite));
    244.         g_bufferWrite[BUFFER_SIZE - 2U] = '\r';
    245.         g_bufferWrite[BUFFER_SIZE - 1U] = '\n';

    246.         PRINTF("\r\nWrite/read file until encounters error......\r\n");
    247.         while (true)
    248.         {
    249.                 if (failedFlag || (ch == 'q'))
    250.                 {
    251.                         break;
    252.                 }

    253.                 PRINTF("\r\nWrite to above created file.\r\n");
    254.                 error = f_write(&g_fileObject, g_bufferWrite, sizeof(g_bufferWrite), &bytesWritten);
    255.                 if ((error) || (bytesWritten != sizeof(g_bufferWrite)))
    256.                 {
    257.                         PRINTF("Write file failed. \r\n");
    258.                         failedFlag = true;
    259.                         continue;
    260.                 }

    261.                 /* Move the file pointer */
    262.                 if (f_lseek(&g_fileObject, 0U))
    263.                 {
    264.                         PRINTF("Set file pointer position failed. \r\n");
    265.                         failedFlag = true;
    266.                         continue;
    267.                 }

    268.                 PRINTF("Read from above created file.\r\n");
    269.                 memset(g_bufferRead, 0U, sizeof(g_bufferRead));
    270.                 error = f_read(&g_fileObject, g_bufferRead, sizeof(g_bufferRead), &bytesRead);
    271.                 if ((error) || (bytesRead != sizeof(g_bufferRead)))
    272.                 {
    273.                         PRINTF("Read file failed. \r\n");
    274.                         failedFlag = true;
    275.                         continue;
    276.                 }

    277.                 PRINTF("Compare the read/write content......\r\n");
    278.                 if (memcmp(g_bufferWrite, g_bufferRead, sizeof(g_bufferWrite)))
    279.                 {
    280.                         PRINTF("Compare read/write content isn't consistent.\r\n");
    281.                         failedFlag = true;
    282.                         continue;
    283.                 }
    284.                 PRINTF("The read/write content is consistent.\r\n");

    285.                 PRINTF("\r\nInput 'q' to quit read/write.\r\nInput other char to read/write file again.\r\n");
    286.                 ch = GETCHAR();
    287.                 PUTCHAR(ch);

    288.                 PRINTF("\r\nThe example will not read/write file again.\r\n");

    289.                 if (f_close(&g_fileObject))
    290.                 {
    291.                         PRINTF("\r\nClose file failed.\r\n");
    292.                         return -1;
    293.                 }
    294.         }
    295.         return 0;
    296. }

    297. status_t sdcardWaitCardInsert(void) {
    298.     g_sd.host.base           = SD_HOST_BASEADDR;
    299.     g_sd.host.sourceClock_Hz = SD_HOST_CLK_FREQ;
    300.     g_sd.usrParam.cd = &s_sdCardDetect;
    301.     if (SD_HostInit(&g_sd) != kStatus_Success) {
    302.         PRINTF("\r\nSD host init fail\r\n");
    303.         return kStatus_Fail;
    304.     }
    305.     SD_PowerOffCard(g_sd.host.base, g_sd.usrParam.pwr);
    306.     if (SD_WaitCardDetectStatus(SD_HOST_BASEADDR, &s_sdCardDetect, true) == kStatus_Success) {
    307.         PRINTF("\r\nCard inserted.\r\n");
    308.         SD_PowerOnCard(g_sd.host.base, g_sd.usrParam.pwr);
    309.     } else {
    310.         PRINTF("\r\nCard detect fail.\r\n");
    311.         return kStatus_Fail;
    312.     }
    313.     return kStatus_Success;
    314. }

    315. void MySD_Init(void)
    316. {
    317.          CLOCK_EnableClock(kCLOCK_InputMux);
    318.          /* attach main clock to SDIF */
    319.          CLOCK_AttachClk(BOARD_SDIF_CLK_ATTACH);
    320.          /* need call this function to clear the halt bit in clock divider register */
    321.          CLOCK_SetClkDiv(kCLOCK_DivSdioClk, (uint32_t)(SystemCoreClock / FSL_FEATURE_SDIF_MAX_SOURCE_CLOCK + 1U), true);

    322.          //GPIO 复用
    323.          /* Enables the clock for the I/O controller.: Enable Clock. */
    324.         CLOCK_EnableClock(kCLOCK_Iocon);

    325.         /* Enables the clock for the GPIO0 module */
    326.         CLOCK_EnableClock(kCLOCK_Gpio0);

    327.         /* Enables the clock for the GPIO1 module */
    328.         CLOCK_EnableClock(kCLOCK_Gpio1);

    329.         IOCON->PIO[0][17] = ((IOCON->PIO[0][17] &
    330.                                                   /* Mask bits to zero which are setting */
    331.                                                   (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK)))

    332.                                                  /* Selects pin function.
    333.                                                   * : PORT017 (pin 8) is configured as SD0_CARD_DET_N. */
    334.                                                  | IOCON_PIO_FUNC(PIO0_17_FUNC_ALT2)

    335.                                                  /* Select Digital mode.
    336.                                                   * : Enable Digital mode.
    337.                                                   * Digital input is enabled. */
    338.                                                  | IOCON_PIO_DIGIMODE(PIO0_17_DIGIMODE_DIGITAL));

    339.         IOCON->PIO[0][24] = ((IOCON->PIO[0][24] &
    340.                                                   /* Mask bits to zero which are setting */
    341.                                                   (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK)))

    342.                                                  /* Selects pin function.
    343.                                                   * : PORT024 (pin 70) is configured as SD0_D0. */
    344.                                                  | IOCON_PIO_FUNC(PIO0_24_FUNC_ALT2)

    345.                                                  /* Select Digital mode.
    346.                                                   * : Enable Digital mode.
    347.                                                   * Digital input is enabled. */
    348.                                                  | IOCON_PIO_DIGIMODE(PIO0_24_DIGIMODE_DIGITAL));

    349.         IOCON->PIO[0][25] = ((IOCON->PIO[0][25] &
    350.                                                   /* Mask bits to zero which are setting */
    351.                                                   (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK)))

    352.                                                  /* Selects pin function.
    353.                                                   * : PORT025 (pin 79) is configured as SD0_D1. */
    354.                                                  | IOCON_PIO_FUNC(PIO0_25_FUNC_ALT2)

    355.                                                  /* Select Digital mode.
    356.                                                   * : Enable Digital mode.
    357.                                                   * Digital input is enabled. */
    358.                                                  | IOCON_PIO_DIGIMODE(PIO0_25_DIGIMODE_DIGITAL));


    359.         if (Chip_GetVersion()==1)
    360.         {
    361.                 IOCON->PIO[0][9] = ((IOCON->PIO[0][9] &
    362.                                                  /* Mask bits to zero which are setting */
    363.                                                  (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK)))

    364.                                                 /* Selects pin function.
    365.                                                  * : PORT09 (pin 55) is configured as SD0_POW_EN. */
    366.                                                 | IOCON_PIO_FUNC(PIO0_9_FUNC_ALT2)

    367.                                                 /* Select Digital mode.
    368.                                                  * : Enable Digital mode.
    369.                                                  * Digital input is enabled. */
    370.                                                 | IOCON_PIO_DIGIMODE(PIO0_9_DIGIMODE_DIGITAL));
    371.         }
    372.         else
    373.         {
    374.                 IOCON->PIO[0][9] = ((IOCON->PIO[0][9] &
    375.                                                  /* Mask bits to zero which are setting */
    376.                                                  (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK)))

    377.                                                 /* Selects pin function.
    378.                                                  * : PORT09 (pin 55) is configured as SD0_POW_EN. */
    379.                                                 | IOCON_PIO_FUNC(PIO0_9_FUNC_ALT2)

    380.                                                 /* Select Digital mode.
    381.                                                  * : Enable Digital mode.
    382.                                                  * Digital input is enabled. */
    383.                                                 | IOCON_PIO_DIGIMODE(PIO0_9_DIGIMODE_DIGITAL));
    384.         }

    385.         IOCON->PIO[1][16] = ((IOCON->PIO[1][16] &
    386.                                                   /* Mask bits to zero which are setting */
    387.                                                   (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK)))

    388.                                                  /* Selects pin function.
    389.                                                   * : PORT116 (pin 87) is configured as SD0_CMD. */
    390.                                                  | IOCON_PIO_FUNC(PIO1_16_FUNC_ALT4)

    391.                                                  /* Select Digital mode.
    392.                                                   * : Enable Digital mode.
    393.                                                   * Digital input is enabled. */
    394.                                                  | IOCON_PIO_DIGIMODE(PIO1_16_DIGIMODE_DIGITAL));



    395.         IOCON->PIO[1][5] = ((IOCON->PIO[1][5] &
    396.                                                  /* Mask bits to zero which are setting */
    397.                                                  (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK)))

    398.                                                 /* Selects pin function.
    399.                                                  * : PORT15 (pin 31) is configured as SD0_D2. */
    400.                                                 | IOCON_PIO_FUNC(PIO1_5_FUNC_ALT2)

    401.                                                 /* Select Digital mode.
    402.                                                  * : Enable Digital mode.
    403.                                                  * Digital input is enabled. */
    404.                                                 | IOCON_PIO_DIGIMODE(PIO1_5_DIGIMODE_DIGITAL));

    405.         IOCON->PIO[1][6] = ((IOCON->PIO[1][6] &
    406.                                                  /* Mask bits to zero which are setting */
    407.                                                  (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK)))

    408.                                                 /* Selects pin function.
    409.                                                  * : PORT16 (pin 5) is configured as SD0_D3. */
    410.                                                 | IOCON_PIO_FUNC(PIO1_6_FUNC_ALT2)

    411.                                                 /* Select Digital mode.
    412.                                                  * : Enable Digital mode.
    413.                                                  * Digital input is enabled. */
    414.                                                 | IOCON_PIO_DIGIMODE(PIO1_6_DIGIMODE_DIGITAL));

    415.         IOCON->PIO[1][8] = ((IOCON->PIO[1][8] &
    416.                                                  /* Mask bits to zero which are setting */
    417.                                                  (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK)))

    418.                                                 /* Selects pin function.
    419.                                                  * : PORT18 (pin 24) is configured as SD0_CLK. */
    420.                                                 | IOCON_PIO_FUNC(PIO1_8_FUNC_ALT2)

    421.                                                 /* Select Digital mode.
    422.                                                  * : Enable Digital mode.
    423.                                                  * Digital input is enabled. */
    424.                                                 | IOCON_PIO_DIGIMODE(PIO1_8_DIGIMODE_DIGITAL));
    425. }
    复制代码
    然后在main函数页面,进行调用即可:
    1. /**
    2. * @file    seekfreePrj_demo.c
    3. * @brief   Application entry point.
    4. */
    5. #include <stdio.h>
    6. #include "board.h"
    7. #include "peripherals.h"
    8. #include "pin_mux.h"
    9. #include "clock_config.h"
    10. #include "LPC55S69_cm33_core0.h"
    11. #include "fsl_debug_console.h"
    12. /* TODO: insert other include files here. */
    13. #include "sd.h"
    14. #include "ff.h"
    15. #include "diskio.h"
    16. #include "fsl_sd_disk.h"
    17. #include "semphr.h"
    18. #include "task.h"

    19. #include "delay.h"
    20. #include "led.h"
    21. #include "key.h"



    22. /* TODO: insert other definitions and declarations here. */


    23. /*
    24. * @brief   Application entry point.
    25. */
    26. int main(void) {
    27.         //uint8_t key=0,key_tmp=0;

    28.           /* Init board hardware. */
    29.     BOARD_InitBootPins();
    30.     BOARD_InitBootClocks();
    31.     BOARD_InitBootPeripherals();
    32. #ifndef BOARD_INIT_DEBUG_CONSOLE_PERIPHERAL
    33.     /* Init FSL debug console. */
    34.     BOARD_InitDebugConsole();
    35. #endif

    36.     LED_Init();
    37.     KEY_Init();
    38.     //MySD_Init();

    39.     PRINTF("the systemclock is: %d Mhz\n",SystemCoreClock/1000000);
    40.     PRINTF("the for1mclock is: %d Mhz\n",CLOCK_GetFro1MFreq()/1000000);

    41.     PRINTF("FATFS SDCard example.\r\n");

    42.         fatfs_sdcard_init();
    43.         fatfs_sdcard_mkdir("/dir");
    44.         fatfs_sdcard_writetxt("/dir/test.txt",(char*)("Helloworld!\r\n"));
    45.         fatfs_sdcard_readtxt("/dir/test.txt",strlen("Helloworld!\r\n"));
    46.         PRINTF("THE SEND STR3 LEN IS %d.\r\n",strlen("Helloworld!\r\n"));
    47.         fatfs_sdcard_readMaxtxt("/dir/test.txt");
    48.         //fatfs_sdcard_readdir((char*)("2:/dir"));
    49.         fatfs_sdcard_readdir((char*)("2:/"));

    50.     /* Enter an infinite loop, just incrementing a counter. */
    51.     while(1) {


    52.     }
    53. }

    复制代码
    编译无误,插上SD卡,下载程序,查看串口输出(这里吐槽下,这个SD卡的位置,真是服了,一点不方便,难拿难插):
    X10.jpg
    好了,MCUXpresso虽然有点小BUG,但整体还是蛮好用的。SD及FATFS的移植就到这。
    谢谢大家观看!




    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情
    开心
    4 天前
  • 签到天数: 1336 天

    [LV.10]以坛为家III

    88

    主题

    4293

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    9054
    最后登录
    2024-5-2
    发表于 2020-12-16 10:40:24 | 显示全部楼层
    看上去现在移植起来非常方便了啊
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2024-2-5 12:06
  • 签到天数: 627 天

    [LV.9]以坛为家II

    94

    主题

    1628

    帖子

    2

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    4429

    热心会员

    最后登录
    2024-2-5
     楼主| 发表于 2020-12-16 11:57:53 | 显示全部楼层
    jobszheng5 发表于 2020-12-16 10:40
    看上去现在移植起来非常方便了啊

    是的,但是有些功能还得摸索。
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    4 天前
  • 签到天数: 1336 天

    [LV.10]以坛为家III

    88

    主题

    4293

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    9054
    最后登录
    2024-5-2
    发表于 2020-12-17 09:25:26 | 显示全部楼层
    这是“师傅领进门,修行在个人。”
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-5-5 09:43 , Processed in 0.137444 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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