从友善提供的非系统代码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
希望有大虾指点指点小弟。。。先谢过。。