| 本例程跑了下SD/MMC栈用FatFS。这里将建立一个文件系统写一个文件到卡上。 
 本例程得用I/01Xplained Pro扩展板到EXT1上边。
 
 在这里串口初始化是用了另一种格式。结构体
 
 
 
        const usart_serial_options_t usart_serial_options = {
                .baudrate   = CONF_TEST_BAUDRATE,
                .charlength = CONF_TEST_CHARLENGTH,
                .paritytype = CONF_TEST_PARITY,
                .stopbits   = CONF_TEST_STOPBITS,
        };
 而USART管脚定义在:
 
 sam4n_xplained _pro.h中
 
 
 而初始化MMC在这里:
#define CONSOLE_UART              UART0
#define CONSOLE_UART_ID        ID_UART0
/** UART0 pins (UTXD0 and URXD0) definitions, PA9,10. */
#define PINS_UART0        (PIO_PA9A_URXD0 | PIO_PA10A_UTXD0)
#define PINS_UART0_FLAGS  (IOPORT_MODE_MUX_A)
#define PINS_UART0_PORT   IOPORT_PIOA
#define PINS_UART0_MASK   (PIO_PA9A_URXD0 | PIO_PA10A_UTXD0)
#define PINS_UART0_PIO    PIOA
#define PINS_UART0_ID     ID_PIOA
#define PINS_UART0_TYPE   PIO_PERIPH_A
#define PINS_UART0_ATTR   PIO_DEFAULT
 
void sd_mmc_init(void)
{
        //! Enable the PMC clock for the card detect pins
#if (defined SD_MMC_0_CD_GPIO) && (!defined SAM4L)
# include "pmc.h"
# define SD_MMC_ENABLE_CD_PIN(slot, unused) \
        pmc_enable_periph_clk(SD_MMC_##slot##_CD_PIO_ID);
        MREPEAT(SD_MMC_MEM_CNT, SD_MMC_ENABLE_CD_PIN, ~)
# undef SD_MMC_ENABLE_CD_PIN
#endif
        //! Enable the PMC clock for the card write protection pins
#if (defined SD_MMC_0_WP_GPIO) && (!defined SAM4L)
# include "pmc.h"
# define SD_MMC_ENABLE_WP_PIN(slot, unused) \
        pmc_enable_periph_clk(SD_MMC_##slot##_WP_PIO_ID);
        MREPEAT(SD_MMC_MEM_CNT, SD_MMC_ENABLE_WP_PIN, ~)
# undef SD_MMC_ENABLE_WP_PIN
#endif
        for (uint8_t slot = 0; slot < SD_MMC_MEM_CNT; slot++) {
                sd_mmc_cards[slot].state = SD_MMC_CARD_STATE_NO_CARD;
        }
        sd_mmc_slot_sel = 0xFF; // No slot configurated
        driver_init();
}
 
 最后在主程序完成一系列的动作:
 
 
 
                printf("Please plug an SD, MMC or SDIO card in slot.\n\r");
                /* Wait card present and ready */
                do {
                        status = sd_mmc_test_unit_ready(0);
                        if (CTRL_FAIL == status) {
                                printf("Card install FAIL\n\r");
                                printf("Please unplug and re-plug the card.\n\r");
                                while (CTRL_NO_PRESENT != sd_mmc_check(0)) {
                                }
                        }
                } while (CTRL_GOOD != status);
                printf("Mount disk (f_mount)...\r\n");
                memset(&fs, 0, sizeof(FATFS));
                res = f_mount(LUN_ID_SD_MMC_0_MEM, &fs);
                if (FR_INVALID_DRIVE == res) {
                        printf("[FAIL] res %d\r\n", res);
                        goto main_end_of_test;
                }
                printf("[OK]\r\n");
                printf("Create a file (f_open)...\r\n");
                test_file_name[0] = LUN_ID_SD_MMC_0_MEM + '0';
                res = f_open(&file_object,
                                (char const *)test_file_name,
                                FA_CREATE_ALWAYS | FA_WRITE);
                if (res != FR_OK) {
                        printf("[FAIL] res %d\r\n", res);
                        goto main_end_of_test;
                }
                printf("[OK]\r\n");
                printf("Write to test file (f_puts)...\r\n");
                if (0 == f_puts("Test SD/MMC stack\n", &file_object)) {
                        f_close(&file_object);
                        printf("[FAIL]\r\n");
                        goto main_end_of_test;
                }
                printf("[OK]\r\n");
                f_close(&file_object);
                printf("Test is successful.\n\r");
main_end_of_test:
                printf("Please unplug the card.\n\r");
                while (CTRL_NO_PRESENT != sd_mmc_check(0)) {
                }
 
 最后的运行结果:
 
 
 
 |