目錄
一、SD卡簡介
二、源碼下載
三、移植條件
1、芯片參數(shù)
2、硬件連接
四、驅(qū)動代碼
1、依賴宏如下
2、驅(qū)動代碼實(shí)現(xiàn)
3、測試代碼
4、運(yùn)行截圖
五、總結(jié)
一、SD卡簡介
SD卡有SDIO驅(qū)動模式和SPI驅(qū)動模式,本例中使用SDIO模式驅(qū)動SD卡。
二、源碼下載
https://download.csdn.net/download/qq_30095023/88702705https://download.csdn.net/download/qq_30095023/88702705
三、移植條件
1、芯片參數(shù)
芯片類型:STM32F407ZGT6。
flash大小為1024KB,RAM大小 128KB。
2、硬件連接
本例使用開發(fā)板上的SD卡插口,測試所用SD卡容量大小為8GB。
四、驅(qū)動代碼
note: u8 、u16、u32等為自定義數(shù)據(jù)類型,編譯報(bào)錯請按需修改。LOG_XX為日志打印,請按需替換。
1、依賴宏如下
定義一些SD卡的類型
//SD卡類型
#define ERR 0x00
#define MMC 0x01
#define V1 0x02
#define V2 0x04
#define V2HC 0x06
2、驅(qū)動代碼實(shí)現(xiàn)
1)、ENTER_SD_BLOCK_SIZE定義SD卡的物理扇區(qū)大小為512Byte。
2)、 函數(shù)b_sd_read_write_byte用來讀寫數(shù)據(jù)(兼容SPI模式,忽略)。
3)、函數(shù)b_sd_read_data用來從SD卡讀取指定長度的數(shù)據(jù)。
4)、函數(shù)b_sd_send_block_data用來向SD卡寫入數(shù)據(jù)。
5)、函數(shù)b_sd_init用來初始化SD卡,需要在使用SD卡前調(diào)用一次。
6)、函數(shù)b_sd_get_cid用來查詢SD卡的CID。
7)、函數(shù)b_sd_get_csd用來查詢SD卡的CSD。
8)、函數(shù)b_sd_read_sector用來讀扇區(qū)數(shù)據(jù),該接口一般用于FatFs文件系統(tǒng)。
9)、函數(shù)b_sd_write_sector用來寫扇區(qū)數(shù)據(jù),該接口一般用于FatFs文件系統(tǒng)。
FatFs文件系統(tǒng)移植請參考:FatFs移植到STM32(SD卡)_BIN-XYB的博客-CSDN博客
10)、函數(shù)b_sd_get_sector_number用來查詢SD卡的扇區(qū)數(shù)量。
11)、函數(shù)b_sd_sync_data用來保存SD卡的數(shù)據(jù)。
完整源碼如下:
#include "sd_driver.h"
static u8 sd_type = 0;
#define ENTER_SD_BLOCK_SIZE (512)
#define ENTER_SD_SECTOR_SIZE (ENTER_SD_BLOCK_SIZE)
inline void b_sd_set_speed(u32 speed)
{
return;
}
u8 b_sd_init(void)
{
if(HAL_SD_GetCardState(&hsd) == HAL_SD_CARD_TRANSFER)
{
HAL_SD_CardInfoTypeDef sdcard_info;
HAL_SD_GetCardInfo(&hsd, &sdcard_info);
sd_type = sdcard_info.CardType;
return HAL_OK;
}
else
{
return HAL_ERROR;
}
}
u8 b_sd_get_cid(u8* cid_data)
{
if(HAL_SD_GetCardState(&hsd) == HAL_SD_CARD_TRANSFER)
{
HAL_SD_CardCIDTypeDef sdcard_cid;
HAL_SD_GetCardCID(&hsd,&sdcard_cid);
memcpy(cid_data, hsd.CID, 16);
}
else
{
return HAL_ERROR;
}
return HAL_OK;
}
u8 b_sd_get_csd(u8 *csd_data)
{
if(HAL_SD_GetCardState(&hsd) == HAL_SD_CARD_TRANSFER)
{
HAL_SD_CardCSDTypeDef sdcard_csd;
HAL_SD_GetCardCSD(&hsd,&sdcard_csd);
memcpy(csd_data, hsd.CSD, 16);
}
else
{
return HAL_ERROR;
}
return HAL_OK;
}
s32 b_sd_read_sector(u32 sector, u8 number, u8*data, u32 timeout)
{
sector <<= 9;
if(HAL_SD_ReadBlocks(&hsd, data, sector, number, number * 10) == HAL_OK)
{
while(HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER){};
}
else
{
return HAL_ERROR;
}
return HAL_OK;
}
s32 b_sd_write_sector(u32 sector, u8 number, u8 *data, u32 timeout)
{
sector <<= 9;
if(HAL_SD_WriteBlocks(&hsd, data, sector, number, number * 10) == HAL_OK)
{
while(HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER){};
}
else
{
return HAL_ERROR;
}
return HAL_OK;
}
u32 b_sd_get_sector_number(void)
{
u32 capacity = 0;
if(HAL_SD_GetCardState(&hsd) == HAL_SD_CARD_TRANSFER)
{
HAL_SD_CardInfoTypeDef sdcard_info;
HAL_SD_GetCardInfo(&hsd, &sdcard_info);
capacity = sdcard_info.BlockNbr;
}
else
{
return HAL_ERROR;
}
return capacity;
}
u32 b_sd_get_sector_size(void)
{
return ENTER_SD_SECTOR_SIZE;
}
u32 b_sd_get_block_size(void)
{
return ENTER_SD_BLOCK_SIZE;
}
u32 b_sd_sync_data(void)
{
return 0;
}
u8 b_sd_read_write_byte(u8 tx_data)
{
u8 rx_data = 0;
return rx_data;
}
3、測試代碼
void b_sd_test_demo(void)
{
static u8 test_buffer[ENTER_SD_SECTOR_SIZE] = {0};
LOG_INFO("start b_sd_init\r\n");
u8 ret = b_sd_init();
u8 *p = test_buffer;
LOG_INFO("b_sd_init:%d\r\n", sd_type);
memset(test_buffer, 0, ENTER_SD_SECTOR_SIZE);
ret = b_sd_get_cid(test_buffer);
LOG_INFO("cid:%02X,%02X,%02X,%02X\r\n", p[0],p[1],p[2],p[3]);
LOG_INFO("cid:%02X,%02X,%02X,%02X\r\n", p[4],p[5],p[6],p[7]);
LOG_INFO("cid:%02X,%02X,%02X,%02X\r\n", p[8],p[9],p[10],p[11]);
LOG_INFO("cid:%02X,%02X,%02X,%02X\r\n", p[12],p[13],p[14],p[15]);
LOG_INFO("b_sd_get_cid:%d\r\n", ret);
memset(test_buffer, 0, ENTER_SD_SECTOR_SIZE);
ret = b_sd_get_csd(test_buffer);
LOG_INFO("csd:%02X,%02X,%02X,%02X\r\n", p[0],p[1],p[2],p[3]);
LOG_INFO("csd:%02X,%02X,%02X,%02X\r\n", p[4],p[5],p[6],p[7]);
LOG_INFO("csd:%02X,%02X,%02X,%02X\r\n", p[8],p[9],p[10],p[11]);
LOG_INFO("csd:%02X,%02X,%02X,%02X\r\n", p[12],p[13],p[14],p[15]);
LOG_INFO("b_sd_get_csd:%d\r\n", ret);
u32 num = b_sd_get_sector_number();
LOG_INFO("b_sd_get_sector_number:%d\r\n", num);
LOG_INFO("sd_type:%d\r\n", sd_type);
}
4、運(yùn)行截圖
如上圖所示,可以成功讀取到SD卡cid和csd。文章來源:http://www.zghlxwxcb.cn/news/detail-821757.html
五、總結(jié)
如有問題請指出,感謝!文章來源地址http://www.zghlxwxcb.cn/news/detail-821757.html
到了這里,關(guān)于stm32讀寫SD卡(SDIO模式)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!