单片机对SD卡读写系列(一)

发布者:快乐飞跃最新更新时间:2016-01-15 来源: eefocus关键字:单片机  SD卡  读写系列 手机看文章 扫描二维码
随时随地手机看文章
SD卡,是一种基于半导体快闪记忆器的新一代记忆设备,SD于1999年8月研制成功,其重量只有2克。但却拥有高记忆容量、快速数据传输率、极大的移动灵活性以及很好的安全性。SD卡也很容易重新格式化,有广泛的应用领域,如音乐、电影、新闻等多媒体文件都可以方便地保存,数码相机也开始支持SD卡。SD卡容量最高能达到4GB。

SD卡在24mm×32mm×2.1mm的体积内结合了〔SanDisk〕快闪记忆卡控制与MLC(Multilevel Cell)技术和Toshiba(东芝)0.16u及0.13u的NAND技术,通过9针的接口界面与专门的驱动器相连接,不需要额外的电源来保持其上记忆的信息。而且它是一体化固体介质,没有任何移动部分,所以不用担心机械运动的损坏。

  SD卡(Secure Digital Memory Card)是一种基于半导体闪存工艺的存储卡,1999年,由日本松下、东芝及美国SanDisk公司共同研制完成。2000年,这几家公司发起成立了SD协会(Secure Digital Association简称SDA),阵容强大,吸引了大量厂商参加。其中包括IBM,Microsoft,Motorola,NEC、Samsung等。在这些领导厂商的推动下,SD卡已成为目前消费数码设备中应用最广泛的一种存储卡。SD卡具有大容量、高性能、安全等多种特点的多功能存储卡,它比MMC卡多了一个进行数据著作权保护的暗号认证功能(SDMI规格),读写速度比MMC卡要快4倍。

好了,既然这么好,我们在这里给出51单片机读写2G SD卡程序:

#include //程序通过调试
#include
//=============================================================
//定义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                                                                  
       {
      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
for(count=0;count
//for(count=0;count
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 ");
return 0;
}
if(dataResp==0x05)
return 1;

//printf("Invalid data Response token. ");
return 0;
}
//printf("Command 0x18 (Write) was not received by the MMC. ");
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 ");

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

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. ");
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);                         //等待按键按下继续执行
 
 }
}
可以在串口中看到SD卡中被写入的数据

关键字:单片机  SD卡  读写系列 引用地址:单片机对SD卡读写系列(一)

上一篇:单片机对SD卡读写系列(二)
下一篇:HT1621 LCD 驱动

推荐阅读最新更新时间:2024-03-16 14:44

