OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8397|回复: 4

SD卡设置Block Size的问题

[复制链接]

3

主题

6

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-6-25
在线时间
0 小时
发表于 2015-6-25 11:36:01 | 显示全部楼层 |阅读模式
5金钱
Sd卡种类是sdsc卡时在读卡时设定block size的时候为什么设定为 (uint32_t) 9 << 4,下面第三句程序,这是在一个允许范围内任意设定的吗?或者是规定的算法,2的9次方是512,所以把9左移4位?程序的注解“直接用参数多好。。。SDIO_DataBlockSize_512b”似乎也有问题, (uint32_t) 9 << 4是144吧?


 SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT; //等待超时限制
  SDIO_DataInitStructure.SDIO_DataLength = NumberOfBlocks * BlockSize; //对于块数据传输,数据长度寄存器中的数值必须是数据块长度(见SDIO_DCTRL)的倍数
  SDIO_DataInitStructure.SDIO_DataBlockSize = (uint32_t) 9 << 4; //直接用参数多好。。。SDIO_DataBlockSize_512b
  SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToSDIO;//传输方向
  SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block; //传输模式
  SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Enable; //开启数据状态机
  SDIO_DataConfig(&SDIO_DataInitStructure);

下面是整个ReadMultiBlocks程序段

SD_Error SD_ReadMultiBlocks(uint8_t *readbuff, uint32_t ReadAddr, uint16_t BlockSize, uint32_t NumberOfBlocks)
{
  SD_Error errorstatus = SD_OK;
  TransferError = SD_OK;
  TransferEnd = 0;
  StopCondition = 1;

  SDIO->DCTRL = 0x0; //复位数据控制寄存器

  if (CardType == SDIO_HIGH_CAPACITY_SD_CARD)//sdhc卡的地址以块为单位,每块512字节
 {
    BlockSize = 512;
    ReadAddr /= 512;
  }

  /*!< Set Block Size for Card,cmd16,若是sdsc卡,可以用来设置块大小,若是sdhc卡,块大小为512字节,不受cmd16影响 */
  SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) BlockSize;
  SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SET_BLOCKLEN;
  SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;   //r1
  SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  SDIO_SendCommand(&SDIO_CmdInitStructure);

  errorstatus = CmdResp1Error(SD_CMD_SET_BLOCKLEN);

  if (SD_OK != errorstatus)
  {
    return(errorstatus);
  }
    
  SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT; //等待超时限制
  SDIO_DataInitStructure.SDIO_DataLength = NumberOfBlocks * BlockSize; //对于块数据传输,数据长度寄存器中的数值必须是数据块长度(见SDIO_DCTRL)的倍数
  SDIO_DataInitStructure.SDIO_DataBlockSize = (uint32_t) 9 << 4; //直接用参数多好。。。SDIO_DataBlockSize_512b
  SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToSDIO;//传输方向
  SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block; //传输模式
  SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Enable; //开启数据状态机
  SDIO_DataConfig(&SDIO_DataInitStructure);

  /*!< Send CMD18 READ_MULT_BLOCK with argument data address */
  SDIO_CmdInitStructure.SDIO_Argument = (uint32_t)ReadAddr; //起始地址
  SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_READ_MULT_BLOCK;
  SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; //r1
  SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  SDIO_SendCommand(&SDIO_CmdInitStructure);

  errorstatus = CmdResp1Error(SD_CMD_READ_MULT_BLOCK);

  if (errorstatus != SD_OK)
  {
    return(errorstatus);
  }

  SDIO_ITConfig(SDIO_IT_DATAEND, ENABLE);  //开启数据传输结束中断 ,Data end (data counter, SDIDCOUNT, is zero) interrupt 
  SDIO_DMACmd(ENABLE); //使能dma方式
  SD_DMA_RxConfig((uint32_t *)readbuff, (NumberOfBlocks * BlockSize));//配置DMA接收

  return(errorstatus);
}


最佳答案

查看完整内容[请看2#楼]

这是寄存器设置啊,大哥。 要学会看库函数,不然白学了。 进入:SDIO_DataConfig函数。 看SDIO_DataBlockSize 设置的是哪个寄存器,哪几个位,然后找到这个寄存器,看stm32参考手册的寄存器描述。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-6-25 11:36:02 | 显示全部楼层
这是寄存器设置啊,大哥。
要学会看库函数,不然白学了。
进入:SDIO_DataConfig函数。
看SDIO_DataBlockSize 设置的是哪个寄存器,哪几个位,然后找到这个寄存器,看stm32参考手册的寄存器描述。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

6

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-6-25
在线时间
0 小时
 楼主| 发表于 2015-6-26 11:10:49 | 显示全部楼层
确实理解错了,把9《4理解成了赋值
回复

使用道具 举报

3

主题

6

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-6-25
在线时间
0 小时
 楼主| 发表于 2015-6-27 10:55:56 | 显示全部楼层
    查了参考手册发现了对应的寄存器




回复

使用道具 举报

5

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2016-2-18
在线时间
13 小时
发表于 2016-8-31 16:35:13 | 显示全部楼层
是的 ,设置该寄存器的【4:7】为 1001  512字节。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-29 07:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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