一、前言
手頭有一塊深圳雷龍提供的貼片 CS 創世 SD NAND Flash,挂載個文件系統把玩一下。首先介紹一下使用的貼片 SD 卡,以前使用的都是拔插式的 SD 卡,下面這個樣子:
深圳雷龍提供的CS創世 SD NAND Flash 如下圖:
二、貼片 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 硬件接線如下:
我使用小熊派開發闆來挂載 FATFS 到雷龍這塊 SD 卡上
三、配置 CubeMX 底層接口
首先使用 CubeMX 配置底層 SD 卡接口,選擇單線模式,分頻設置高一點,其他參數保持默認
配置完 SD 卡後開啟 FATFS 的文件系統,選擇挂載到 SD 卡,文件名選擇 US ,buff 放到 STACK 上(注意調大棧空間)
配置完成後生成代碼,cubemx 主要是以下兩個初始化函數:
四、編寫命令行測試代碼
使用我之前移植的命令行框架,編寫測試函數
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 成功,命令行操作文件系統功能正常
【本文轉載自CSDN,作者:Top嵌入式】
深圳市雷龍發展專注存儲行業13年,專業提供小容量存儲解決方案。
有話要說...