主题 : 求教 SD模式下 74个初始化时钟是怎么发生的 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 13064
精华: 0
发帖: 16
金钱: 90 两
威望: 18 点
综合积分: 32 分
注册时间: 2010-01-18
最后登录: 2011-06-14
楼主  发表于: 2010-05-11 11:33

 求教 SD模式下 74个初始化时钟是怎么发生的

从友善提供的非系统代码test工程以及自己在网上找的FS2140 的test工程中看到了类似做法

void Test_SDI(void)
{
    U32 save_rGPEUP, save_rGPECON;
    
    RCA=0;
    MMC=0;
    block=3072;   //3072Blocks=1.5MByte, ((2Block=1024Byte)*1024Block=1MByte)

    save_rGPEUP=rGPEUP;
    save_rGPECON=rGPECON;
    
    rGPEUP  = 0xf83f;     // SDCMD, SDDAT[3:0] => PU En.
    rGPECON = 0xaaaaaaaa;    //SDCMD, SDDAT[3:0]


    Uart_Printf("\nSDI Card Write and Read Test\n");
    
    if(!SD_card_init()//初始化SD卡。。

。。


int SD_card_init(void)
{
//-- SD controller & card initialize
    int i;

    /* Important notice for MMC test condition */
    /* Cmd & Data lines must be enabled by pull up resister */

    rSDIPRE=PCLK/(INICLK)-1;    // 400KHz
    Uart_Printf("Init. Frequency is %dHz\n",(PCLK/(rSDIPRE+1)));
    
    rSDICON=(1<<4)|1;    // Type B, clk enable
    rSDIFSTA=rSDIFSTA|(1<<16);    //YH 040223 FIFO reset
    rSDIBSIZE=0x200;        // 512byte(128word)
    rSDIDTIMER=0x7fffff;        // Set timeout count

    for(i=0;i<0x1000;i++);  // Wait 74SDCLK for MMC card

    CMD0();


1.我看了很久都不明白,在sd卡的spi模式,提供74个时钟的做法是连续向SD卡输出0XFF,  而上面的代码中只用一个for循环。。没向SD卡发数据或CMD,那时钟也不会启动吧。。怎么就可以提供74个时钟呢??想不通。。

2.从S3C2440官方芯片datasheet里面看到的,关于时钟控制,也有分SD,MMC 2种类型的??那在不清楚接入的是哪种类型的卡时,是如何作出时钟类型选择呢?难道2种时钟都分别尝试么??

SDI Control Register (SDICON)
Clock Type (CTYP) [5] Determines which clock type is used as SDCLK.
0 = SD type,                           1 = MMC type


希望有大虾指点指点小弟。。。先谢过。。
级别: 新手上路
UID: 15154
精华: 0
发帖: 14
金钱: 70 两
威望: 14 点
综合积分: 28 分
注册时间: 2010-03-01
最后登录: 2018-02-08
1楼  发表于: 2011-02-15 12:45
同问 求解答~~~~~~
级别: 侠客
UID: 11461
精华: 0
发帖: 89
金钱: 450 两
威望: 93 点
综合积分: 178 分
注册时间: 2009-12-08
最后登录: 2017-08-29
2楼  发表于: 2011-02-18 16:53
1、一个for循环就是延时一定时间
以满足mmc卡需要的74个时钟周期,什么事情都不要做的,just  wait

2、时钟就设置成SD type就可以了
用mmc卡的时候选择用1bit总线模式