STM32F4X SDIO(八) 例程讲解 设置SD卡 & SDIO 总线宽度

设置SD卡 & SDIO 总线宽度

在上一节中我们已经初始化了SD卡,并获取了SD卡的CID、CSD和RCA地址,接下来就可以对SD卡进行读写操作了,但是在进行读写操作时,还需要提高SD卡的总线宽度和SDIO_CK时钟,加快传输速度。

设置SDIO_CK时钟

在SD卡刚上电的时候,SD卡默认的时钟是400KHz,总线宽度是1位,所以在进行SD卡读写操作前,需要提高SD卡的时钟速率。首先需要先设置SDIO_CK时钟。

 SDIO_InitStructure.SDIO_ClockDiv = SDIO_TRANSFER_CLK_DIV; // 时钟分频系数0
 SDIO_InitStructure.SDIO_ClockEdge = SDIO_ClockEdge_Rising; 
 SDIO_InitStructure.SDIO_ClockBypass = SDIO_ClockBypass_Disable;
 SDIO_InitStructure.SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable;
 SDIO_InitStructure.SDIO_BusWide = SDIO_BusWide_1b;
 SDIO_InitStructure.SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable;
 SDIO_Init(&SDIO_InitStructure);

根据STM32F4X的SDIO_CK时钟计算公式
SDIO_CK 频率 = SDIOCLK / [CLKDIV + 2]
SDIO_CK = 48MHz / (0 + 2) = 24MHz
上面的代码就将SDIO_CK的频率设置成24MHz

CMD7:SELECT/DESELECT_CARD

CMD7的作用是通常传入RCA地址,将对应的RCA地址的SD卡进入传输模式,同一时刻只能有一张卡处于传输状态。

在这里插入图片描述

命令发送程序

 SDIO_CmdInitStructure.SDIO_Argument =  rca << 16; // SD卡的RCA地址
 SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SEL_DESEL_CARD; // 命令索引 CMD7
 SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; // 短响应
 SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; // 不等待
 SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; // 使能CPSM状态机
 SDIO_SendCommand(&SDIO_CmdInitStructure);

在这里插入图片描述

命令响应程序

CMD7的响应类型是R1b,R1b会返回一个32位的卡状态给主机,主机需要通过卡状态判断SD卡是否准备完毕。

在这里插入图片描述