单片机电路设计建议
立题简介: 内容:介绍单片机基本电路构成; 来源:综合实际使用得出; 作用:统一总结单片机设计时所需电路,避免遗漏; PCB环境:Altium Designer、PADS; 日期:2018-03-06; =====================分割线======================== 立题详解: 在之前介绍过“STM32”和“STM8”单片机,对单片机入门而言,多是从“89C51”开始;“89C51”无愧是“经典级单片机”,在数十年前,微控制器技术并不发达,8bit单片机普及率很低,而“89C51”凭借价格、性能逐步占领市场,即使到了今天,“89C51”仍应用于很多场合;譬如现在“校园外”所设计的“自动门”,其“控
[单片机]
基于XC2300系列MCU的电子动力转向系统
如今电子动力转向系统(EPS)已经成为减少二氧化碳排放的关键要素之一。因此各种不同类型的汽车都装备有机电动力转向系统。那么在实现电子助力转向系统时需要用到哪些技术呢? EPS就是一种机电动力转向系统,它用电子控制的电机代替原来的水压助力转向装置。EPS系统在发动机仓内占用更少的空间,更容易组装,而且能够节省燃油消耗。另外它在转向系统中不再使用有毒的液压油。在小型车辆中,电机是通过齿轮箱连接到转向柱的,而在中型汽车内,电机利用凸缘架斜向或纵向安装在齿轮架上,并通过齿轮箱操作。当司机转动方向盘时,电机就为转向系统提供动力。 EPS系统工作原理 电子动力转向系统由一个控制单元、众多传感器和一个无刷电机组成。控
[单片机]
基于XC2300<font color='red'>系列</font><font color='red'>MCU</font>的电子动力转向系统
国产内核MCU怎样点燃汽车和IoT双擎
IoT生态的逐步成熟和汽车的电子智能化,成为MCU发展的双擎。以这两大应用为核心,结合5G、AI等新技术,MCU正在快速渗透进各种细分领域。 在国内市场,国产MCU更是厚积薄发,在各个战场“攻城略地”。在2020年慕尼黑电子展上,国产MCU代表厂商芯旺微就携8位和32位MCU系列亮相,一展国产自主MCU内核“kungFu”的风采。 作为国内较早自主开发内核的MCU芯片厂商,芯旺微已经形成了完整的MCU布局,成功向应用市场推出了KF8F、KF8L、KF8A、KF8TS、KF8S等多种8位MCU产品和KF32A、KF32F、KF32L、KF32LS等32位MCU产品。 就在几天之前,芯旺微电子刚刚收获2020年度中国IC设计成
[手机便携]
国产内核<font color='red'>MCU</font>怎样点燃汽车和IoT双擎
51单片机串口通信的原理与应用流程解析
一、原理简介 51 单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称为全双工串行口。串行通信是指数据一位一位地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信。其缺点是传输速度较低。 与之前一样,首先我们来了解单片机串口相关的寄存器。 SBUF 寄存器:它是两个在物理上独立的接收、发送缓冲器,可同时发送、接收数据,可通过指令对SBUF 的读写来区别是对接收缓冲器的操作还是对发送缓冲器的操作。从而控制外部两条独立的收发信号线RXD(P3.0)、TXD(P3.1),同时发送、接
[单片机]
51<font color='red'>单片机</font>串口通信的原理与应用流程解析
单片机SD卡读写系列(一)
SD卡,是一种基于半导体快闪记忆器的新一代记忆设备,SD于1999年8月研制成功,其重量只有2克。但却拥有高记忆容量、快速数据传输率、极大的移动灵活性以及很好的安全性。SD卡也很容易重新格式化,有广泛的应用领域,如音乐、电影、新闻等多媒体文件都可以方便地保存,数码相机也开始支持SD卡。SD卡容量最高能达到4GB。 SD卡在24mm 32mm 2.1mm的体积内结合了〔SanDisk〕快闪记忆卡控制与MLC(Multilevel Cell)技术和Toshiba(东芝)0.16u及0.13u的NAND技术,通过9针的接口界面与专门的 驱动器 相连接,不需要额外的 电源 来保持其上记忆的信息。而且它是一体化固体介质,没有任何移动部分,所以
[单片机]
为什么选择AVR单片机
为什么选用AVR单片机? (1) 为什么选用AVR单片机? Flash程序存储器可擦写1000次以上,不再有报废品产生。PIC 有的是OTP,只能烧录一次。AVR程序存储器数据为16位组织,也可按8位理解。PIC是12/14位程序 存储器,作寄存器转移和算术、逻辑运算带来不便。 (2) 为什么选用AVR单片机? 高速度(50ns)、低功耗!硬件应用Harward结构,具有预取指令功能, 使得指令可以在一个时钟周期内执行。PIC要4个时钟周期执行一条指令。MSC-51要12个时钟周期 执行一条指令。 (3) 为什么选用AVR单片机? 超功能精简指令!具有32个通用工作寄存器(相当于8051中的32个累 加器,克服了单一累加
[单片机]
基于C语言STC89C52单片机电子密码锁的设计与仿真
搜索: IC库存 认证库存 PDF 文章 用户名: 密码: 社区 企业 免费注册 iframe marginWidth=0 marginHeight=0 src="http://afp21ic.allyes.com/main/adfshow?user=Afp21ic|MCU|logo_left&db=afp21ic&border=0&local=yes" frameBorder=0 width=758 scrolling=no height=64 /iframe 首页 资讯: 新闻 应用 新品 eBooks 电路图
[单片机]
以C8051F020单片机为系统控制器件的实时检测和记录车辆散热系统动态参数电路设计
1 引言 车辆的系统散热性是衡量其先进性的一个重要标志,因为车辆的各个部件和系统都存在一个最佳的工作温度区间,在此温度范围内零部件的各项性能指标才能得以保证。目前,我国车辆系统的研制已进入自行研制、自主创新的发展阶段,由于缺乏实车试验测试条件,加上车辆工作环境的复杂性,导致有效的实车试验数据严重缺乏,试验周期长,数据可复现性差,无法向工程设计部门提供准确有效的实车试验数据,严重影响车辆总体技术的进一步发展。因此,本文着重于在不改变车辆现有结构和性能的前提下,采用单片机控制系统、传感器技术、数据存储技术、实时时钟技术,研制一套能实时检测和记录车辆散热系统动态参数的电子电路。 2 系统总体构架设计 该散热系统参数测试电路由上位微型计算
[单片机]
以C8051F020<font color='red'>单片机</font>为系统控制器件的实时检测和记录车辆散热系统动态参数电路设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved