android sd卡 spi,sd卡读写 spi模式

ba25d2ddfe909f19a2fe94506b62a15e.png

217867e02c0151133663a0d659ac397b.png

ad5d9a231107100f7a8052da0f97d866.png (图一)

9bdd817b9208165571b41379a310871d.png

(图二)

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

函数名:unsigned char mmc_command(unsigned char *comm,unsigned char retuen_dat)

功能:向sd卡写命令

返回: 1- >操作失败 0->成功

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

unsigned char mmc_command(unsigned char *comm,unsigned char retuen_dat)

{

unsigned char n,temp,count,n_count;

count = 0;

do

{

SSEL_D(0);

for(n=0;n<6;n++)

SPI_Send_Dat(*comm++);

for(n_count=0;n_count<5;n_count++)

{

temp = SPI_Receiver_Dat();

if(temp == retuen_dat)break;

}

SSEL_D(1);

SPI_Send_Dat(0xff);

if(count>100) return 1;

}while(temp!=retuen_dat);

return 0;

}

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

函数名:void mmc_init(void)

功能:初始化sd卡

返回: 无

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

void mmc_init(void)

{

unsigned char command_dat[6];

unsigned char n;

for(n=0;n<6;n++) command_dat[n] = 0;

SPI_Init();

for(n=0;n<16;n++)

SPI_Send_Dat(0xff);//图一 同步用至少74个周期

command_dat[0] = 0x40;

command_dat[5] = 0x95;

mmc_command(command_dat,0x01);//图二

command_dat[0] = 0x41;

command_dat[5] = 0xff;

mmc_command(command_dat,0x00);//图二

}

fde25e04c4ce2336cbc858ed28582601.png

3fc7053f923e21ed5fd64d49a0210189.png

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

函数名:void write_mmc_dat(unsigned char *comm,unsigned char *dat,unsigned int len)

功能:向sd写数据(底层)

返回: 无

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

void write_mmc_dat(unsigned char *comm,unsigned char *dat,unsigned int len)

