[sd card] SD card初始化时的总线设置

==============================================================
零、在sd card初始化过程中,对于bus主要设置以下东西
1、时钟,输出频率
2、工作电压(注意和信号电压区分开来)
    如下范围:
   (1) MMC_VDD_165_195        0x00000080    /* VDD voltage 1.65 - 1.95 */ bit7
   (2) MMC_VDD_20_21        0x00000100    /* VDD voltage 2.0 ~ 2.1 */ bit8
   (3) MMC_VDD_21_22        0x00000200    /* VDD voltage 2.1 ~ 2.2 */ bit9
   (4) MMC_VDD_22_23        0x00000400    /* VDD voltage 2.2 ~ 2.3 */ bit10
   (5) MMC_VDD_23_24        0x00000800    /* VDD voltage 2.3 ~ 2.4 */ bit11
   (6) MMC_VDD_24_25        0x00001000    /* VDD voltage 2.4 ~ 2.5 */ bit12
   (7) MMC_VDD_25_26        0x00002000    /* VDD voltage 2.5 ~ 2.6 */ bit13
   (8) MMC_VDD_26_27        0x00004000    /* VDD voltage 2.6 ~ 2.7 */ bit14
   (9) MMC_VDD_27_28        0x00008000    /* VDD voltage 2.7 ~ 2.8 */ bit15
   (10) MMC_VDD_28_29        0x00010000    /* VDD voltage 2.8 ~ 2.9 */ bit16
   (11) MMC_VDD_29_30        0x00020000    /* VDD voltage 2.9 ~ 3.0 */ bit17
   (12) MMC_VDD_30_31        0x00040000    /* VDD voltage 3.0 ~ 3.1 */ bit18
   (13) MMC_VDD_31_32        0x00080000    /* VDD voltage 3.1 ~ 3.2 */ bit19
   (14) MMC_VDD_32_33        0x00100000    /* VDD voltage 3.2 ~ 3.3 */ bit20
   (15) MMC_VDD_33_34        0x00200000    /* VDD voltage 3.3 ~ 3.4 */ bit21
   (16) MMC_VDD_34_35        0x00400000    /* VDD voltage 3.4 ~ 3.5 */ bit22
   (17) MMC_VDD_35_36        0x00800000    /* VDD voltage 3.5 ~ 3.6 */ bit23
3、信号电压(IO电压)
    如下范围:
   (1)MMC_SIGNAL_VOLTAGE_330 0 (SD card刚上电的时候使用)
   (1) MMC_SIGNAL_VOLTAGE_180 1
4、总线模式
   (1)MMC_BUSMODE_OPENDRAIN——》开漏模式
    (2)MMC_BUSMODE_PUSHPULL——》上拉模式
5、总线速度模式
     (1)  Default Speed mode(DS) 3.3V signaling , Frequency up to 25 MHz, up to 12.5 MB/sec (SD card刚上电的时候使用)
     (2)  High Speed mode(HS) 3.3V signaling , Frequency up to 50 MHz, up to 25 MB/sec 
     (3)  SDR12: 1.8V signaling , Frequency up to 25 MHz, up to 12.5MB/sec 
     (4)  SDR25: 1.8V signaling,  Frequency up to 50 MHz, up to 25MB/sec 
     (5)  SDR50: 1.8V signaling , Frequency up to 100 MHz, up to 50MB/sec 
     (6)  SDR104: 1.8V signaling , Frequency up to 208 MHz, up to 104MB/sec 
     (7)  DDR50: 1.8V signaling , Frequency up to 50 MHz, sampled on both clock edges, up to   50MB/sec 
 
6、总线宽度
   (1) 一线, MMC_BUS_WIDTH_1(SD card刚上电的时候使用)
   (2) 四线, MMC_BUS_WIDTH_4

==============================================================
一、时钟的设置?
时钟是由host输出给card的,因此只需要为host设置时钟即可。
注意:并不是说处于什么总线速度模式下就需要设置什么样的频率,而是只需要比其频率小都是可以的。
例如,总线速度模式DS模式下,其最大频率是25MHz,但是host只要输出不超过这个值的频率都可以被处理,刚上电之后,400KHz的时钟频率就是工作在这种速度模式之下。

1、card支持的最大时钟频率
最大时钟频率取决于总线速度模式,
#define HIGH_SPEED_MAX_DTR 50000000    // HS模式的最大频率是50MHz,3.3V
#define UHS_SDR104_MAX_DTR 208000000    // SDR104模式的最大频率是208MHz,1.8V
#define UHS_SDR50_MAX_DTR 100000000    // SDR50模式的最大频率是100MHz,1.8V
#define UHS_DDR50_MAX_DTR 50000000    // DDR50模式的最大频率是50MHz,1.8V
#define UHS_SDR25_MAX_DTR UHS_DDR50_MAX_DTR    // SDR模式的最大频率是50MHz,1.8V
#define UHS_SDR12_MAX_DTR 25000000    // HS模式的最大频率是25MHz,1.8V
DS模式的最大频率是25Mhz,3.3V,但是在代码里面并没有定义出来??
(1)对于uhs来说,会在设置总线速度模式的时候,把最大频率设置到card->sw_caps.uhs_max_dtr中
static int sd_set_bus_speed_mode(struct mmc_card *card, u8 *status)
case UHS_SDR104_BUS_SPEED:
card->sw_caps.uhs_max_dtr = UHS_SDR104_MAX_DTR;
case UHS_DDR50_BUS_SPEED:
card->sw_caps.uhs_max_dtr = UHS_DDR50_MAX_DTR;
case UHS_SDR50_BUS_SPEED:
card->sw_caps.uhs_max_dtr = UHS_SDR50_MAX_DTR;
case UHS_SDR25_BUS_SPEED:
card->sw_caps.uhs_max_dtr = UHS_SDR25_MAX_DTR;
case UHS_SDR12_BUS_SPEED:
card->sw_caps.uhs_max_dtr = UHS_SDR12_MAX_DTR;
(2)对于HS模式的card来说,最大频率会设置到card->sw_caps.hs_max_dtr中
        card->sw_caps.hs_max_dtr = HIGH_SPEED_MAX_DTR;
(3)对于DS模式的card来说,最大频率会设置到card->csd.max_dtr中,
        是从card的CSD寄存器中读取出来的:
 
         对于现在的SD card来说,这个值一般是0x32。也就是2.5*10=25MHz
        csd->max_dtr   = tran_exp[e] * tran_mant[m];


2、host支持的最大频率和最小频率的说明
对于sdhci host来说,需要host driver提供struct sdhci_ops中的get_min_clock和get_max_clock方法来获取最大频率和最小频率。
然后设置到mmc_host中去
host->max_clk = host->ops->get_max_clock(host);    // 由底层host driver提供
mmc->f_max = host->max_clk;
mmc->f_min = host->ops->get_min_clock(host);    // 由底层host driver提供

3、如何设置host的时钟频率
使用mmc_set_clock函数进行设置:
对于UHS-I来说,mmc_sd_init_uhs_card——》sd_set_bus_speed_mode——》mmc_set_clock(card->host, card->sw_caps.uhs_max_dtr);
对于HS或者DS来说,mmc_set_clock(host, mmc_sd_get_ma
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值