SD卡CSD version2解析

<pre name="code" class="plain">
花半天写的解析,供以后需要使用
 
typedef unsigned int UINT32;

int main(int argc, char *argv[]) {
	//UINT32 csd_arr[4]={0x400e0032,0x5b590001,0xd0df7f80,0xa4000f7};
	UINT32 csd_arr[4]={0x400e0032,0x5b590001,0xd87d7f80,0xa40005d};

	UINT32 CSD_Structure=(csd_arr[0]&0xc0000000)>>30;
	UINT32 reserved=(csd_arr[0]&0x3f000000)>>24;
	UINT32 time=(csd_arr[0]&0x00ff0000)>>16;
	UINT32 timeclk=(csd_arr[0]&0x0000ff00)>>8;
	UINT32 max_rate=csd_arr[0]&0x000000ff;
	UINT32 cmd_class=(csd_arr[1]&0xfff00000)>>20;
	UINT32 rdata_len=(csd_arr[1]&0x000f0000)>>16;
	UINT32 pbra=(csd_arr[1]&0x00008000)>>15;
	UINT32 wbm=(csd_arr[1]&0x00004000)>>14;
	UINT32 rbm=(csd_arr[1]&0x00002000)>>13;
	UINT32 dsr_imp=(csd_arr[1]&0x00001000)>>12;
	UINT32 reserved2=(csd_arr[1]&0x00000fc0)>>4;
	UINT32 device_size=(csd_arr[1]&0x0000003f)<<16|((csd_arr[2]&0xffff0000)>>16);
	UINT32 reserved3=(csd_arr[2]&0x00008000)>>15;
	UINT32 esbe=(csd_arr[2]&0x00004000)>>14;//erase single block enable
	UINT32 ess=(csd_arr[2]&0x00003f80)>>7;//erase sector size
	UINT32 write_protect_group_size=(csd_arr[2]&0x0000007f);
	UINT32 write_protect_group_enable=(csd_arr[3]&0x80000000)>>31;
	UINT32 reserved4=(csd_arr[3]&0x60000000)>>29;
	UINT32 write_speed_factor=(csd_arr[3]&0x1c000000)>>26;
	UINT32 max_write_data_block_len=(csd_arr[3]&0x03c00000)>>22;
	UINT32 partial_blocks_for_write=(csd_arr[3]&0x00200000)>>21;
	UINT32 reserved5=(csd_arr[3]&0x001f0000)>>16;
	UINT32 file_format_group=(csd_arr[3]&0x00008000)>>15;
	UINT32 copy_flag=(csd_arr[3]&0x00004000)>>14;
	UINT32 permanent_write_protection=(csd_arr[3]&0x00002000)>>13;
	UINT32 temporary_write_protection=(csd_arr[3]&0x00001000)>>12;
	UINT32 file_format=(csd_arr[3]&0x00000c00)>>10;
	UINT32 reserved6=(csd_arr[3]&0x00000300)>>8;
	UINT32 crc=(csd_arr[3]&0xfe)>>1;
	UINT32 nouse=csd_arr[3]&0x1;//'1'
	
	printf("CSD_Structure:%d\r\n", CSD_Structure);
	printf("reserved:%d\r\n", reserved);
	printf("time:%d\r\n", time);
	printf("timeclk:%d\r\n", timeclk);
	printf("max_rate:%d\r\n", max_rate);
	printf("cmd_class:%d\r\n", cmd_class);
	printf("rdata_len:%d\r\n", rdata_len);
	printf("pbra:%d\r\n", pbra);
	printf("wbm:%d\r\n", wbm);
	printf("rbm:%d\r\n", rbm);
	printf("dsr_imp:%d\r\n", dsr_imp);
	printf("reserved2:%d\r\n", reserved2);
	printf("device_size:%d\r\n", device_size);
	printf("reserved3:%d\r\n", reserved3);
	printf("esbe:%d\r\n", esbe);
	printf("ess:%d\r\n", ess);
	printf("write_protect_group_size:%d\r\n", write_protect_group_size);
	printf("write_protect_group_enable:%d\r\n", write_protect_group_enable);
	printf("reserved4:%d\r\n", reserved4);
	printf("write_speed_factor:%d\r\n", write_speed_factor);
	printf("max_write_data_block_len:%d\r\n", max_write_data_block_len);
	printf("partial_blocks_for_write:%d\r\n", partial_blocks_for_write);
	printf("reserved5:%d\r\n", reserved5);
	printf("file_format_group:%d\r\n", file_format_group);
	printf("copy_flag:%d\r\n", copy_flag);
	printf("permanent_write_protection:%d\r\n", permanent_write_protection);
	printf("temporary_write_protection:%d\r\n", temporary_write_protection);
	printf("file_format:%d\r\n", file_format);
	printf("reserved6:%d\r\n", reserved6);
	printf("crc:%d\r\n", crc);
	printf("nouse:%d\r\n", nouse);

	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的SD卡存储数据的程序示例,您可以根据自己的需求进行修改: ```c #include "stm32f4xx_hal.h" #include <string.h> /* SD卡句柄定义 */ SD_HandleTypeDef hsd; /* SD卡初始化函数 */ void MX_SDIO_SD_Init(void) { /* 初始化SD卡时钟 */ __HAL_RCC_SDIO_CLK_ENABLE(); /* 初始化DMA时钟 */ __HAL_RCC_DMA2_CLK_ENABLE(); /* 初始化SDIO GPIO引脚 */ GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); /* 初始化DMA配置 */ hdma_sdio_rx.Instance = DMA2_Stream3; hdma_sdio_rx.Init.Channel = DMA_CHANNEL_4; hdma_sdio_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma_sdio_rx.Init.PeriphInc = DMA_PINC_DISABLE; hdma_sdio_rx.Init.MemInc = DMA_MINC_ENABLE; hdma_sdio_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; hdma_sdio_rx.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; hdma_sdio_rx.Init.Mode = DMA_PFCTRL; hdma_sdio_rx.Init.Priority = DMA_PRIORITY_VERY_HIGH; hdma_sdio_rx.Init.FIFOMode = DMA_FIFOMODE_ENABLE; hdma_sdio_rx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; hdma_sdio_rx.Init.MemBurst = DMA_MBURST_INC4; hdma_sdio_rx.Init.PeriphBurst = DMA_PBURST_INC4; HAL_DMA_Init(&hdma_sdio_rx); /* 初始化SDIO配置 */ hsd.Instance = SDIO; hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING; hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE; hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE; hsd.Init.BusWide = SDIO_BUS_WIDE_1B; hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE; hsd.Init.ClockDiv = 0; HAL_SD_Init(&hsd, &SDCardInfo); /* 初始化SD卡信息 */ HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B); HAL_SD_GetCardCID(&hsd, &SDCardInfo.CID); HAL_SD_GetCardCSD(&hsd, &SDCardInfo.CSD); HAL_SD_GetCardStatus(&hsd, &SDCardInfo.CardStatus); HAL_SD_GetCardInfo(&hsd, &SDCardInfo); } /* SD卡读取函数 */ uint8_t SD_ReadBlocks(uint32_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks) { if(HAL_SD_ReadBlocks_DMA(&hsd, (uint8_t *)pData, BlockAdd, NumberOfBlocks) != HAL_OK) { return 1; } if(HAL_SD_CheckReadOperation(&hsd, (uint32_t)SD_DATATIMEOUT) != HAL_OK) { return 2; } return 0; } /* SD卡写入函数 */ uint8_t SD_WriteBlocks(uint32_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks) { if(HAL_SD_WriteBlocks_DMA(&hsd, (uint8_t *)pData, BlockAdd, NumberOfBlocks) != HAL_OK) { return 1; } if(HAL_SD_CheckWriteOperation(&hsd, (uint32_t)SD_DATATIMEOUT) != HAL_OK) { return 2; } return 0; } /* 存储数据到SD卡 */ void store_data_to_sd(uint32_t *data, uint32_t block_addr, uint32_t block_num) { /* 写入数据到SD卡 */ SD_WriteBlocks(data, block_addr, block_num); } int main(void) { /* 初始化SD卡 */ MX_SDIO_SD_Init(); /* 存储数据到SD卡 */ uint32_t data[512] = {0}; // 数据缓冲区 uint32_t block_addr = 0; // SD卡起始块地址 uint32_t block_num = 1; // SD卡块数 memcpy(data, "Hello World!", sizeof("Hello World!")); // 将数据拷贝到缓冲区 store_data_to_sd(data, block_addr, block_num); // 存储数据到SD卡 while (1) { // 主循环 } } ``` 示例程序中,我们使用了一个名为`store_data_to_sd`的函数来将数据存储到SD卡中。该函数接受三个参数:数据缓冲区、SD卡起始块地址以及SD卡块数。在该函数内部,我们调用了`SD_WriteBlocks`函数来将数据写入到SD卡中。 需要注意的是,我们在程序开头调用了`MX_SDIO_SD_Init`函数来初始化SD卡。在实际使用中,您需要将`block_addr`和`block_num`参数设置为您要存储数据的SD卡起始块地址和块数。此外,您还需要根据自己的需求修改数据缓冲区的大小和内容。 希望这个示例程序能够帮助您开始存储数据到SD卡中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值