sd卡简介
sd卡是secure digital card卡的简称,直译成汉语就是“安全数字卡”,是由日本松下公司、东芝公司和美国sandisk公司共同开发研制的全新的存储卡产品。sd存储卡是一个完全开放的标准(系统),多用于mp3、数码摄像机、数码相机、电子图书、av器材等等,尤其是被广泛应用在超薄数码相机上。sd卡在外形上同multimedia card卡保持一致,大小尺寸比mmc卡略厚,容量也大很多。并且兼容mmc卡接口规范。不由让人们怀疑sd卡是mmc升级版。
另外,sd卡为9引脚,目的是通过把传输方式由串行变成并行,以提高传输速度。它的读写速度比mmc卡要快一些,同时,安全性也更高。sd卡最大的特点就是通过加密功能,可以保证数据资料的安全保密。它还具备版权保护技术,所采用的版权保护技术是dvd中使用的cprm技术(可刻录介质内容保护)。
单片机读取sd卡数据_51单片机读写sd卡程序详解
#include 《reg52.h》//程序通过调试
#include 《stdio.h》
//=============================================================
//定义sd卡需要的4根信号线
sbit sd_clk = p3^7;
sbit sd_di = p3^5;
sbit sd_do = p3^6;
sbit sd_cs = p3^4;
//===========================================================
//定义按键端口
sbit key = p2^7;
//===========================================================
//定义512字节缓冲区,注意需要使用 xdata关键字
unsigned char xdata data[512];
void delayms(unsigned int count)
{
int i,j;
for(i=0;i《count;i++)
{
for(j=0;j《260;j++);
}
}
//===========================================================
//写一字节到sd卡,模拟spi总线方式
void sdwrite(unsigned char n)
{
unsigned char i;
for(i=8;i;i--)
{
sd_clk=0;
sd_di=(n&0x80);
n《《=1;
sd_clk=1;
}
sd_di=1;
}
//===========================================================
//从sd卡读一字节,模拟spi总线方式
unsigned char sdread()
{
unsigned char n,i;
for(i=8;i;i--)
{
sd_clk=0;
sd_clk=1;
n《《=1;
if(sd_do) n|=1;
}
return n;
}
//============================================================
//检测sd卡的响应
unsigned char sdresponse()
{
unsigned char i=0,response;
while(i《=8)
{
response = sdread();
if(response==0x00)
break;
if(response==0x01)
break;
i++;
}
return response;
}
//================================================================
//发命令到sd卡
void sdcommand(unsigned char command, unsigned long argument, unsigned char crc)
{
sdwrite(command|0x40);
sdwrite(((unsigned char *)&argument)[0]);
sdwrite(((unsigned char *)&argument)[1]);
sdwrite(((unsigned char *)&argument)[2]);
sdwrite(((unsigned char *)&argument)[3]);
sdwrite(crc);
}
//================================================================
//初始化sd卡
unsigned char sdinit(void)
{
int delay=0, trials=0;
unsigned char i;
unsigned char response=0x01;
sd_cs=1;
for(i=0;i《=9;i++)
sdwrite(0xff);
sd_cs=0;
//send command 0 to put mmc in spi mode
sdcommand(0x00,0,0x95);
response=sdresponse();
if(response!=0x01)
{
return 0;
}
while(response==0x01)
{
sd_cs=1;
sdwrite(0xff);
sd_cs=0;
sdcommand(0x01,0x00ffc000,0xff);
response=sdresponse();
}
sd_cs=1;
sdwrite(0xff);
return 1;
}
//================================================================
//往sd卡指定地址写数据,一次最多512字节
//unsigned char sdwriteblock(unsigned char *block, unsigned long address,int len)
unsigned char sdwriteblock(unsigned long address,int len)
{
unsigned int count;
unsigned char dataresp;
//block size is 512 bytes exactly
//first lower ss
sd_cs=0;
//then send write command
sdcommand(0x18,address,0xff);
if(sdresponse()==00)
{
sdwrite(0xff);
sdwrite(0xff);
sdwrite(0xff);
//command was a success - now send data
//start with data token = 0xfe
sdwrite(0xfe);
//now send data
//for(count=0;count《len;count++) sdwrite(*block++);
for(count=0;count《len;count++) sdwrite(count);
//for(count=0;count《len;count++) sdwrite(0xff);
for(;count《512;count++) sdwrite(0);
//data block sent - now send checksum
sdwrite(0xff); //两字节crc校验, 为0xffff 表示不考虑crc
sdwrite(0xff);
//now read in the data response token
dataresp=sdread();
//following the data response token
//are a number of busy bytes
//a zero byte indicates the mmc is busy
while(sdread()==0);
dataresp=dataresp&0x0f; //mask the high byte of the data response token
sd_cs=1;
sdwrite(0xff);
if(dataresp==0x0b)
{
//printf(“data was not accepted by card -- crc error\n”);
return 0;
}
if(dataresp==0x05)
return 1;
//printf(“invalid data response token.\n”);
return 0;
}
//printf(“command 0x18 (write) was not received by the mmc.\n”);
return 0;
}
//=======================================================================
//从sd卡指定地址读取数据,一次最多512字节
unsigned char sdreadblock(unsigned char *block, unsigned long address,int len)
{
unsigned int count;
//block size is 512 bytes exactly
//first lower ss
//printf(“mmc_read_block\n”);
sd_cs=0;
//then send write command
sdcommand(0x11,address,0xff);
if(sdresponse()==00)
{
//command was a success - now send data
//start with data token = 0xfe
while(sdread()!=0xfe);
for(count=0;count《len;count++) *block++=sdread();
for(;count《512;count++) sdread();
//data block sent - now send checksum
sdread();
sdread();
//now read in the data response token
sd_cs=1;
sdread();
return 1;
}
//printf(“command 0x11 (read) was not received by the mmc.\n”);
return 0;
}
void initbaud(void)
{
tmod=0x20;
th1=0xfd;
tl1=0xfd;
pcon=0x00;
tr1=1;
scon=0x50;//8位波特可变
//scon=0x52;//8位波特可变 ti开中断
}
//============================================================
//主程序
main()
{
unsigned int i;
unsigned long addtemp=331264;//sd卡地址第一个数据物理地址初始值,可以用winhex查看,这里是641物理扇区,512x641=328192,根据实际sd卡内容更改
delayms(5);
sdinit(); //sd卡初始化
while(1)
{
sdwriteblock(addtemp,512);
delayms(1000);
addtemp=331264;
sdreadblock(data,addtemp,512);//每次读出512字节放到缓冲区
initbaud();
for(i=0;i《512;i++)
{
sbuf=data[i];
while(!ti);
ti=0;
delayms(1);
}
while(key); //等待按键按下继续执行
}
}
中兴AXON M正式开启盲约,1月20日上午10:00正式开卖!
特斯拉正式落户上海临港,四年暗战落下帷幕
连续亏损!福特今年拟关闭设在巴西的全部三家工厂
K210 AI Accelerator适用于计算机视觉应用
苏州纳米所发现新型红外隐身材料,不耗能轻松躲过红外探测仪的“法眼”
单片机读取sd卡数据_51单片机读写SD卡程序详解
英特尔刷新数据中心能耗的最新记录并在技术性能上处于全球领先地位?
App Store出现Bug,隐藏部分用户的应用更新按钮
一张图教你看懂身体与可穿戴设备的联网关系
5G智能手机迎来热潮 华为已经做好了“去美国化”的准备
导致三相电机电流不平的原素有哪些
呕吐毒素测定仪的产品特点是怎样的
广播音响系统设计应考虑的几个要素
ST为全新RMS提供人体佩戴式传感器技术
魔镜话题成热门 华为nova 2 Plus亮银亮黑火热预售
Ravenscar Ada任务和FACE安全配置文件
光电液位开关—安装、操作、兼容性指南
893-DCB系列智能前端在PLC控制系统中的应用
新型电源开关技术和隔离式栅极驱动器不断变化的格局
“大军”压境,车联网“原住民”奋力相抵