static SD_Error CmdResp1Error(uint8_t cmd)
{
  SD_Error errorstatus = SD_OK;
  uint32_t status;
  uint32_t response_r1;

  status = SDIO->STA;

  while (!(status & (SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT)))
  {
    status = SDIO->STA;
  }

  if (status & SDIO_FLAG_CTIMEOUT)
  {
    errorstatus = SD_CMD_RSP_TIMEOUT;
    SDIO_ClearFlag(SDIO_FLAG_CTIMEOUT);
    return(errorstatus);
  }
  else if (status & SDIO_FLAG_CCRCFAIL)
  {
    errorstatus = SD_CMD_CRC_FAIL;
    SDIO_ClearFlag(SDIO_FLAG_CCRCFAIL);
    return(errorstatus);
  }

  /*!< Check response received is of desired command */
  if (SDIO_GetCommandResponse() != cmd)
  {
    errorstatus = SD_ILLEGAL_CMD;
    return(errorstatus);
  }

  /*!< Clear all the static flags */
  SDIO_ClearFlag(SDIO_STATIC_FLAGS);

  /*!< We have received response, retrieve it for analysis  */
  response_r1 = SDIO_GetResponse(SDIO_RESP1);

  if ((response_r1 & SD_OCR_ERRORBITS) == SD_ALLZERO)
  {
    return(errorstatus);
  }

  if (response_r1 & SD_OCR_ADDR_OUT_OF_RANGE)
  {
    return(SD_ADDR_OUT_OF_RANGE);
  }

  if (response_r1 & SD_OCR_ADDR_MISALIGNED)
  {
    return(SD_ADDR_MISALIGNED);
  }

  if (response_r1 & SD_OCR_BLOCK_LEN_ERR)
  {
    return(SD_BLOCK_LEN_ERR);
  }

  if (response_r1 & SD_OCR_ERASE_SEQ_ERR)
  {
    return(SD_ERASE_SEQ_ERR);
  }

  if (response_r1 & SD_OCR_BAD_ERASE_PARAM)
  {
    return(SD_BAD_ERASE_PARAM);
  }

  if (response_r1 & SD_OCR_WRITE_PROT_VIOLATION)
  {
    return(SD_WRITE_PROT_VIOLATION);
  }

  if (response_r1 & SD_OCR_LOCK_UNLOCK_FAILED)
  {
    return(SD_LOCK_UNLOCK_FAILED);
  }

  if (response_r1 & SD_OCR_COM_CRC_FAILED)
  {
    return(SD_COM_CRC_FAILED);
  }

  if (response_r1 & SD_OCR_ILLEGAL_CMD)
  {
    return(SD_ILLEGAL_CMD);
  }

  if (response_r1 & SD_OCR_CARD_ECC_FAILED)
  {
    return(SD_CARD_ECC_FAILED);
  }

  if (response_r1 & SD_OCR_CC_ERROR)
  {
    return(SD_CC_ERROR);
  }

  if (response_r1 & SD_OCR_GENERAL_UNKNOWN_ERROR)
  {
    return(SD_GENERAL_UNKNOWN_ERROR);
  }

  if (response_r1 & SD_OCR_STREAM_READ_UNDERRUN)
  {
    return(SD_STREAM_READ_UNDERRUN);
  }

  if (response_r1 & SD_OCR_STREAM_WRITE_OVERRUN)
  {
    return(SD_STREAM_WRITE_OVERRUN);
  }

  if (response_r1 & SD_OCR_CID_CSD_OVERWRIETE)
  {
    return(SD_CID_CSD_OVERWRITE);
  }

  if (response_r1 & SD_OCR_WP_ERASE_SKIP)
  {
    return(SD_WP_ERASE_SKIP);
  }

  if (response_r1 & SD_OCR_CARD_ECC_DISABLED)
  {
    return(SD_CARD_ECC_DISABLED);
  }

  if (response_r1 & SD_OCR_ERASE_RESET)
  {
    return(SD_ERASE_RESET);
  }

  if (response_r1 & SD_OCR_AKE_SEQ_ERROR)
  {
    return(SD_AKE_SEQ_ERROR);
  }
  return(errorstatus);
}

在这里插入图片描述
上面的逻辑分析仪解析出来的CMD7响应不知道外什么会解析成R6,在这里我们忽略逻辑分析仪的解析结果。通过上述的波形可以看到,SD卡返回的卡状态数据位0x700,通过SD卡状态表分析可知
在这里插入图片描述
当前SD卡已经处于standby状态,并且已经准备就绪。

设置SD卡总线宽度

程序经过上面的步骤之后,SD卡就进入了准备状态,此时我们需要将SD卡设置成4位总线的模式,但是并不是所有的SD卡都支持4位总线模式,所以我们需要通过查询SD卡的SCR寄存器,查看SD卡是否支持4线模式。

CMD55:APP_CMD

查询SD卡的SCR寄存器的命令是ACMD51,该命令是特殊应用命令,所以在发送ACMD51前需要先发送CMD55。有关CMD55命令的使用在前面的章节已经讲过了,这里就不细讲了。不过需要注意的是,这里的CMD55命令需要带上查询的SD卡的RCA地址

  SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) RCA << 16; // SD卡的RCA
  SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_APP_CMD; // CMD55
  SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; // 短响应
  SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; // 不等待
  SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; // 使能CPSM状态机
  SDIO_SendCommand(&SDIO_CmdInitStructure);

  errorstatus = CmdResp1Error(SD_CMD_APP_CMD); // 判断命令是否发送成功

在这里插入图片描述
在这里插入图片描述

ACMD51:SEND_SCR

CMD51的作用是读取SCR寄存器,查看需要操作的SD卡是否支持4线模式。
在这里插入图片描述

