永发信息网

SD卡读写程序

答案:2  悬赏:70  手机版
解决时间 2021-07-28 14:13
急求一份用51单片机控制的SD卡的简单的读写程序!望各位帮帮忙!
最佳答案

#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);


//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
mmc_write_byte(0xFF); //Schreibt Dummy CRC
mmc_write_byte(0xFF); //CRC Code wird nicht benutzt

//Wartet auf MMC/SD-Karte Bussy ????
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
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}; //

//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 );


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); // 成功
}

全部回答

这个真不好找,不好意思哥们,小弟帮不上

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
感冒了.怎么办?
谁能帮我找到六个有甲骨文,金文,小篆,隶书,草
怎样搜对方QQ号码
宾县哈尔滨交通警察大队车辆管理所地址在哪里
谁能告诉我 Framework 所有基类库都有什么?
如何有效祛痘?
甲流天天量体温
蜀门装备灵魂锁定是什么?怎么弄?有什么好处
谁能教我用vlookup啊
为什么现在QQ空间里的小纸条看不到了,要在哪
真实是好还是坏
我想改网名 叫末世 谁可以帮我修饰下
修武县焦作立马电动车(006分店)地址在哪里啊
大家推测下白色相簿会是怎么样的结局
DNF我今天PK用了极鬼剑术被说了为什么
推荐资讯
义马市三门峡创意婚庆礼仪怎么去啊,谁知道地
DNF鬼泣怎么加点本人都60了还没加点
东南北:答一省名?
【痕迹】7音符丶小雨-L2城镇高速-1.48.86-疾
谁告诉我个下载Microsoft Office 2003完全版
长阳土家族自治县宜昌和顺居地址有谁知道?有
家庭中使用的液化石油气储存在钢罐里
薪水怎么领
网上‘偷菜’指什么?
想当上小学数学老师有哪些要求
地理问题,求教
DNF中狂战士用太刀好还是巨剑好?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?