{

unsigned char n,temp,n_count;//,count;

unsigned int count;

count = 0;

for(count=0;count<5;count++)

{

SSEL_D(1);

SPI_Send_Dat(0xff);

SSEL_D(0);

for(n=0;n<6;n++)

SPI_Send_Dat(*comm++);

for(n_count=0;n_count<5;n_count++)

{

temp = SPI_Receiver_Dat();

if(temp == 0)break;

}

if(temp == 0)break;

}

SPI_Send_Dat(0xff);

SPI_Send_Dat(0xff);

SPI_Send_Dat(0xfE);//开始写

for(count=0;count

{

SPI_Send_Dat(*dat);

dat++;

}

SPI_Send_Dat(0xff);

SPI_Send_Dat(0xff);

temp = SPI_Receiver_Dat();

if( temp&0x1f!=0x05);//写失败

SSEL_D(1);

SPI_Send_Dat(0xff);

}

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

函数名:void write_mmc_dat(unsigned char *comm,unsigned char *dat,unsigned int len)

功能:向sd写数据

返回: 无

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

void MMCWdBolckOne(unsigned long addr,unsigned char *buffer)

{

unsigned char command_dat[6];

command_dat[0] = 0x40 + 24; // READ SINGLE BLOCK

addr <<= 9; // addr*512,取512的整数倍

command_dat[1] = (addr >> 24);

command_dat[2] = (addr >> 16);

command_dat[3] = (addr >> 8);

command_dat[4] = (addr >> 0);

command_dat[5] = 0;

write_mmc_dat(command_dat,buffer,512);

}

e496cfeb357b4812a3e8f8131925a8bb.png

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

函数名:void write_mmc_dat(unsigned char *comm,unsigned char *dat,unsigned int len)

功能:向sd读数据(底层)

返回: 无

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

void read_mmc_dat(unsigned char *comm,unsigned char *dat,unsigned int len)

{

unsigned char n,temp,count,n_count;

count = 0;

for(count=0;count<5;count++)

{

SSEL_D(1);

SPI_Send_Dat(0xff);

SSEL_D(0);

for(n=0;n<6;n++)

SPI_Send_Dat(*comm++);

for(n_count=0;n_count<5;n_count++)

{

temp = SPI_Receiver_Dat();

if(temp == 0)break;

}

if(temp == 0)break;

}

for(n_count=0;n_count<50;n_count++)

{

temp = SPI_Receiver_Dat();

if(temp == 0xfe)break;

}

while(len--)

{

*dat = SPI_Receiver_Dat();

dat++;

}

SPI_Send_Dat(0xff);

SPI_Send_Dat(0xff);

SSEL_D(1);

SPI_Send_Dat(0xff);

}

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

函数名:void write_mmc_dat(unsigned char *comm,unsigned char *dat,unsigned int len)

功能:读sd写数据

返回: 无

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

void MMCRdBolckOne(unsigned long addr,unsigned char *buffer,unsigned int len)

{

unsigned char command_dat[6];

command_dat[0] = 0x40 + 17; // READ SINGLE BLOCK

addr <<= 9; // addr*512,取512的整数倍

command_dat[1] = (addr >> 24);

command_dat[2] = (addr >> 16);

command_dat[3] = (addr >> 8);

command_dat[4] = (addr >> 0);

command_dat[5] = 0;

read_mmc_dat(command_dat,buffer,len);

}

#define SCK_IO(x) (x?(P1=0X0f):(P1=0X0f))//1->输出 0->输入

#define MOSI_IO(x) (x?(P1=0X0f):(P1=0X0f))

#define MISO_IO(x) (x?(P1=0X0f):(P1=0X0f))

#define SSEL_IO(x) (x?(P1=0X0f):(P1=0X0f))

#define SCK_D(x) (x?(P1|=0X01):(P1&=0XFE))

#define MOSI_D(x) (x?(P1|=0X02):(P1&=0XFD))

#define SSEL_D(X) (X?(P1|=0X08):(P1&=0XF7))

#define MISO_I() (P1&0X04)

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

模式零 spi 写数据

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

void SPI_Send_Dat(unsigned char dat)

{

unsigned char n;

for(n=0;n<8;n++)

{

SCK_D(0);

if(dat&0x80)MOSI_D(1);

else MOSI_D(0);

dat<<=1;

SCK_D(1);

}

SCK_D(0);

}

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

模式零 spi 读数据

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

unsigned char SPI_Receiver_Dat(void)

{

unsigned char n ,dat,bit_t;

for(n=0;n<8;n++)

{

SCK_D(0);

dat<<=1;

if(MISO_I())dat|=0x01;

else dat&=0xfe;

SCK_D(1);

}

SCK_D(0);

return dat;

}

void SPI_Init(void)

{

SCK_IO(1) ;

MOSI_IO(1) ;

MISO_IO(0) ;

SSEL_IO(1) ;

SSEL_D(1);

MOSI_D(1);

SCK_D(0);

}

1e48a8d211636708c5a5a4f5356e4ee6.png

上行为写 下行为读

code unsigned char leab[512] = {0x55,0xaa,2,3,4,5,6,7,8,9};

unsigned char rmmc[16];

main()

{

unsigned char i;

Time_Count0_Init(0 ,1); //10ms时基

start_time0(); //开启定时器0

Time_Count1_Init(0,2); //用于产生9600串口波特率

start_time1() ; //开启定时器1

Uart_Config(1); //配置串口

interrupt_Open(); //打开中断

mmc_init();

MMCWdBolckOne(0,leab);

for(i=0;i<16;i++)

Send_Data(leab[i]);

MMCRdBolckOne(0x00,rmmc,10);

for(i=0;i<16;i++)

Send_Data(rmmc[i]);

while (1);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值