当前位置: 首页 新闻资讯 技术问答

GD32驱动SDNAND的SD模式详细教程方法

SD NAND-贴片式TF卡-贴片式SD卡-免费测试2024-10-173

GD32 微控制器上使用 SD 模式 驱动 SDNAND,可以通过以下步骤配置 SDIO 控制器,初始化 SDNAND,并实现基本的读写操作。GD32 系列 MCU 提供了硬件 SDIO 接口,用于高速数据传输,SD 模式通常比 SPI 更高效。

1. 硬件连接

确保 GD32 的 SDIO 引脚正确连接到 SDNAND。

连接方式:

  • CMD (Command):连接到 GD32 的 SD_CMD 引脚。

  • CLK (Clock):连接到 GD32 的 SD_CLK 引脚。

  • D0-D3 (Data Lines):如果使用 4-bit 模式,需连接 D0-D3 引脚。如果使用 1-bit 模式,只需连接 D0 引脚。

  • VCC 和 GND:确保电源电压为 3.3V(或 SDNAND 规格要求的电压)。

2. 配置 SDIO

在 SD 模式下,GD32 使用 SDIO 外设来与 SDNAND 进行通信。SDIO 的初始化配置包括时钟设置、数据宽度配置等。

SDIO 初始化步骤:

  1. 配置 GPIO: 配置用于 SDIO 的引脚为复用功能。

  2. 配置时钟: 初始化时,时钟频率应设置为较低值(通常为 400kHz),初始化完成后可以提高时钟频率。

  3. SDIO 模块初始化: 配置 SDIO 的时钟边沿、总线宽度(1-bit 或 4-bit)等参数。

SDIO 初始化代码示例:

