當前位置:首頁 > 科技 > 正文

貼片SD卡移植FATFS文件系統

一、前言

手頭有一塊深圳雷龍提供的貼片 CS 創世 SD NAND Flash,挂載個文件系統把玩一下。首先介紹一下使用的貼片 SD 卡,以前使用的都是拔插式的 SD 卡,下面這個樣子:

貼片SD卡移植FATFS文件系統

深圳雷龍提供的CS創世 SD NAND Flash 如下圖:

貼片SD卡移植FATFS文件系統

二、貼片 SD 卡介紹

深圳雷龍提供的 CS 創世 SD NAND 屬于 LGA-8 封裝,标準 SDIO 接口,兼容SPI/SD/eMMC接口,兼容各大MCU平台,可替代普通TF卡/SD卡,尺寸6x8mm毫米,内置SLC晶圓擦寫壽命10萬次,通過1萬次随機掉電測試耐高低溫,支持工業級溫度-40°~+85°,機貼手帖都非常方便,速度級别Class10(讀取速度23.5MB/S寫入速度12.3MB/S)标準的SD2.0協議普通的SD卡可直接驅動。

貼片 SD 卡的使用很簡單,管腳的連接方式和普通拔插的 SD 卡一緻,所以我們設計硬件時按照普通 SD 的接線方式設計就行,以小熊派開發闆為例子,單線 SDIO 硬件接線如下:

貼片SD卡移植FATFS文件系統

我使用小熊派開發闆來挂載 FATFS 到雷龍這塊 SD 卡上

三、配置 CubeMX 底層接口

首先使用 CubeMX 配置底層 SD 卡接口,選擇單線模式,分頻設置高一點,其他參數保持默認

貼片SD卡移植FATFS文件系統

配置完 SD 卡後開啟 FATFS 的文件系統,選擇挂載到 SD 卡,文件名選擇 US ,buff 放到 STACK 上(注意調大棧空間)

貼片SD卡移植FATFS文件系統

配置完成後生成代碼,cubemx 主要是以下兩個初始化函數:

貼片SD卡移植FATFS文件系統

四、編寫命令行測試代碼

使用我之前移植的命令行框架,編寫測試函數

void mount(char argc, char *argv)

if (argc > 1)

if (!strcmp("init", &argv[argv[1]]))

FRESULT ret = FR_INT_ERR;

ret = f_mount(&SDFatFS, SDPath, 1);

if (ret != FR_OK) {

shell_printf("mount init failed! %d\r\n", ret);

} else {

shell_printf("mount init succ!\r\n");

} else if (!strcmp("deinit", &argv[argv[1]])) {

FRESULT ret = FR_INT_ERR;

ret = f_mount(NULL, "", 1);

if (ret != FR_OK) {

shell_printf("mount deinit failed!\r\n");

} else {

shell_printf("mount deinit succ!\r\n");

else

shell_printf("mount need more arguments!\r\n");

void open(char argc, char *argv)

if (argc > 1)

FRESULT ret = FR_INT_ERR;

ret = f_open(&SDFile, &argv[argv[1]], FA_READ | FA_WRITE | FA_CREATE_NEW);

if (ret != FR_OK) {

shell_printf("open %s failed! code: %d \r\n ", &argv[argv[1]], ret);

} else {

shell_printf("open %s succ!\r\n", &argv[argv[1]]);

else

shell_printf("mount need more arguments!\r\n");

void close(char argc, char *argv)

if (argc > 1)

FRESULT ret = FR_INT_ERR;

ret = f_close(&SDFile);

if (ret != FR_OK) {

shell_printf("close %s failed!\r\n", &argv[argv[1]]);

} else {

shell_printf("close %s succ!\r\n", &argv[argv[1]]);

else

shell_printf("mount need more arguments!\r\n");

void write(char argc, char *argv)

if (argc > 1)

FRESULT ret = FR_INT_ERR;

uint32_t write_num = 0;

ret = f_write(&SDFile, &argv[argv[1]], strlen(&argv[argv[1]]), &write_num);

if (ret != FR_OK) {

shell_printf("write file failed!\r\n");

} else {

shell_printf("write file succ!\r\n");

else

shell_printf("mount need more arguments!\r\n");

void read(char argc, char *argv)

if (argc > 1)

FRESULT ret = FR_INT_ERR;

uint32_t read_num = 0;

uint8_t read_buff[100];

ret = f_read(&SDFile, read_buff, 50, &read_num);

if (ret != FR_OK) {

shell_printf("read file failed! %d\r\n", ret);

} else {

shell_printf("read file succ!\r\n");

shell_printf("read dat: %s, read num %d\r\n", read_buff, read_num);

else

shell_printf("mount need more arguments!\r\n");

将測試函數挂到命令行中:

const static_cmd_st static_cmd[] = {

{"ls", shell_ls_cmd},

{"mount", mount},

{"open", open},

{"close", close},

{"read", read},

{"write", write},

{"\0", NULL, NULL},

下載代碼,在命令行測試挂載以及讀寫函數:

貼片SD卡移植FATFS文件系統

讀的數據有些亂碼,用讀卡器讀出來看看:

貼片SD卡移植FATFS文件系統

可以看到成功寫入,SD 卡挂載 FATFS 成功,命令行操作文件系統功能正常

【本文轉載自CSDN,作者:Top嵌入式】

深圳市雷龍發展專注存儲行業13年,專業提供小容量存儲解決方案。

你可能想看:

有話要說...

取消
掃碼支持 支付碼