命令发送
SDIO_CmdInitStruct.SDIO_Argument = 0x0; // 不带参数
SDIO_CmdInitStruct.SDIO_CmdIndex = SD_CMD_SEND_SCR; // 命令索引 ACMD51
SDIO_CmdInitStruct.SDIO_CPSM = SDIO_CPSM_Enable; // 使能CPSM状态机
SDIO_CmdInitStruct.SDIO_Response = SDIO_Response_Short; //短响应
SDIO_CmdInitStruct.SDIO_Wait = SDIO_Wait_No; // 不等待
SDIO_SendCommand(&SDIO_CmdInitStruct);

在这里插入图片描述

命令响应

ACMD51的响应类型是R1,主机需要判断SD卡的状态是否准备就绪。
在这里插入图片描述

	
static SD_Error CmdResp1Error(uint8_t cmd)
{
  SD_Error errorstatus = SD_OK;
  uint32_t status;
  uint32_t response_r1;

  status = SDIO->STA;

  while (!(status & (SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT)))
  {
    status = SDIO->STA;
  }

  if (status & SDIO_FLAG_CTIMEOUT)
  {
    errorstatus = SD_CMD_RSP_TIMEOUT;
    SDIO_ClearFlag(SDIO_FLAG_CTIMEOUT);
    return(errorstatus);
  }
  else if (status & SDIO_FLAG_CCRCFAIL)
  {
    errorstatus = SD_CMD_CRC_FAIL;
    SDIO_ClearFlag(SDIO_FLAG_CCRCFAIL);
    return(errorstatus);
  }

  /*!< Check response received is of desired command */
  if (SDIO_GetCommandResponse() != cmd)
  {
    errorstatus = SD_ILLEGAL_CMD;
    return(errorstatus);
  }

  /*!< Clear all the static flags */
  SDIO_ClearFlag(SDIO_STATIC_FLAGS);

  /*!< We have received response, retrieve it for analysis  */
  response_r1 = SDIO_GetResponse(SDIO_RESP1);

  if ((response_r1 & SD_OCR_ERRORBITS) == SD_ALLZERO)
  {
    return(errorstatus);
  }

  if (response_r1 & SD_OCR_ADDR_OUT_OF_RANGE)
  {
    return(SD_ADDR_OUT_OF_RANGE);
  }

  if (response_r1 & SD_OCR_ADDR_MISALIGNED)
  {
    return(SD_ADDR_MISALIGNED);
  }

  if (response_r1 & SD_OCR_BLOCK_LEN_ERR)
  {
    return(SD_BLOCK_LEN_ERR);
  }

  if (response_r1 & SD_OCR_ERASE_SEQ_ERR)
  {
    return(SD_ERASE_SEQ_ERR);
  }

  if (response_r1 & SD_OCR_BAD_ERASE_PARAM)
  {
    return(SD_BAD_ERASE_PARAM);
  }

  if (response_r1 & SD_OCR_WRITE_PROT_VIOLATION)
  {
    return(SD_WRITE_PROT_VIOLATION);
  }

  if (response_r1 & SD_OCR_LOCK_UNLOCK_FAILED)
  {
    return(SD_LOCK_UNLOCK_FAILED);
  }

  if (response_r1 & SD_OCR_COM_CRC_FAILED)
  {
    return(SD_COM_CRC_FAILED);
  }

  if (response_r1 & SD_OCR_ILLEGAL_CMD)
  {
    return(SD_ILLEGAL_CMD);
  }

  if (response_r1 & SD_OCR_CARD_ECC_FAILED)
  {
    return(SD_CARD_ECC_FAILED);
  }

  if (response_r1 & SD_OCR_CC_ERROR)
  {
    return(SD_CC_ERROR);
  }

  if (response_r1 & SD_OCR_GENERAL_UNKNOWN_ERROR)
  {
    return(SD_GENERAL_UNKNOWN_ERROR);
  }

  if (response_r1 & SD_OCR_STREAM_READ_UNDERRUN)
  {
    return(SD_STREAM_READ_UNDERRUN);
  }

  if (response_r1 & SD_OCR_STREAM_WRITE_OVERRUN)
  {
    return(SD_STREAM_WRITE_OVERRUN);
  }

  if (response_r1 & SD_OCR_CID_CSD_OVERWRIETE)
  {
    return(SD_CID_CSD_OVERWRITE);
  }

  if (response_r1 & SD_OCR_WP_ERASE_SKIP)
  {
    return(SD_WP_ERASE_SKIP);
  }

  if (response_r1 & SD_OCR_CARD_ECC_DISABLED)
  {
    return(SD_CARD_ECC_DISABLED);
  }

  if (response_r1 & SD_OCR_ERASE_RESET)
  {
    return(SD_ERASE_RESET);
  }

  if (response_r1 & SD_OCR_AKE_SEQ_ERROR)
  {
    return(SD_AKE_SEQ_ERROR);
  }
  return(errorstatus);
}

