📄 mmc.c
字号:
/*unsigned char Write_Command_MMC(unsigned char *CMD)
//****************************************************************************
{
unsigned char tmp;
unsigned char retry=0;
unsigned char i;
//set MMC_Chip_Select to high (MMC/SD-Card disable)
AT91F_PIO_SetOutput(AT91C_BASE_PIOA,MMC_Chip_Select) ;
//send 8 Clock Impulse
Write_Byte_MMC(0xFF);
//set MMC_Chip_Select to low (MMC/SD-Card active)
AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,MMC_Chip_Select) ;
//send 6 Byte Command to MMC/SD-Card
for (i=0;i<0x06;i++)
{
Write_Byte_MMC(*CMD++);
}
//get 16 bit response
Read_Byte_MMC(); //read the first byte,ignore it.
do
{ //Only last 8 bit is used here.Read it out.
tmp = Read_Byte_MMC(); // R1响应总共48bit ,后8比特为crc7+end bit
retry++;
}
while((tmp==0xff)&&(retry<100));
return(tmp);
}
//***************************************************************************
void Write_Byte_MMC(unsigned char value)
//****************************************************************************
{
unsigned char i;
//Software SPI
for (i=0; i<8; i++)
{ //write a byte
if (((value >> (7-i)) & 0x01)==0x01)
AT91F_PIO_SetOutput(AT91C_BASE_PIOA,SPI_DO) ;//Send bit by bit(MSB First)
else
AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,SPI_DO);
AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,SPI_Clock); //set Clock Impuls low
if(Init_Flag) delay_us_8_;
AT91F_PIO_SetOutput(AT91C_BASE_PIOA,SPI_Clock); //set Clock Impuls High
if(Init_Flag) delay_us_8_;
}//write a byte
AT91F_PIO_SetOutput(AT91C_BASE_PIOA,SPI_DO); //set Output High
//使用如下的库函数来发送数据,但发送前不检测状态是否为 ready
/*
AT91F_SPI_PutChar (NowSD_SPI,value,0) ;
*/
}
//******************************* Write_Command_MMC(CMD) *********************
unsigned char MMC_Init(void) // 在SPI和MCI模式下 有所不同
{
unsigned char retry,temp;
unsigned char i;
//CRC 校验在每个命令都需要,其生成多项式: G(x) = x7 + x3 + 1.
unsigned char CMD[] = {0x40,0x00,0x00,0x00,0x00,0x95}; // Com0 复位
MMC_Port_Init(); //Init SPI port
for(i=0;i<200;i++) //Wait MMC/SD ready...
{
asm("nop") ; //__asm("nop") ; 嵌入汇编语言
}
Init_Flag=1; //标志为卡片状态 为正在初始化
// mmc 协议说,要进入SPI模式,在卡接收复位命令的时候,CS应该为低.
// 但SD卡复位时应该不需要吧
//************************** 如果必须的话,Place code here**************************//
AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,MMC_Chip_Select) ; //***********还是职为低,确保进入SPI模式
//在初始化的时候要给SD卡至少80个脉冲,(from internet)
for (i=0;i<0x0f;i++)
{
Write_Byte_MMC(0xff); //send 80 clock at least!!!
}
//Send Command CMD0 to MMC/SD Card
retry=0;
do //retry n times to send CMD0 command
{
temp=Write_Command_MMC(CMD);
retry++;
if(retry==200)
{ //time out
return(INIT_CMD0_ERROR); //CMD0 Error!
}
}
while(temp!=1);
//Send Command CMD1 to MMC/SD-Card :Activates the card’s initialization process.
//启动卡的初始化进程 ,只在SPI模式才支持 ,见 90页
CMD[0] = 0x41; //Command 1
CMD[5] = 0xFF;
retry=0;
do
{ //retry 100 times to send CMD1 command
temp=Write_Command_MMC(CMD); //写成功返回 1
retry++;
if(retry==100)
{ //time out
return(INIT_CMD1_ERROR); //CMD1 Error!
}
}
while(temp!=0); //直到写成功
Init_Flag=0; //Init is completed,clear the flag
//进入SPi模式后,解除。可以不用
AT91F_PIO_SetOutput(AT91C_BASE_PIOA,MMC_Chip_Select) ; //******set MMC_Chip_Select to high
return(0); //All commands have been taken.
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -