20.4 實驗例程
功能:利用STM32F1的SDIO模塊讀取SD的容量并通過TFTLCD顯示。
(1)創建sdio_sdcard.h文件,并輸入以下代碼。
#ifndef _SDIO_SDCARD_H_
#define _SDIO_SDCARD_H_
#include "sys.h"
/*********************************************************************************************************
SD 卡 數 據 定 義
*********************************************************************************************************/
//用戶配置區
#define SDIO_INIT_CLK_DIV 0x76 //SDIO初始化頻率,最大400Kh
#define SDIO_TRANSFER_CLK_DIV 0x00 //SDIO傳輸頻率,該值太小可能會導致讀寫文件出錯
//SDIO工作模式定義,通過SD_SetDeviceMode函數設置
#define SD_POLLING_MODE 0 //查詢模式,該模式下,如果讀寫有問題,建議增大SDIO_TRANSFER_CLK_DIV的設置
#define SD_DMA_MODE 1 //DMA模式,該模式下,如果讀寫有問題,建議增大SDIO_TRANSFER_CLK_DIV的設置
//SDIO 各種錯誤枚舉定義
typedef enum
{
//特殊錯誤定義
SD_CMD_CRC_FAIL = 1, //收到命令響應(CRC校驗失敗)
SD_DATA_CRC_FAIL = 2, //發送/接收數據塊(CRC校驗失敗)
SD_CMD_RSP_TIMEOUT = 3, //命令響應超時
SD_DATA_TIMEOUT = 4, //數據超時
SD_TX_UNDERRUN = 5, //傳輸FIFO運行
SD_RX_OVERRUN = 6, //接收FIFO運行
SD_START_BIT_ERR = 7, //在寬總線模式下的所有數據信號上未檢測到起始位
SD_CMD_OUT_OF_RANGE = 8, //CMD的參數超出范圍
SD_ADDR_MISALIGNED = 9, //地址沒有對齊
SD_BLOCK_LEN_ERR = 10, //卡不允許傳輸的塊長度,或者傳輸的字節數與塊長度不匹配
SD_ERASE_SEQ_ERR = 11, //擦除命令序列中發生錯誤
SD_BAD_ERASE_PARAM = 12, //刪除組的無效選擇
SD_WRITE_PROT_VIOLATION = 13, //試圖對寫保護塊進行編程
SD_LOCK_UNLOCK_FAILED = 14, //在unlock命令中檢測到序列或密碼錯誤,或者試圖訪問鎖定的卡
SD_COM_CRC_FAILED = 15, //前一個命令的CRC校驗失敗
SD_ILLEGAL_CMD = 16, //命令對卡狀態無效
SD_CARD_ECC_FAILED = 17, //已應用卡內部ECC,但未能更正數據
SD_CC_ERROR = 18, //內部卡控制錯誤
SD_GENERAL_UNKNOWN_ERROR = 19, //通用或未知錯誤
SD_STREAM_READ_UNDERRUN = 20, //卡無法在流讀取操作中維持數據傳輸
SD_STREAM_WRITE_OVERRUN = 21, //卡無法維持流模式下的數據編程
SD_CID_CSD_OVERWRITE = 22, //CID/CSD覆蓋錯誤
SD_WP_ERASE_SKIP = 23, //只刪除了部分地址空間
SD_CARD_ECC_DISABLED = 24, //命令已在不使用內部ECC的情況下執行
SD_ERASE_RESET = 25, //在執行之前清除了擦除序列,因為收到了一個超出擦除序列的命令
SD_AKE_SEQ_ERROR = 26, //身份驗證順序錯誤
SD_INVALID_VOLTRANGE = 27,
SD_ADDR_OUT_OF_RANGE = 28,
SD_SWITCH_ERROR = 29,
SD_SDIO_DISABLED = 30,
SD_SDIO_FUNCTION_BUSY = 31,
SD_SDIO_FUNCTION_FAILED = 32,
SD_SDIO_UNKNOWN_FUNCTION = 33,
//標準錯誤定義
SD_INTERNAL_ERROR,
SD_NOT_CONFIGURED,
SD_REQUEST_PENDING,
SD_REQUEST_NOT_APPLICABLE,
SD_INVALID_PARAMETER,
SD_UNSUPPORTED_FEATURE,
SD_UNSUPPORTED_HW,
SD_ERROR,
SD_OK = 0
} SD_Error;
//SD卡CSD寄存器數據
typedef struct
{
u8 CSDStruct; //CSD結構
u8 SysSpecVersion; //系統版本
u8 Reserved1; //保留
u8 TAAC; //數據讀取訪問時間1
u8 NSAC; //在CLK期間的數據讀取訪問時間2
u8 MaxBusClkFrec; //總線最高頻率
u16 CardComdClasses; //卡命令類
u8 RdBlockLen; //最大讀取數據塊長度
u8 PartBlockRead; //允許讀取的部分塊
u8 WrBlockMisalign; //寫入塊未對準
u8 RdBlockMisalign; //讀取塊未對準
u8 DSRImpl; //DSR生效
u8 Reserved2; //保留
u32 DeviceSize; //驅動大小
u8 MaxRdCurrentVDDMin; //最大讀取流@ VDD最小
u8 MaxRdCurrentVDDMax; //最大讀取流@ VDD最大
u8 MaxWrCurrentVDDMin; //最大寫入流@ VDD最小
u8 MaxWrCurrentVDDMax; //最大寫入流@ VDD最大
u8 DeviceSizeMul; //驅動大小
u8 EraseGrSize; //擦除組大小
u8 EraseGrMul; //擦除組大小乘數
u8 WrProtectGrSize; //寫保護組大小
u8 WrProtectGrEnable; //寫保護組使能
u8 ManDeflECC; //制造商默認ECC
u8 WrSpeedFact; //寫入速度因子
u8 MaxWrBlockLen; //最大寫入數據長度
u8 WriteBlockPaPartial; //允許寫入的部分塊
u8 Reserved3; //保留
u8 ContentProtectAppli; //內容保護程序
u8 FileFormatGrouop; //文件格式組
u8 CopyFlag; //復制標志OTP
u8 PermWrProtect; //永久寫保護
u8 TempWrProtect; //臨時寫保護
u8 FileFormat; //文件格式
u8 ECC; //ECC 代碼
u8 CSD_CRC; //CSD CRC
u8 Reserved4; //總是1
} SD_CSD;
//SD卡CID寄存器數據
typedef struct
{
u8 ManufacturerID; //制造商
u16 OEM_AppliID; //OEM/應用程序ID
u32 ProdName1; //名稱部分1
u8 ProdName2; //名稱部分2
u8 ProdRev; //版本
u32 ProdSN; //序列號
u8 Reserved1; //保留1
u16 ManufactDate; //出廠日期
u8 CID_CRC; //CID CRC
u8 Reserved2; //總是1
} SD_CID;
//SD卡狀態
typedef enum
{
SD_CARD_READY = 0x00000001,
SD_CARD_IDENTIFICATION = 0x00000002,
SD_CARD_STANDBY = 0x00000003,
SD_CARD_TRANSFER = 0x00000004,
SD_CARD_SENDING = 0x00000005,
SD_CARD_RECEIVING = 0x00000006,
SD_CARD_PROGRAMMING = 0x00000007,
SD_CARD_DISCONNECTED = 0x00000008,
SD_CARD_ERROR = 0x000000FF
}SDCardState;
//SD卡信息,包括CSD,CID等數據
typedef struct
{
SD_CSD SD_csd;
SD_CID SD_cid;
long long CardCapacity; //SD卡容量,單位:字節,最大支持2^64字節大小的卡
u32 CardBlockSize; //SD卡塊大小
u16 RCA; //卡相對地址
u8 CardType; //卡類型
} SD_CardInfo;
extern SD_CardInfo SDCardInfo; //SD卡信息
//SDIO相關標志位,拷貝自:stm32f4xx_sdio.h
#define SDIO_FLAG_CCRCFAIL 0x00000001
#define SDIO_FLAG_DCRCFAIL 0x00000002
#define SDIO_FLAG_CTIMEOUT 0x00000004
#define SDIO_FLAG_DTIMEOUT 0x00000008
#define SDIO_FLAG_TXUNDERR 0x00000010
#define SDIO_FLAG_RXOVERR 0x00000020
#define SDIO_FLAG_CMDREND 0x00000040
#define SDIO_FLAG_CMDSENT 0x00000080
#define SDIO_FLAG_DATAEND 0x00000100
#define SDIO_FLAG_STBITERR 0x00000200
#define SDIO_FLAG_DBCKEND 0x00000400
#define SDIO_FLAG_CMDACT 0x00000800
#define SDIO_FLAG_TXACT 0x00001000
#define SDIO_FLAG_RXACT 0x00002000
#define SDIO_FLAG_TXFIFOHE 0x00004000
#define SDIO_FLAG_RXFIFOHF 0x00008000
#define SDIO_FLAG_TXFIFOF 0x00010000
#define SDIO_FLAG_RXFIFOF 0x00020000
#define SDIO_FLAG_TXFIFOE 0x00040000
#define SDIO_FLAG_RXFIFOE 0x00080000
#define SDIO_FLAG_TXDAVL 0x00100000
#define SDIO_FLAG_RXDAVL 0x00200000
#define SDIO_FLAG_SDIOIT 0x00400000
#define SDIO_FLAG_CEATAEND 0x00800000
//SDIO 指令集
#define SD_CMD_GO_IDLE_STATE 0
#define SD_CMD_SEND_OP_COND 1
#define SD_CMD_ALL_SEND_CID 2
#define SD_CMD_SET_REL_ADDR 3 //SD卡的SDIO_SEND_REL_ADDR
#define SD_CMD_SET_DSR 4
#define SD_CMD_SDIO_SEN_OP_COND 5
#define SD_CMD_HS_SWITCH 6
#define SD_CMD_SEL_DESEL_CARD 7
#define SD_CMD_HS_SEND_EXT_CSD 8
#define SD_CMD_SEND_CSD 9
#define SD_CMD_SEND_CID 10
#define SD_CMD_READ_DAT_UNTIL_STOP 11 //SD卡不支持
#define SD_CMD_STOP_TRANSMISSION 12
#define SD_CMD_SEND_STATUS 13
#define SD_CMD_HS_BUSTEST_READ 14
#define SD_CMD_GO_INACTIVE_STATE 15
#define SD_CMD_SET_BLOCKLEN 16
#define SD_CMD_READ_SINGLE_BLOCK 17
#define SD_CMD_READ_MULT_BLOCK 18
#define SD_CMD_HS_BUSTEST_WRITE 19
#define SD_CMD_WRITE_DAT_UNTIL_STOP 20
#define SD_CMD_SET_BLOCK_COUNT 23
#define SD_CMD_WRITE_SINGLE_BLOCK 24
#define SD_CMD_WRITE_MULT_BLOCK 25
#define SD_CMD_PROG_CID 26
#define SD_CMD_PROG_CSD 27
#define SD_CMD_SET_WRITE_PROT 28
#define SD_CMD_CLR_WRITE_PROT 29
#define SD_CMD_SEND_WRITE_PROT 30
#define SD_CMD_SD_ERASE_GRP_START 32 //設置要擦除的第一個寫塊的地址SD卡獨有
#define SD_CMD_SD_ERASE_GRP_END 33 //設置要擦除的連續范圍的最后一個寫塊的地址SD卡獨有
#define SD_CMD_ERASE_GRP_START 35 //設置要擦除的第一個寫塊的地址MMC card 3.31
#define SD_CMD_ERASE_GRP_END 36 //設置要擦除的連續范圍的最后一個寫塊的地址MMC card 3.31
#define SD_CMD_ERASE 38
#define SD_CMD_FAST_IO 39 //SD卡不支持
#define SD_CMD_GO_IRQ_STATE 40 //SD卡不支持
#define SD_CMD_LOCK_UNLOCK 42
#define SD_CMD_APP_CMD 55
#define SD_CMD_GEN_CMD 56
#define SD_CMD_NO_CMD 64
#define SD_CMD_APP_SD_SET_BUSWIDTH 6 //SD卡獨有
#define SD_CMD_SD_APP_STAUS 13 //SD卡獨有
#define SD_CMD_SD_APP_SEND_NUM_WRITE_BLOCKS 22 //SD卡獨有
#define SD_CMD_SD_APP_OP_COND 41 //SD卡獨有
#define SD_CMD_SD_APP_SET_CLR_CARD_DETECT 42 //SD卡獨有
#define SD_CMD_SD_APP_SEND_SCR 51 //SD卡獨有
#define SD_CMD_SDIO_RW_DIRECT 52 //SD卡IO獨有
#define SD_CMD_SDIO_RW_EXTENDED 53 //SD卡IO獨有
#define SD_CMD_SD_APP_GET_MKB 43 //SD卡獨有
#define SD_CMD_SD_APP_GET_MID 44 //SD卡獨有
#define SD_CMD_SD_APP_SET_CER_RN1 45 //SD卡獨有
#define SD_CMD_SD_APP_GET_CER_RN2 46 //SD卡獨有
#define SD_CMD_SD_APP_SET_CER_RES2 47 //SD卡獨有
#define SD_CMD_SD_APP_GET_CER_RES1 48 //SD卡獨有
#define SD_CMD_SD_APP_SECURE_READ_MULTIPLE_BLOCK 18 //SD卡獨有
#define SD_CMD_SD_APP_SECURE_WRITE_MULTIPLE_BLOCK 25 //SD卡獨有
#define SD_CMD_SD_APP_SECURE_ERASE 38 //SD卡獨有
#define SD_CMD_SD_APP_CHANGE_SECURE_AREA 49 //SD卡獨有
#define SD_CMD_SD_APP_SECURE_WRITE_MKB 48 //SD卡獨有
//支持的SD卡定義
#define SDIO_STD_CAPACITY_SD_CARD_V1_1 0x00000000
#define SDIO_STD_CAPACITY_SD_CARD_V2_0 0x00000001
#define SDIO_HIGH_CAPACITY_SD_CARD 0x00000002
#define SDIO_MULTIMEDIA_CARD 0x00000003
#define SDIO_SECURE_DIGITAL_IO_CARD 0x00000004
#define SDIO_HIGH_SPEED_MULTIMEDIA_CARD 0x00000005
#define SDIO_SECURE_DIGITAL_IO_COMBO_CARD 0x00000006
#define SDIO_HIGH_CAPACITY_MMC_CARD 0x00000007
//SDIO相關參數定義
#define NULL 0
#define SDIO_STATIC_FLAGS 0x000005FF
#define SDIO_CMD0TIMEOUT 0x00010000
#define SDIO_DATATIMEOUT 0xFFFFFFFF
#define SDIO_FIFO_Address 0x40018080
//Mask for errors Card Status R1 OCR Register
#define SD_OCR_ADDR_OUT_OF_RANGE 0x80000000
#define SD_OCR_ADDR_MISALIGNED 0x40000000
#define SD_OCR_BLOCK_LEN_ERR 0x20000000
#define SD_OCR_ERASE_SEQ_ERR 0x10000000
#define SD_OCR_BAD_ERASE_PARAM 0x08000000
#define SD_OCR_WRITE_PROT_VIOLATION 0x04000000
#define SD_OCR_LOCK_UNLOCK_FAILED 0x01000000
#define SD_OCR_COM_CRC_FAILED 0x00800000
#define SD_OCR_ILLEGAL_CMD 0x00400000
#define SD_OCR_CARD_ECC_FAILED 0x00200000
#define SD_OCR_CC_ERROR 0x00100000
#define SD_OCR_GENERAL_UNKNOWN_ERROR 0x00080000
#define SD_OCR_STREAM_READ_UNDERRUN 0x00040000
#define SD_OCR_STREAM_WRITE_OVERRUN 0x00020000
#define SD_OCR_CID_CSD_OVERWRIETE 0x00010000
#define SD_OCR_WP_ERASE_SKIP 0x00008000
#define SD_OCR_CARD_ECC_DISABLED 0x00004000
#define SD_OCR_ERASE_RESET 0x00002000
#define SD_OCR_AKE_SEQ_ERROR 0x00000008
#define SD_OCR_ERRORBITS 0xFDFFE008
//Masks for R6 Response
#define SD_R6_GENERAL_UNKNOWN_ERROR 0x00002000
#define SD_R6_ILLEGAL_CMD 0x00004000
#define SD_R6_COM_CRC_FAILED 0x00008000
#define SD_VOLTAGE_WINDOW_SD 0x80100000
#define SD_HIGH_CAPACITY 0x40000000
#define SD_STD_CAPACITY 0x00000000
#define SD_CHECK_PATTERN 0x000001AA
#define SD_VOLTAGE_WINDOW_MMC 0x80FF8000
#define SD_MAX_VOLT_TRIAL 0x0000FFFF
#define SD_ALLZERO 0x00000000
#define SD_WIDE_BUS_SUPPORT 0x00040000
#define SD_SINGLE_BUS_SUPPORT 0x00010000
#define SD_CARD_LOCKED 0x02000000
#define SD_CARD_PROGRAMMING 0x00000007
#define SD_CARD_RECEIVING 0x00000006
#define SD_DATATIMEOUT 0xFFFFFFFF
#define SD_0TO7BITS 0x000000FF
#define SD_8TO15BITS 0x0000FF00
#define SD_16TO23BITS 0x00FF0000
#define SD_24TO31BITS 0xFF000000
#define SD_MAX_DATA_LENGTH 0x01FFFFFF
#define SD_HALFFIFO 0x00000008
#define SD_HALFFIFOBYTES 0x00000020
//Command Class Supported
#define SD_CCCC_LOCK_UNLOCK 0x00000080
#define SD_CCCC_WRITE_PROT 0x00000040
#define SD_CCCC_ERASE 0x00000020
//CMD8指令
#define SDIO_SEND_IF_COND 0x00000008
/*********************************************************************************************************
函 數 列 表
*********************************************************************************************************/
SD_Error SD_Init( void ) ; //初始化SD卡
u8 SD_ReadDisk( u8*buf, u32 sector, u8 cnt ) ; //讀SD卡,fatfs/usb調用
u8 SD_WriteDisk( u8*buf, u32 sector, u8 cnt ) ; //寫SD卡,fatfs/usb調用
#endif
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
存儲器
+關注
關注
38文章
7455瀏覽量
163616 -
SD卡
+關注
關注
2文章
560瀏覽量
63812 -
SDIO
+關注
關注
2文章
72瀏覽量
19294 -
單片機
+關注
關注
0文章
207瀏覽量
16658
發布評論請先 登錄
相關推薦
STM32入門學習筆記之SD卡基礎讀寫實驗1
SD卡是嵌入式系統中最常見的存儲器,不僅容量可以做的很大,并且接口通用,支持SPI/SDIO驅動,尺寸可供選擇,能滿足不同應用的要求。STM32F1系列自帶了標準的4位SDIO接口,最高通信速度可達24MHz,最高每秒能傳輸12
STM32入門學習筆記之SD卡基礎讀寫實驗2
SD卡是嵌入式系統中最常見的存儲器,不僅容量可以做的很大,并且接口通用,支持SPI/SDIO驅動,尺寸可供選擇,能滿足不同應用的要求。STM32F1系列自帶了標準的4位SDIO接口,最高通信速度可達24MHz,最高每秒能傳輸12
STM32入門學習筆記之SD卡基礎讀寫實驗4
SD卡是嵌入式系統中最常見的存儲器,不僅容量可以做的很大,并且接口通用,支持SPI/SDIO驅動,尺寸可供選擇,能滿足不同應用的要求。STM32F1系列自帶了標準的4位SDIO接口,最高通信速度可達24MHz,最高每秒能傳輸12
基于FPGA的SD卡的數據讀寫實現(SD NAND FLASH)
文章目錄1、存儲芯片分類2、NORFlash與NANDFlash的區別3、什么是SD卡?4、什么是SDNAND?5、SDNAND的控制時序6、FPGA實現SDNAND讀寫6.1、設計思
評論