新手上路
- 积分
- 39
- 金钱
- 39
- 注册时间
- 2015-6-25
- 在线时间
- 0 小时
|
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参考手册的寄存器描述。
|