在这里插入图片描述
从波形图上可知,SD卡返回的卡状态是0x920,根据SD卡状态表可知,当前SD卡已经接收到ACMD命令并解析成功,总线上可以接收数据,并且已经进入传输模式。
在这里插入图片描述

设置SDIO控制器数据传输模式

当主机发送ACMD51命令并且SD卡响应正常时,下一步就可以开始在数据线上读取SCR寄存器数据了,但是在读取数据之前,我们需要将配置SDIO控制器的数据传输模式。

/* 
	因为SCR寄存器是64位,所以这里的数据长度设置为8字节
*/
SDIO_DataInitStruct.SDIO_DataBlockSize = SDIO_DataBlockSize_8b; // 数据块8字节
SDIO_DataInitStruct.SDIO_DataLength = 8;  // 数据长度8字节
SDIO_DataInitStruct.SDIO_DataTimeOut = SD_DATATIMEOUT; // 超时时间
SDIO_DataInitStruct.SDIO_DPSM = SDIO_DPSM_Enable; // 使能DPSM状态机
SDIO_DataInitStruct.SDIO_TransferDir = SDIO_TransferDir_ToSDIO; // 数据传输方向为SD卡到SDIO控制器
SDIO_DataInitStruct.SDIO_TransferMode = SDIO_TransferMode_Block; // 传输模式为块传输
SDIO_DataConfig(&SDIO_DataInitStruct);

读取SCR寄存器

设置好SDIO的数据传输模式之后,下一步就可以开始读取SD卡的SCR寄存器了。

SDIO_ReadData这个函数是用来读取SD卡数据线上的数据,返回的一个32位的数据,因为SCR寄存器是64位的寄存器,所以我们需要连续读取两次。

while (!(SDIO->STA & (SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR)))
	{
		if (SDIO_GetFlagStatus(SDIO_FLAG_RXDAVL) != RESET)
		{
		  tempscr[index] = SDIO_ReadData(); // 连续读取两次
		  index++;
		  if(index >= 2)
			  break;
		}
	}

读取到的数据还需要对其进行处理

pscr[0] =  ((tempscr[0] & 0xFF) << 24) | (((tempscr[0] >> 8) & 0xFF) << 16) | (((tempscr[0] >> 16) & 0xFF) << 8) | (((tempscr[0] >> 24) & 0xFF));
pscr[1] =  ((tempscr[1] & 0xFF) << 24) | (((tempscr[1] >> 8) & 0xFF) << 16) | (((tempscr[1] >> 16) & 0xFF) << 8) | (((tempscr[1] >> 24) & 0xFF));

最后从SD卡读取到的SCR寄存器数据是0x0205808301000000

SCR寄存器数据解析

SCR寄存器的数据解析如下
在这里插入图片描述

NameFieldWidthCID-sliceValue
SCR StructureSCR_STRUCTURE4[63:60]0x0
SD Memory Card - Spec. VersionSD_SPEC4[59:56]0x2
data_status_after erasesDATA_STAT_AFTER_ERASE1[55:55]0x0
CPRM Security SupportSD_SECURITY3[54:52]0x0
DAT Bus widths supportedSD_BUS_WIDTHS4[51:48]0x5
Spec. Version 3.00 or higherSD_SPEC31[47:47]1
Extended Security SupportEX_ SECURITY4[46:43]0x0
Spec. Version 4.00 or higherSD_SPEC41[42:42]0x0
Spec. Version 5.00 or higherSD_SPECX4[41:38]0x2
ReservedX2[37:36]0x0
Command Support bitsCMD_SUPPORT4[35:32]0x3
reserved for manufacturer usageX32[31:0]0x01000000

