硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1021|回复: 5
收起左侧

SDIO HAL库疑问

[复制链接]

55

主题

131

回帖

296

积分

高级会员

积分
296
发表于 2022-8-23 11:10:38 | 显示全部楼层 |阅读模式
1、执行读写操作时,对于标准卡的地址为什么要乘以512,高容量的卡就不用?

例如函数HAL_StatusTypeDef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks, uint32_t Timeout)

[C] 纯文本查看 复制代码
    if(hsd->SdCard.CardType != CARD_SDHC_SDXC)
    {
[color=#ff0000]      add *= 512U;[/color]
    }



2、函数HAL_StatusTypeDef HAL_SD_ConfigWideBusOperation(SD_HandleTypeDef *hsd, uint32_t WideMode)
调用SD_FindSCR为什么要配置块大小为8byte?

[C] 纯文本查看 复制代码
static uint32_t SD_FindSCR(SD_HandleTypeDef *hsd, uint32_t *pSCR)
{
  SDIO_DataInitTypeDef config;
  uint32_t errorstate;
  uint32_t tickstart = HAL_GetTick();
  uint32_t index = 0U;
  uint32_t tempscr[2U] = {0U, 0U};
  uint32_t *scr = pSCR;

  /* Set Block Size To 8 Bytes */
  errorstate = [color=#ff0000]SDMMC_CmdBlockLength(hsd->Instance, 8U);[/color]
  if(errorstate != HAL_SD_ERROR_NONE)
  {
    return errorstate;
  }

  /* Send CMD55 APP_CMD with argument as card's RCA */
  errorstate = SDMMC_CmdAppCommand(hsd->Instance, (uint32_t)((hsd->SdCard.RelCardAdd) << 16U));
  if(errorstate != HAL_SD_ERROR_NONE)
  {
    return errorstate;
  }

  config.DataTimeOut   = SDMMC_DATATIMEOUT;
[color=#ff0000]  config.DataLength    = 8U;[/color]
[color=#ff0000]  config.DataBlockSize = SDIO_DATABLOCK_SIZE_8B[/color];
  config.TransferDir   = SDIO_TRANSFER_DIR_TO_SDIO;
  config.TransferMode  = SDIO_TRANSFER_MODE_BLOCK;
  config.DPSM          = SDIO_DPSM_ENABLE;
  (void)SDIO_ConfigData(hsd->Instance, &config);

  /* Send ACMD51 SD_APP_SEND_SCR with argument as 0 */
  errorstate = SDMMC_CmdSendSCR(hsd->Instance);
  if(errorstate != HAL_SD_ERROR_NONE)
  {
    return errorstate;
  }

  while(!__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT))
  {
    if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXDAVL))
    {
      *(tempscr + index) = SDIO_ReadFIFO(hsd->Instance);
      index++;
    }
    else if(!__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXACT))
    {
      break;
    }

    if((HAL_GetTick() - tickstart) >=  SDMMC_DATATIMEOUT)
    {
      return HAL_SD_ERROR_TIMEOUT;
    }
  }

  if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT))
  {
    __HAL_SD_CLEAR_FLAG(hsd, SDIO_FLAG_DTIMEOUT);

    return HAL_SD_ERROR_DATA_TIMEOUT;
  }
  else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL))
  {
    __HAL_SD_CLEAR_FLAG(hsd, SDIO_FLAG_DCRCFAIL);

    return HAL_SD_ERROR_DATA_CRC_FAIL;
  }
  else if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR))
  {
    __HAL_SD_CLEAR_FLAG(hsd, SDIO_FLAG_RXOVERR);

    return HAL_SD_ERROR_RX_OVERRUN;
  }
  else
  {
    /* No error flag set */
    /* Clear all the static flags */
    __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_DATA_FLAGS);

    *scr = (((tempscr[1] & SDMMC_0TO7BITS) << 24)  | ((tempscr[1] & SDMMC_8TO15BITS) << 8) |\
            ((tempscr[1] & SDMMC_16TO23BITS) >> 8) | ((tempscr[1] & SDMMC_24TO31BITS) >> 24));
    scr++;
    *scr = (((tempscr[0] & SDMMC_0TO7BITS) << 24)  | ((tempscr[0] & SDMMC_8TO15BITS) << 8) |\
            ((tempscr[0] & SDMMC_16TO23BITS) >> 8) | ((tempscr[0] & SDMMC_24TO31BITS) >> 24));

  }

  return HAL_SD_ERROR_NONE;
}






回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106578
QQ
发表于 2022-8-24 01:41:17 | 显示全部楼层
帮顶,这个得研究SDIO协议才行。
回复

使用道具 举报

55

主题

131

回帖

296

积分

高级会员

积分
296
 楼主| 发表于 2022-8-24 10:32:28 | 显示全部楼层
eric2013 发表于 2022-8-24 01:41
帮顶,这个得研究SDIO协议才行。

看了协议,第一个问题知道怎么回事了,第二个问题就不知道了,还有一个函数HAL_SD_GetCardStatus是设置块长度为64byte,也不知道为什么
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106578
QQ
发表于 2022-8-25 10:28:29 | 显示全部楼层
lindahnu 发表于 2022-8-24 10:32
看了协议,第一个问题知道怎么回事了,第二个问题就不知道了,还有一个函数HAL_SD_GetCardStatus是设置块 ...

还得继续研究,我平时没关心过这个,都是直接用,有问题再查查,懒了。
回复

使用道具 举报

55

主题

131

回帖

296

积分

高级会员

积分
296
 楼主| 发表于 2022-9-6 11:16:33 | 显示全部楼层
由于SCR是64bit,所以要设置块长度为8byte,而SD状态为512bit,所以设置为64byte
回复

使用道具 举报

55

主题

131

回帖

296

积分

高级会员

积分
296
 楼主| 发表于 2022-9-6 11:18:15 | 显示全部楼层
SCR为64bit,SD卡状态为512bit,所以要分别设置块长度为8byte和64byte
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-25 14:05 , Processed in 0.225777 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表