• 大小: 35KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-11
  • 语言: 其他
  • 标签: MMC卡  protues  

资源简介

SD卡的protues仿真 keil 与protues联机仿真 at89c52单片机

资源截图

代码片段和文件信息

#include 
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
/**************定义管脚*************/
sbit scl=P1^0;//同步时钟 入
sbit si=P1^1; //同步数据 入
sbit cs=P1^2; //片选 
sbit so=P1^3; //数据出
/**********************************/
bit is_init;
uchar  pbuf[12];
/*关于错误码的定义****************/

#define INIT_CMD0_ERROR 0X01
#define INIT_CMD1_ERROR 0X02;
#define READ_BLOCK_ERROR 0X03;
#define WRITE_BLOCK_ERROR 0X04;

/*********************************/


void delay(uchar i)
{

while(i--);
}
/*写入一个字节*******************/
void spi_write(uchar x)
{
uchar i;
for(i=0;i<8;i++)
{
si=((x< scl=0;//low is cs
if(is_init) delay(8);//for the v
scl=1;
if(is_init) delay(8);

}
}
/*********************************/

/*read a byte***********************/
uchar spi_read(void)
{
uchar temp=0i;
so=1;
for(i=0;i<8;i++)
{
scl=0;
if(is_init) delay(8);
if(so) temp=(0x80>>i);
scl=1;
if(is_init) delay(8);
}
return(temp);
}
/**************************************/

/***********        write cmd  **********/
uchar write_cmd(uchar *pcmd)
{
uchar temptime=0i;
for(i=0;i<6;i++)    //一条命令都是6个字节,形参用指针,
{    //指向6个字节命令,
spi_write(pcmd[i]);
}
do //看看写进去没有通过so管脚
{
temp=spi_read();
time++;
}
while((temp==0xff)&&(time<<100));//一直到读到的不是0xff或超时,退出去
return(temp);
}
/****************************************/


/*/以上为基本的命令或函数,下面的是具体的函数 */
/***************  sd card reset goto spi use cmd0 **********/
uchar sd_reset(void)
{
uchar timetempi;
uchar code pcmd[6]={0x400x000x000x000x000x95};

is_init=1;//下面需要慢点,须=1,快点时=0,即可
cs=1;
for(i=0;i<0x0f;i++) //复位时,至少要72个时钟周期,
{ //现在是,15*8=120个clk
spi_write(0xff);
}
cs=0;time=0;
do
{
temp=write_cmd(pcmd);
time++;
if(time==100)
{
return(INIT_CMD0_ERROR);
}
} while(temp!=0x01); //校验码是0x01,是0x01时,表示写入成功
   cs=1;
   spi_write(0xff);//时序上要求补8个clk
   return(0);//返回0,写入成功
}
/*****************************************/

/*初始化,用1号命令*********************/
uchar sd_init(void)
{
uchar timetemp;
uchar code pcmd[6]={0x410x000x000x000x000xff};
cs=0;
time=0;
do
{
temp=write_cmd(pcmd);
time++;
if(time==100)
{
return INIT_CMD1_ERROR;
}
}
 while(temp!=0x00);
is_init=0;
cs=1;
spi_write(0xff);
return(0);
}
/************************************************/

/*************  sd card 扇区的读写                 ************/
uchar sd_write_sector(ulong addruchar *buffer)
{
uchar temptime;
uint i;
uchar pcmd[]={0x580x000x000x000x000xff};
addr<<=9;//等同于  addr=addr*512一扇区有512字节,将扇区地址转换成字节地址

pcmd[1]=((addr&0xff000000)>>24);//抛弃后24位
pcmd[2]=((addr&0x00ff0000)>>16);
pcmd[3]=((addr&0x0000ff00)>>8);

cs=0;time=0;
do
{
temp=write_cmd(pcmd);
time++;
if(time==100)
{
return(temp);
}
} while(temp!=0x00);
for(i=0;i<100;i++)
{
spi_read();
}
spi_write(0xfe);

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      19215  2009-04-30 20:23  sd.DSN

     文件      10232  2009-04-30 20:22  sd.LST

     文件      11606  2009-04-30 20:22  sd.OBJ

     文件        316  2009-04-30 20:23  sd.PWI

     文件      10554  2009-04-30 20:22  sdcard

     文件       3557  2009-04-30 20:22  sdcard.hex

     文件         41  2009-04-30 20:22  sdcard.lnp

     文件      16024  2009-04-30 20:22  sdcard.M51

     文件       1025  2009-04-30 20:23  sdcard.Opt

     文件       2371  2009-04-30 20:22  sdcard.plg

     文件       2155  2009-04-30 20:23  sdcard.Uv2

    .......      1024  2009-04-30 17:29  sdcard_Opt.Bak

    .......      2155  2009-04-30 17:29  sdcard_Uv2.Bak

     文件         58  2009-04-30 16:47  sd管脚.txt

     文件       6376  2005-03-22 15:22  STARTUP.A51

     文件      14048  2009-04-30 16:52  STARTUP.LST

     文件        749  2009-04-30 16:52  STARTUP.OBJ

     文件      17453  2009-04-30 20:21  Last Loaded sd.DBK

     文件         32  2009-04-30 20:22  sd.__i

     文件       4329  2009-04-30 20:22  sd.c

----------- ---------  ---------- -----  ----

               123320                    20


评论

共有 条评论