花了幾天寫了SD卡裸機驅動,現(xiàn)在還不完善,只支持4G以內的卡,以后再加上;現(xiàn)在經過修改可以寫入數(shù)據(jù)了,親測沒問題.
S3C6410_SDIO.C
#include"s3c6410_system.h"
#include"s3c6410_sdio.h"
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//配置
//塊大小寄存器(0通道)BLKSIZE0
#defineBLKSIZE0_BLKSIZE0x0200//塊大小為512字節(jié)
//傳輸模式寄存器(0通道)TRNMOD0
#defineTRNMOD0_CCSCON0//正常模式
#defineTRNMOD0_MUL1SIN0(0<<5)//默認為單區(qū)段操作模式
#defineTRNMOD0_RD1WT0(1<<4)//默認為讀操作模式
#defineTRNMOD0_ENACMD12(0<<2)//自動CMD12禁止,多區(qū)段操作完成后主機自動發(fā)出停止命令
#defineTRNMOD0_ENBLKCNT(0<<1)//塊計數(shù)器無效
#defineTRNMOD0_ENDMA(0<<0)//DMA無效
//主機控制寄存器(0通道)HOSTCTL0
#defineHOSTCTL0_WIDE8(0<<5)//這個為寬度被位1指定(數(shù)據(jù)傳輸寬度)
#defineHOSTCTL0_DMASEL(0<<3)//SDMA
#defineHOSTCTL0_OUTEDGEINV(0<<2)//時鐘上升沿沿數(shù)據(jù)有效//這個寄存器有歧義,不知道到底是干啥用的
#defineHOSTCTL0_WIDE4(0<<4)//數(shù)據(jù)傳輸寬度。1BIT模式
//電源控制寄存器(0通道)PWRCON0
#definePWRCON0_SELPWRLVL(7<<1)//3.3V電源模式
#definePWRCON0_PWRON(1<<0)//電源打開
//容限寄存器(0通道)CAPAREG0
#defineCAPAREG0_V18(1<<26)//電壓支持1.8V
#defineCAPAREG0_V30(0<<25)//電壓不支持3v
#defineCAPAREG0_V33(1<<24)//電壓支持3.3V
#defineCAPAREG0_SUSRES(1<<23)//支持暫停/恢復操作
#defineCAPAREG0_DMA(1<<22)//支持DMA
#defineCAPAREG0_HSPD(1<<21)//支持高速模式
#defineCAPAREG0_ADMA2(0<<19)//不支持DMA2
#defineCAPAREG0_MAXBLKLEN(0<<16)//最大塊大小為512B
#defineCAPAREG0_BASECLK(25<<8)//SD基礎始終25MHz
#defineCAPAREG0_TOUTUNIT(0<<7)//超時時鐘單位KHZ
#defineCAPAREG0_TOUTCLK(10<<0)//超時時鐘頻率為10KHZ
//最大電流容限寄存器(0通道)MAXCURR0
#defineMAXCURR0_MAXCURR18(10<<16)//對于1.8V,最大電流為40MA
#defineMAXCURR0_MAXCURR30(10<<8)//對于3.0V,最大電流為40MA
#defineMAXCURR0_MAXCURR33(10<<0)//對于3.3V,最大電流為40MA
//控制寄存器2CONTROL2_0
#defineCONTROL2_0_ENSTAASYNCCLR(0<<31)//該位可以使正常和錯誤中斷的異步明確啟用狀態(tài)位
#defineCONTROL2_0_ENCMDCNFMSK(0<<30)//不屏蔽指令沖突
#defineCONTROL2_0_CDINVRXD3(0<<29)//卡檢測信號倒置對于RX_DAT[3]。禁止
#defineCONTROL2_0_SELCARDOUT(0<<28)//卡移除條件是“無卡插入”狀態(tài)。
#defineCONTROL2_0_FLTCLKSEL(8<<24)//濾波器時鐘(iFLTCLK)選擇。
#defineCONTROL2_0_ENFBCLKTX(0<<15)//反饋時鐘禁止,對于發(fā)送數(shù)據(jù)時鐘
#defineCONTROL2_0_ENFBCLKRX(0<<14)//反饋時鐘禁止,對于接收數(shù)據(jù)時鐘
#defineCONTROL2_0_SDCDSEL(0<<13)//nSDCD用于SD卡檢測信號
#defineCONTROL2_0_SDSIGPC(0<<12)//同步控制輸出有效信號
#defineCONTROL2_0_ENBUSYCHKTXSTART(0<<11)//發(fā)送數(shù)據(jù)啟動狀態(tài)前忙碌狀態(tài)檢測。
#defineCONTROL2_0_DFCNT(0<<9)//反跳濾波器計數(shù)16iSDCLK
#defineCONTROL2_0_ENCLKOUTHOLD(1<<8)//SDCLK操作有效。
#defineCONTROL2_0_RWAITMODE(0<<7)//主機控制器釋放讀等待狀態(tài)(自動)
#defineCONTROL2_0_DISBUFRD(0<<6)//正常模式,用0x20寄存器使用者可以讀緩沖區(qū)(FIFO)數(shù)據(jù)
//HCLK=128MHZEPLL=24MHZ
#defineCONTROL2_0_SELBASECLK(2<<4)//基礎時鐘源選擇。00或01=HCLK,10=EPLL輸出時鐘(來自系統(tǒng))11=外部時鐘源(XTI或XEXTCLk)
#defineCONTROL2_0_PWRSYNC(0<<3)//不同步,控制輸入有效信號(指令,數(shù)據(jù))
#defineCONTROL2_0_ENCLKOUTMSKCON(0<<1)//當卡插入被清除時,SDCLK輸出時鐘屏蔽。當處于無卡狀態(tài)時,設置該區(qū)域為高位來停止SDCLK。
#defineCONTROL2_0_HWINITFIN(1<<0)//SD主機控制器硬件初始化完成。
//時鐘控制寄存器(0通道)CLKCON0
#defineCLKCON0_SELFREQ(0x80<<8)//SDCLK頻率最低
#defineCLKCON0_ENSDCLK(1<<2)//SD時鐘啟動。
#defineCLKCON0_ENINTCLK(1<<0)//中斷時鐘啟動。
//超時控制寄存器(0通道)TIMEOUTCON0
/*******************************************************************************
*FunctionName:SDIO_DeInit
* Description : Dein