在这里插入图片描述
从上面表格的SD_BUS_WIDTHS可知,读出来的SD_BUS_WIDTHS为0x5,也就是bit2为1,说明该SD卡支持4位总线模式。

设置SD卡总线宽度

通过上述的操作,我们知道操作的SD卡支持4线模式,所以下一步我们就需要将SD卡设置成4线模式

CMD55:APP_CMD

因为设置SD卡总线宽度的命令是特殊应用命令,所以在发送设置总线宽度命令前,需要发送CMD55命令

SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) RCA << 16; SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_APP_CMD;
SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
SDIO_SendCommand(&SDIO_CmdInitStructure);

errorstatus = CmdResp1Error(SD_CMD_APP_CMD);

ACMD6:SET_BUS_WIDTH

ACMD6命令的作用是设置SD卡总线宽度,支持设置1位总线宽度和4位总线宽度。当传入参数为0时设置1位总线,传入参数为2时设置4位总线

在这里插入图片描述

SDIO_CmdInitStructure.SDIO_Argument = 0x2; // 参数为2,设置4位总线宽度
SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_APP_SD_SET_BUSWIDTH; // 命令索引,ACMD16
SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; // 短响应
SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
SDIO_SendCommand(&SDIO_CmdInitStructure);

在这里插入图片描述

命令响应

ACMD16的响应类型是R1响应,同样需要判断响应是否正常

static SD_Error CmdResp1Error(uint8_t cmd)
{
  SD_Error errorstatus = SD_OK;
  uint32_t status;
  uint32_t response_r1;

  status = SDIO->STA;

  while (!(status & (SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT)))
  {
    status = SDIO->STA;
  }

  if (status & SDIO_FLAG_CTIMEOUT)
  {
    errorstatus = SD_CMD_RSP_TIMEOUT;
    SDIO_ClearFlag(SDIO_FLAG_CTIMEOUT);
    return(errorstatus);
  }
  else if (status & SDIO_FLAG_CCRCFAIL)
  {
    errorstatus = SD_CMD_CRC_FAIL;
    SDIO_ClearFlag(SDIO_FLAG_CCRCFAIL);
    return(errorstatus);
  }

  /*!< Check response received is of desired command */
  if (SDIO_GetCommandResponse() != cmd)
  {
    errorstatus = SD_ILLEGAL_CMD;
    return(errorstatus);
  }

  /*!< Clear all the static flags */
  SDIO_ClearFlag(SDIO_STATIC_FLAGS);

  /*!< We have received response, retrieve it for analysis  */
  response_r1 = SDIO_GetResponse(SDIO_RESP1);

  if ((response_r1 & SD_OCR_ERRORBITS) == SD_ALLZERO)
  {
    return(errorstatus);
  }

  if (response_r1 & SD_OCR_ADDR_OUT_OF_RANGE)
  {
    return(SD_ADDR_OUT_OF_RANGE);
  }

  if (response_r1 & SD_OCR_ADDR_MISALIGNED)
  {
    return(SD_ADDR_MISALIGNED);
  }

  if (response_r1 & SD_OCR_BLOCK_LEN_ERR)
  {
    return(SD_BLOCK_LEN_ERR);
  }

  if (response_r1 & SD_OCR_ERASE_SEQ_ERR)
  {
    return(SD_ERASE_SEQ_ERR);
  }

  if (response_r1 & SD_OCR_BAD_ERASE_PARAM)
  {
    return(SD_BAD_ERASE_PARAM);
  }

  if (response_r1 & SD_OCR_WRITE_PROT_VIOLATION)
  {
    return(SD_WRITE_PROT_VIOLATION);
  }

  if (response_r1 & SD_OCR_LOCK_UNLOCK_FAILED)
  {
    return(SD_LOCK_UNLOCK_FAILED);
  }

  if (response_r1 & SD_OCR_COM_CRC_FAILED)
  {
    return(SD_COM_CRC_FAILED);
  }

  if (response_r1 & SD_OCR_ILLEGAL_CMD)
  {
    return(SD_ILLEGAL_CMD);
  }

  if (response_r1 & SD_OCR_CARD_ECC_FAILED)
  {
    return(SD_CARD_ECC_FAILED);
  }

  if (response_r1 & SD_OCR_CC_ERROR)
  {
    return(SD_CC_ERROR);
  }

  if (response_r1 & SD_OCR_GENERAL_UNKNOWN_ERROR)
  {
    return(SD_GENERAL_UNKNOWN_ERROR);
  }

  if (response_r1 & SD_OCR_STREAM_READ_UNDERRUN)
  {
    return(SD_STREAM_READ_UNDERRUN);
  }

  if (response_r1 & SD_OCR_STREAM_WRITE_OVERRUN)
  {
    return(SD_STREAM_WRITE_OVERRUN);
  }

  if (response_r1 & SD_OCR_CID_CSD_OVERWRIETE)
  {
    return(SD_CID_CSD_OVERWRITE);
  }

  if (response_r1 & SD_OCR_WP_ERASE_SKIP)
  {
    return(SD_WP_ERASE_SKIP);
  }

  if (response_r1 & SD_OCR_CARD_ECC_DISABLED)
  {
    return(SD_CARD_ECC_DISABLED);
  }

  if (response_r1 & SD_OCR_ERASE_RESET)
  {
    return(SD_ERASE_RESET);
  }

  if (response_r1 & SD_OCR_AKE_SEQ_ERROR)
  {
    return(SD_AKE_SEQ_ERROR);
  }
  return(errorstatus);
}

在这里插入图片描述
当到了这一步之后,SD的初始化就算是成功了,后面就可以对SD卡进行擦除和读写测试了。

步骤

  1. 设置SDIO_CK时钟为24MHz
  2. 选中需要操作的SD卡
  3. 设置SDIO控制器的数据传输模式,准备读取SCR寄存器
  4. 读取SCR寄存器,判断是否支持4位总线模式
  5. 如果SD卡支持4位总线模式,则设置SD卡为4位总线模式,否则设置1位总线模式
  6. SD卡初始化完成,准备擦除、读写测试
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F4基于SDIO总线的读写SD需要使用FATFS文件系统。要实现这个功能,首先需要配置STM32F4的SDIO接口以及相应的GPIO引脚。接下来,我们可以按照以下步骤进行读写SD: 1. 初始化SDIO接口:初始化SDIO控制器,并设置时钟和数据传输属性。 2. 初始化GPIO引脚:配置SDIO通信需要使用的GPIO引脚,包括CMD线、CLK线、以及数据线(D0-D3)。 3. 初始化SD:使用SDIO发送SD初始化命令,以便与SD进行通信。这个过程包括等待SD响应、发送上电命令、以及读取SD的OCR(操作条件寄存器)。 4. 检查SD状态:通过发送CMD13命令,读取SD状态信息。这个过程可以确保SD正常工作并准备好读取或写入数据。 5. 挂载文件系统:使用FATFS库中的函数,将SD上的文件系统挂载到指定的逻辑驱动器。 6. 打开文件:使用FATFS库中的函数,打开指定的文件。 7. 读取或写入数据:使用FATFS库中的函数,读取或写入数据到SD上的文件。 8. 关闭文件:使用FATFS库中的函数,关闭文件。 9. 卸载文件系统:使用FATFS库中的函数,卸载SD上的文件系统。 需要注意的是,在进行读写操作时,需要确保SD已经插入并且正确连接到SDIO接口上。此外,还需要根据SD的规格以及相应的存储格式,进行适当的读写操作。 以上就是基于SDIO总线的读写SD的基本步骤。通过使用FATFS库,我们可以很方便地实现对SD的读写操作,以便进行数据存储和读取。希望这个回答能够对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值