嵌入式開發中經常會用到對外部SD卡進行相關的讀寫操作。下圖是CPU硬件連接示意圖
CPU硬件連接引腳配置瑞如下:
void SD_LowLevel_DeInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*!< Disable SDIO Clock */
SDIO_ClockCmd(DISABLE);
/*!< Set Power State to OFF */
SDIO_SetPowerState(SDIO_PowerState_OFF);
/*!< DeInitializes the SDIO peripheral */
SDIO_DeInit();
/*!< Disable the SDIO AHB Clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_SDIO, DISABLE);
/*!< Configure PC.08, PC.09, PC.10, PC.11, PC.12 pin: D0, D1, D2, D3, CLK pin */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/*!< Configure PD.02 CMD line */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
DMA部分配置如下:
void SD_LowLevel_DMA_TxConfig(uint32_t *BufferSRC, uint32_t BufferSize)
{
DMA_InitTypeDef DMA_InitStructure;
DMA_ClearFlag(SD_SDIO_DMA_FLAG_TC | SD_SDIO_DMA_FLAG_TE | SD_SDIO_DMA_FLAG_HT | SD_SDIO_DMA_FLAG_GL);
/*!< DMA2 Channel4 disable */
DMA_Cmd(SD_SDIO_DMA_CHANNEL, DISABLE);
/*!< SDIO DMA CHANNEL Config */
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SDIO_FIFO_ADDRESS;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)BufferSRC;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = BufferSize / 4;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(SD_SDIO_DMA_CHANNEL, &DMA_InitStructure);
DMA_ITConfig(SD_SDIO_DMA_CHANNEL, DMA_IT_TC, ENABLE);
/*!< SDIO DMA CHANNEL enable */
DMA_Cmd(SD_SDIO_DMA_CHANNEL, ENABLE);
}
void SD_LowLevel_DMA_RxConfig(uint32_t *BufferDST, uint32_t BufferSize)
{
DMA_InitTypeDef DMA_InitStructure;
DMA_ClearFlag(SD_SDIO_DMA_FLAG_TC | SD_SDIO_DMA_FLAG_TE | SD_SDIO_DMA_FLAG_HT | SD_SDIO_DMA_FLAG_GL);
/*!< SDIO DMA CHANNEL disable */
DMA_Cmd(SD_SDIO_DMA_CHANNEL, DISABLE);
/*!< SDIO DMA CHANNEL Config */
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SDIO_FIFO_ADDRESS;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)BufferDST;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = BufferSize / 4;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(SD_SDIO_DMA_CHANNEL, &DMA_InitStructure);
DMA_ITConfig(SD_SDIO_DMA_CHANNEL, DMA_IT_TC, ENABLE);
/*!< SDIO DMA CHANNEL enable */
DMA_Cmd(SD_SDIO_DMA_CHANNEL, ENABLE);
}
uint32_t SD_DMAEndOfTransferStatus(void)
{
return (uint32_t)DMA_GetFlagStatus(DMA2_FLAG_TC4);
}
SDIO函數中斷部分
///sd卡狀態判斷
void SDCARD_Config(void)
{
SD_Error Status = SD_OK;
Status = SD_Init(); //初始化SDIO
if (Status != SD_OK)
{
Display_ErrorWithoutSD((u8 *)"No_SDCard");
}
SDCARD_NVIC_Config();
}
//中斷配置 部分
void SDCARD_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure the NVIC Preemption Priority Bits */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
中斷函數
void SDIO_IRQHandler(void)
{
/* Process All SDIO Interrupt Sources */
SD_ProcessIRQSrc();
}
審核編輯:符乾江
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
嵌入式
+關注
關注
5198文章
20442瀏覽量
333966 -
SD卡
+關注
關注
2文章
589瀏覽量
68683
發布評論請先 登錄
相關推薦
熱點推薦
ESP32 驅動瀚海微SD NAND 完整方案 + FAT/FAT32 驅動核心區別
ESP32?驅動 SD NAND?的核心是基于SDIO?接口(SD NAND?主流通信方式,兼容 SPI?但速率更高),借助樂鑫官方esp-idf框架的SDMMC?驅動庫
SD卡多設備高頻切換讀寫沖突:問題、場景與成因深度解析
讀寫場景中,讀寫沖突問題頻發,嚴重影響數據可靠性與系統穩定性。本文將系統剖析該問題的具體表現、典型應用場景,并從硬件、協議、文件系統及應用層多維度挖掘深層成因。 一、讀寫沖突的核心問題表現 SD卡在多設備高頻切換讀寫時的沖突問
SD NAND、TF卡、SD卡的應用領域大揭秘
在如今這個數據爆炸的時代,各類存儲設備猶如繁星般閃耀,而SD NAND、TF卡和SD卡更是其中的佼佼者。它們看似相似,實則各有千秋,在不同的領域和場景中發揮著獨特的作用。今天,就讓我們
解鎖SD NAND、TF卡、SD卡的應用密碼
在科技飛速發展的今天,數據存儲的需求滲透到生活與工作的每一個角落——從手腕上的智能手表,到專業攝影師的相機,再到工廠里的工業路由器,都離不開高效可靠的存儲介質。SD NAND、TF卡和SD卡
深度剖析Nios II 處理器的硬件抽象層
)與ANSI C標準庫綜合在一起,可使用類似C語言的庫函數來訪問硬件設備或文件,如printf()、fopen()、fwrite()等函數。軟件工程師可非常方便的使用這些函數來與底層
解鎖存儲密碼:SD NAND、TF卡、SD卡的應用全景
在數據洪流的時代,存儲介質就如同數字世界的基石,支撐著各類設備的正常運轉。SD NAND、TF卡和SD卡,雖同屬NAND Flash存儲介質家族,卻因各自獨特的“個性”,在不同領域綻放
SD卡初始化原理講解與實現
分享內容:SD卡
我們對 SD 的讀寫協議一般有 SPI 模式和SDIO 模式兩種,由于SPI 在芯片管腳上只占用四根線,而且SPI實現SD
發表于 10-29 06:33
CS創世SD NAND在北京君正平臺和瑞芯微RK平臺的應用
,并為HOST 層的驅動提供了接口函數
3.host 層: 是這個文件夾屬于 Linux 內核中 MMC/SD 子系統 的
發表于 08-22 17:01
SDIO SD卡電路設計速成攻略:核心步驟+調試技巧 !
針對時間緊迫的開發者,本攻略直擊SDIO外接SD卡電路設計的核心步驟,并補充實用調試技巧,幫助你在最短時間完成從理論到可用的電路實現。 今天一起來聊聊 SDIO外接SD
【嵌入式開發】SD卡—雷龍 SD NAND
完全相同的代碼驅動
三、SDIO模式
1.SD卡常用命令介紹
SD總線上的通信基于命令和數據位流傳輸。
命令 :應用相關命令(ACMD)
發表于 07-21 17:56
【STM32系統】基于STM32設計的SD卡數據讀取與上位機顯示系統(SDIO接口驅動、雷龍貼片SD卡)
5. 系統實現
5.1 系統架構
5.2 硬件連接與調試
6. 實驗與測試
6.1 實驗方案設計
6.2 實驗過程
6.2.1 SD
發表于 05-09 16:11
Nand flash 和SD卡(SD NAND)存儲扇區分配表異同
NAND)接口與主機設備連接,主機設備通過文件系統接口來訪問 SD卡(SD NAND),對存儲扇區分配表的操作是通過文件系統的函數和接口來間接實現
發表于 03-13 10:45
基于庫函數的SD卡硬件驅動層代碼實現方案
評論