#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=0de2<ide2++)
for(de1=0de1<1000de1++)
} //############################################################################
uchar mmc_read_byte (void) // 读出一字节
//############################################################################
{
uchar Byte = 0
uchar i = 0
sd_di=1
for (i=0i<8i++)
{
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 =0i<8i++)
{
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 = 0a<0x06a++) //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=0a<100a++)
{
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=0a<512a++)
{
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=0a<Bytesa++)
{
*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=1delayms(500)
//Initialisiere MMC/SD- in SPI-Mode
for ( b = 0b<0x10b++)
{
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) // 成功
}
开启SD卡权限的具体步骤:1、在管理器中点击Android下的data目录。
2、点击使用此文件夹的选项。
3、稍等片刻,点击确定的按钮。
4、授权完成之后即可进入data文件下查看里面的文件,获得读写权限。
SD卡权限就是软件访问内存卡(或内部存储空间)的权限被限制了(或未开启),所以您需要到系统的应用权限管理里面给开启这个软件的访问存储空间的权限。
开启手机的sd卡权限步骤如下:
找到设置并打开
找到权限隐私并打开
找到按应用管理权并打开,如图中2位置所示
之后可以找到应用把那个打开应用名称后的小箭头,如图所示
找到sd卡权限并打开如图所示界面,点击允许或询问或禁止,完成之后退出。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)