S3C6410裸机SD卡驱动(SDIO模式)
扫描二维码
随时随地手机看文章
花了几天写了SD卡裸机驱动,现在还不完善,只支持4G以内的卡,以后再加上;现在经过修改可以写入数据了,亲测没问题.
S3C6410_SDIO.C
#include"s3c6410_system.h"
#include"s3c6410_sdio.h"
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//配置
//块大小寄存器(0通道)BLKSIZE0
#defineBLKSIZE0_BLKSIZE0x0200//块大小为512字节
//传输模式寄存器(0通道)TRNMOD0
#defineTRNMOD0_CCSCON0//正常模式
#defineTRNMOD0_MUL1SIN0(0<<5)//默认为单区段操作模式
#defineTRNMOD0_RD1WT0(1<<4)//默认为读操作模式
#defineTRNMOD0_ENACMD12(0<<2)//自动CMD12禁止,多区段操作完成后主机自动发出停止命令
#defineTRNMOD0_ENBLKCNT(0<<1)//块计数器无效
#defineTRNMOD0_ENDMA(0<<0)//DMA无效
//主机控制寄存器(0通道)HOSTCTL0
#defineHOSTCTL0_WIDE8(0<<5)//这个为宽度被位1指定(数据传输宽度)
#defineHOSTCTL0_DMASEL(0<<3)//SDMA
#defineHOSTCTL0_OUTEDGEINV(0<<2)//时钟上升沿沿数据有效//这个寄存器有歧义,不知道到底是干啥用的
#defineHOSTCTL0_WIDE4(0<<4)//数据传输宽度。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)//该位可以使正常和错误中断的异步明确启用状态位
#defineCONTROL2_0_ENCMDCNFMSK(0<<30)//不屏蔽指令冲突
#defineCONTROL2_0_CDINVRXD3(0<<29)//卡检测信号倒置对于RX_DAT[3]。禁止
#defineCONTROL2_0_SELCARDOUT(0<<28)//卡移除条件是“无卡插入”状态。
#defineCONTROL2_0_FLTCLKSEL(8<<24)//滤波器时钟(iFLTCLK)选择。
#defineCONTROL2_0_ENFBCLKTX(0<<15)//反馈时钟禁止,对于发送数据时钟
#defineCONTROL2_0_ENFBCLKRX(0<<14)//反馈时钟禁止,对于接收数据时钟
#defineCONTROL2_0_SDCDSEL(0<<13)//nSDCD用于SD卡检测信号
#defineCONTROL2_0_SDSIGPC(0<<12)//同步控制输出有效信号
#defineCONTROL2_0_ENBUSYCHKTXSTART(0<<11)//发送数据启动状态前忙碌状态检测。
#defineCONTROL2_0_DFCNT(0<<9)//反跳滤波器计数16iSDCLK
#defineCONTROL2_0_ENCLKOUTHOLD(1<<8)//SDCLK操作有效。
#defineCONTROL2_0_RWAITMODE(0<<7)//主机控制器释放读等待状态(自动)
#defineCONTROL2_0_DISBUFRD(0<<6)//正常模式,用0x20寄存器使用者可以读缓冲区(FIFO)数据
//HCLK=128MHZEPLL=24MHZ
#defineCONTROL2_0_SELBASECLK(2<<4)//基础时钟源选择。00或01=HCLK,10=EPLL输出时钟(来自系统)11=外部时钟源(XTI或XEXTCLk)
#defineCONTROL2_0_PWRSYNC(0<<3)//不同步,控制输入有效信号(指令,数据)
#defineCONTROL2_0_ENCLKOUTMSKCON(0<<1)//当卡插入被清除时,SDCLK输出时钟屏蔽。当处于无卡状态时,设置该区域为高位来停止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