c复制代码void SDIO_Init(void){    // 配置 SDIO 引脚
   gpio_init(GPIOC, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12);
   gpio_init(GPIOD, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2);    // 配置时钟
   rcu_periph_clock_enable(RCU_SDIO);
   rcu_periph_clock_enable(RCU_GPIOC);
   rcu_periph_clock_enable(RCU_GPIOD);    
   // 配置 SDIO
   sdio_init(SDIO_CLOCK_EDGE_RISING, SDIO_CLOCK_BYPASS_DISABLE, SDIO_CLOCK_POWER_SAVE_DISABLE, SDIO_BUS_WIDE_1B, SDIO_HARDWARE_FLOW_CONTROL_DISABLE);
   sdio_clock_set(400000);  // 初始时钟设为 400kHz}

3. SDNAND 初始化

SDNAND 的初始化过程涉及多条命令,通常与标准的 SD 卡初始化类似。主要步骤包括复位卡、检查电压、选择卡片等。

初始化流程:

  1. CMD0 (GO_IDLE_STATE):将 SDNAND 复位,进入 IDLE 状态。

  2. CMD8 (SEND_IF_COND):检查电压范围和接口条件。

  3. ACMD41:激活 SDNAND 并等待其准备就绪。

  4. CMD2 (ALL_SEND_CID)CMD3 (SEND_RELATIVE_ADDR):获取卡的识别信息和 RCA。

  5. CMD7 (SELECT_CARD):选择卡进入传输状态。

SDNAND 初始化代码示例:

c复制代码uint8_t SDNAND_Init(void){    uint8_t response;    // 发送 CMD0,复位 SD 卡
   sdio_command_send(SD_CMD_GO_IDLE_STATE, 0, SDIO_RESP_NONE);    
   // 发送 CMD8,检查电压范围
   response = sdio_command_send(SD_CMD_SEND_IF_COND, 0x1AA, SDIO_RESP_SHORT);    if (response & SDIO_RESP_ERROR) {        return 0;  // 电压不匹配,初始化失败
   }    // 发送 ACMD41,等待卡片就绪
   do {
       sdio_command_send(SD_CMD_APP_CMD, 0, SDIO_RESP_SHORT);  // 发送 CMD55
       response = sdio_command_send(SD_CMD_SD_APP_OP_COND, 0x40000000, SDIO_RESP_SHORT);  // 发送 ACMD41
   } while (response & SDIO_RESP_BUSY);    // 发送 CMD2 获取卡片 CID
   sdio_command_send(SD_CMD_ALL_SEND_CID, 0, SDIO_RESP_LONG);    // 发送 CMD3 获取 RCA
   response = sdio_command_send(SD_CMD_SEND_RELATIVE_ADDR, 0, SDIO_RESP_SHORT);    return 1;  // 初始化成功}

4. 读写操作

一旦 SDNAND 初始化成功,便可以通过 SDIO 接口进行数据传输。读操作使用 CMD17 读取单个数据块,写操作使用 CMD24 写入单个数据块。每个块的大小通常为 512 字节。

读取数据示例:

c复制代码uint8_t SD_ReadBlock(uint32_t address, uint8_t *buffer){    // 发送 CMD17 读取单个数据块
   uint8_t response = sdio_command_send(SD_CMD_READ_SINGLE_BLOCK, address, SDIO_RESP_SHORT);    if (response & SDIO_RESP_ERROR) {        return 0;  // 读取失败
   }    // 等待数据准备
   while (!sdio_flag_get(SDIO_FLAG_RXDAVL));    // 读取 512 字节的数据
   for (int i = 0; i < 512 / 4; i++) {
       *((uint32_t *)buffer + i) = sdio_data_receive();
   }    return 1;  // 读取成功}

写入数据示例:

c复制代码uint8_t SD_WriteBlock(uint32_t address, uint8_t *buffer){    // 发送 CMD24 写入单个数据块
   uint8_t response = sdio_command_send(SD_CMD_WRITE_SINGLE_BLOCK, address, SDIO_RESP_SHORT);    if (response & SDIO_RESP_ERROR) {        return 0;  // 写入失败
   }    // 写入 512 字节的数据
   for (int i = 0; i < 512 / 4; i++) {
       sdio_data_transmit(*((uint32_t *)buffer + i));
   }    return 1;  // 写入成功}

5. 文件系统集成

要在 SDNAND 上实现文件系统(如 FAT 文件系统),你可以使用 FatFs 库。FatFs 需要底层的块读写接口来管理文件操作。

文件系统集成步骤:

  1. 实现读写接口。

  2. 初始化 FAT 文件系统。

  3. 使用文件 API(如 f_openf_readf_write)进行文件操作。

文件读写示例:

c复制代码#include "fatfs.h"void File_Operation(void){
   FATFS fs;
   FIL fil;
   UINT bw;
   FRESULT fr;    // 挂载文件系统
   fr = f_mount(&fs, "", 1);    if (fr != FR_OK) {        // 处理挂载失败
   }    // 创建并打开文件
   fr = f_open(&fil, "test.txt", FA_CREATE_ALWAYS | FA_WRITE);    if (fr == FR_OK) {        // 写入数据到文件
       f_write(&fil, "GD32 SDNAND Test", 16, &bw);
       f_close(&fil);
   }
}

6. 调试和优化

  • 时钟设置:确保 SDIO 时钟频率在允许范围内,初始化时应设置较低频率。

  • 调试错误:如果命令响应出现问题,使用逻辑分析仪检查命令和数据的传输时序。

  • DMA 支持:为了提高数据传输效率,可以使用 DMA 来传输数据,尤其是大批量传输时。

总结

在 GD32 上使用 SD 模式驱动 SDNAND,主要步骤包括 SDIO 的初始化、卡片的正确初始化,以及通过 SDIO 接口实现高效的读写操作。如果需要文件系统支持,可以集成 FatFs 来管理 SDNAND 上的数据。


热门标签:SDNAND贴片式TF卡贴片式SD卡SD FLASHSLC NANDNAND FLASH


SD NAND-贴片式TF卡-贴片式SD卡-免费测试

深圳市芯存者科技有限公司

售前咨询
售前咨询
售后服务
售后服务
联系我们

电话:176-6539-0767

Q Q:135-0379-986

邮箱:1350379986@qq.com

地址:深圳市南山区蛇口街道后海大道1021号B C座C422W8

在线客服 在线客服 QQ客服 微信客服 淘宝店铺 联系我们 返回顶部