2个回答
2013-06-28
展开全部
#include"c8051f340.h"
#include "io.h"
#include "mmc.h"
void delay(uint i) //delay i nus
{
while(--i)
{
;
}
} void delayms(uint i) //廷时1ms
{
uint de1,de2;
for(de2=0;de2<i;de2++)
for(de1=0;de1<1000;de1++);
} //############################################################################
uchar mmc_read_byte (void) // 读出一字节
//############################################################################
{
uchar Byte = 0;
uchar i = 0;
sd_di=1;
for (i=0; i<8; i++)
{
sd_clk=0;
delay(4);
Byte=Byte<<1; // 先接收最高位。
if (sd_do==1)
{
Byte |= 0x01;
} sd_clk=1;
delay(4);
}
return (Byte);
}
//############################################################################
void mmc_write_byte(uchar Byte) //写入一个字节
//############################################################################
{
uchar i ;
sd_clk=1;
for (i =0; i<8; i++)
{
if (Byte&0x80) // 先写高位的。
{
sd_di=1;
}
else
{
sd_di=0;
}
sd_clk=0;
delay(4);
Byte=Byte<<1;
sd_clk=1;
delay(4);
}
sd_di=1;
} //############################################################################
//Send Command MMC/SD
uchar mmc_write_command (uchar *cmd)
//############################################################################
{
uchar tmp = 0xff;
uint Timeout = 0;
uchar a;
//set MMC_Chip_Select to high (MMC/SD)
MMC_Disable(); //sendet 8 Clock Impulse
mmc_write_byte(0xFF); /* 发送8个时钟 */ //set MMC_Chip_Select to low
MMC_Enable(); //sendet 6 Byte Command
for ( a = 0;a<0x06;a++) //send 6 Byte Command
{
mmc_write_byte(cmd[a]);
} while (tmp == 0xff)
{
tmp = mmc_read_byte(); //等待回复
if (Timeout++ > 500)
{
break; //超时返回
}
}
return(tmp); //返回响应信息
}
//############################################################################
//写单块,512字节,参数:要写扇区的地址,数据的指针
uchar mmc_write_sector (ulong addr,uchar *Buffer)
//############################################################################
{
uchar tmp;
uint a ;
uchar idata cmd[] = {0x58,0x00,0x00,0x00,0x00,0xFF}; //CMD24
//LED_MMC_WR=0;
addr = addr << 9; //addr = addr * 512
cmd[1] = ((addr & 0xFF000000) >>24 );
cmd[2] = ((addr & 0x00FF0000) >>16 );
cmd[3] = ((addr & 0x0000FF00) >>8 ); //Send Command cmd24 an MMC/SD (Write 1 Block/512 Bytes)
tmp = mmc_write_command (cmd);
if (tmp != 0) //
{
//LED_MMC_WR=1;
return(tmp);
} //
for (a=0;a<100;a++)
{
mmc_read_byte(); ////Before writing,send 100 clock to MMC/SD-Card
}
//Send Start Byte an MMC/SD
mmc_write_byte(0xFE); //发送读、写命令后都要发送起始令牌FEH
for ( a=0;a<512;a++)
{
mmc_write_byte(*Buffer++);
}
//CRC-Byte schreiben /* 写入CRC字节 */
mmc_write_byte(0xFF); //Schreibt Dummy CRC
mmc_write_byte(0xFF); //CRC Code wird nicht benutzt
//Wartet auf MMC/SD-Karte Bussy /* 读取XXX0 0101字节 */ ????
while (mmc_read_byte() != 0xff){};//????
//set MMC_Chip_Select to high
MMC_Disable();
//LED_MMC_WR=1;
return(0);
}
//############################################################################
//读Bytes个字节数据放在缓冲区内
//命令,缓冲区指针,长度
void mmc_read_block(uchar *cmd,uchar *Buffer,uint Bytes)
//############################################################################
{
//Send Command cmd an MMC/SD
uint a;
if (mmc_write_command (cmd) != 0)
{
return;
}
while (mmc_read_byte() != 0xfe){}; for ( a=0;a<Bytes;a++)
{
*Buffer++ = mmc_read_byte();
}
//CRC-Byte auslesen /* 取走CRC字节 */
mmc_read_byte();//CRC - Byte wird nicht ausgewertet
mmc_read_byte();//CRC - Byte wird nicht ausgewertet
MMC_Disable();
return;
} //############################################################################
//读一个扇区数据
//扇区地址,缓冲区指针
uchar mmc_read_sector (ulong addr,uchar *Buffer)
//############################################################################
{
//Commando 16 zum lesen eines Blocks von der MMC/SD - Karte
uchar idata cmd[] = {0x51,0x00,0x00,0x00,0x00,0xFF}; ///* READ SINGLE BLOCK */
//LED_MMC_WR=0;
addr = addr << 9; //addr = addr * 512 /* address*512,取512的整数倍 */ cmd[1] = ((addr & 0xFF000000) >>24 );
cmd[2] = ((addr & 0x00FF0000) >>16 );
cmd[3] = ((addr & 0x0000FF00) >>8 ); mmc_read_block(cmd,Buffer,512); //LED_MMC_WR=1;
return(0);
} //############################################################################
uchar mmc_init () //sd 初始化
//############################################################################
{
uchar Timeout = 0;
uchar b;
uchar idata CMD[] = {0x40,0x00,0x00,0x00,0x00,0x95}; //CMD0
sd_do=1;
sd_clk=1;
sd_cs=1; delayms(500);
//Initialisiere MMC/SD- in SPI-Mode
for ( b = 0;b<0x10;b++)
{
mmc_write_byte(0xff);
}
//Send Command CMD0 an MMC/SD-Karte
while(mmc_write_command (CMD) !=0x01) //等于1表示复位成功
{
//ComSendByte(0x82); // 返回错误
if (Timeout++ > 5)
{ // led_run=1;
return(1);
}
}
//Send Command CMD1 MMC/SD
Timeout = 0;
CMD[0] = 0x41;//Commando 1
CMD[5] = 0xFF; //CMD1
while( mmc_write_command (CMD) !=0)
{
if (Timeout++ > 100)
{
return(2);
}
}
//set MMC_Chip_Select to high (MMC/SD )
MMC_Disable();
return(0); // 成功
}
#include "io.h"
#include "mmc.h"
void delay(uint i) //delay i nus
{
while(--i)
{
;
}
} void delayms(uint i) //廷时1ms
{
uint de1,de2;
for(de2=0;de2<i;de2++)
for(de1=0;de1<1000;de1++);
} //############################################################################
uchar mmc_read_byte (void) // 读出一字节
//############################################################################
{
uchar Byte = 0;
uchar i = 0;
sd_di=1;
for (i=0; i<8; i++)
{
sd_clk=0;
delay(4);
Byte=Byte<<1; // 先接收最高位。
if (sd_do==1)
{
Byte |= 0x01;
} sd_clk=1;
delay(4);
}
return (Byte);
}
//############################################################################
void mmc_write_byte(uchar Byte) //写入一个字节
//############################################################################
{
uchar i ;
sd_clk=1;
for (i =0; i<8; i++)
{
if (Byte&0x80) // 先写高位的。
{
sd_di=1;
}
else
{
sd_di=0;
}
sd_clk=0;
delay(4);
Byte=Byte<<1;
sd_clk=1;
delay(4);
}
sd_di=1;
} //############################################################################
//Send Command MMC/SD
uchar mmc_write_command (uchar *cmd)
//############################################################################
{
uchar tmp = 0xff;
uint Timeout = 0;
uchar a;
//set MMC_Chip_Select to high (MMC/SD)
MMC_Disable(); //sendet 8 Clock Impulse
mmc_write_byte(0xFF); /* 发送8个时钟 */ //set MMC_Chip_Select to low
MMC_Enable(); //sendet 6 Byte Command
for ( a = 0;a<0x06;a++) //send 6 Byte Command
{
mmc_write_byte(cmd[a]);
} while (tmp == 0xff)
{
tmp = mmc_read_byte(); //等待回复
if (Timeout++ > 500)
{
break; //超时返回
}
}
return(tmp); //返回响应信息
}
//############################################################################
//写单块,512字节,参数:要写扇区的地址,数据的指针
uchar mmc_write_sector (ulong addr,uchar *Buffer)
//############################################################################
{
uchar tmp;
uint a ;
uchar idata cmd[] = {0x58,0x00,0x00,0x00,0x00,0xFF}; //CMD24
//LED_MMC_WR=0;
addr = addr << 9; //addr = addr * 512
cmd[1] = ((addr & 0xFF000000) >>24 );
cmd[2] = ((addr & 0x00FF0000) >>16 );
cmd[3] = ((addr & 0x0000FF00) >>8 ); //Send Command cmd24 an MMC/SD (Write 1 Block/512 Bytes)
tmp = mmc_write_command (cmd);
if (tmp != 0) //
{
//LED_MMC_WR=1;
return(tmp);
} //
for (a=0;a<100;a++)
{
mmc_read_byte(); ////Before writing,send 100 clock to MMC/SD-Card
}
//Send Start Byte an MMC/SD
mmc_write_byte(0xFE); //发送读、写命令后都要发送起始令牌FEH
for ( a=0;a<512;a++)
{
mmc_write_byte(*Buffer++);
}
//CRC-Byte schreiben /* 写入CRC字节 */
mmc_write_byte(0xFF); //Schreibt Dummy CRC
mmc_write_byte(0xFF); //CRC Code wird nicht benutzt
//Wartet auf MMC/SD-Karte Bussy /* 读取XXX0 0101字节 */ ????
while (mmc_read_byte() != 0xff){};//????
//set MMC_Chip_Select to high
MMC_Disable();
//LED_MMC_WR=1;
return(0);
}
//############################################################################
//读Bytes个字节数据放在缓冲区内
//命令,缓冲区指针,长度
void mmc_read_block(uchar *cmd,uchar *Buffer,uint Bytes)
//############################################################################
{
//Send Command cmd an MMC/SD
uint a;
if (mmc_write_command (cmd) != 0)
{
return;
}
while (mmc_read_byte() != 0xfe){}; for ( a=0;a<Bytes;a++)
{
*Buffer++ = mmc_read_byte();
}
//CRC-Byte auslesen /* 取走CRC字节 */
mmc_read_byte();//CRC - Byte wird nicht ausgewertet
mmc_read_byte();//CRC - Byte wird nicht ausgewertet
MMC_Disable();
return;
} //############################################################################
//读一个扇区数据
//扇区地址,缓冲区指针
uchar mmc_read_sector (ulong addr,uchar *Buffer)
//############################################################################
{
//Commando 16 zum lesen eines Blocks von der MMC/SD - Karte
uchar idata cmd[] = {0x51,0x00,0x00,0x00,0x00,0xFF}; ///* READ SINGLE BLOCK */
//LED_MMC_WR=0;
addr = addr << 9; //addr = addr * 512 /* address*512,取512的整数倍 */ cmd[1] = ((addr & 0xFF000000) >>24 );
cmd[2] = ((addr & 0x00FF0000) >>16 );
cmd[3] = ((addr & 0x0000FF00) >>8 ); mmc_read_block(cmd,Buffer,512); //LED_MMC_WR=1;
return(0);
} //############################################################################
uchar mmc_init () //sd 初始化
//############################################################################
{
uchar Timeout = 0;
uchar b;
uchar idata CMD[] = {0x40,0x00,0x00,0x00,0x00,0x95}; //CMD0
sd_do=1;
sd_clk=1;
sd_cs=1; delayms(500);
//Initialisiere MMC/SD- in SPI-Mode
for ( b = 0;b<0x10;b++)
{
mmc_write_byte(0xff);
}
//Send Command CMD0 an MMC/SD-Karte
while(mmc_write_command (CMD) !=0x01) //等于1表示复位成功
{
//ComSendByte(0x82); // 返回错误
if (Timeout++ > 5)
{ // led_run=1;
return(1);
}
}
//Send Command CMD1 MMC/SD
Timeout = 0;
CMD[0] = 0x41;//Commando 1
CMD[5] = 0xFF; //CMD1
while( mmc_write_command (CMD) !=0)
{
if (Timeout++ > 100)
{
return(2);
}
}
//set MMC_Chip_Select to high (MMC/SD )
MMC_Disable();
return(0); // 成功
}
2013-06-28
展开全部
这个真不好找,不好意思哥们,小弟帮不上
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询