原创 AVR的SD卡接口程序

2008-7-2 13:57 4210 5 8 分类: 软件与OS

SD卡接口程序/************************************************************/
/*           SD Code for   M32L             */
/*       By   pasyong        */
/*       2006-4         */
/*       Base ICC6.31A             */
/************************************************************/
#include <iom32v.h>
#include <macros.h>
#include "1011.h"
#define uchar unsigned char
#define uint unsigned int
#define MMC_CS_PIN     BIT(4)    //PORTB.4
#define MMC_PORT       PORTB   


 uchar reading="0",a=0,pointer=0;
void sd_port_init()
{
MMC_PORT =MMC_CS_PIN;
}
uchar BUFFER[512];                   //扇区缓冲区
uint i="0";
void delay_nus(uint n)
 {
 unsigned char  b;
  for (b = 1; b<n; b++)
   ;
 }
//****************************************************************************
//Send a Command to MMC/SD-Card
//Return: the second byte of response register of MMC/SD-Card
//****************************************************************************
uchar SD_Write_Command(uchar cmd,unsigned long arg)
{
   uchar tmp;
   uchar retry="0";
  
   //MMC_PORT =MMC_CS_PIN;       //SD卡关闭  
   //send 8 Clock Impulse
   Write_Byte_SPI(0xFF);
  
   //set MMC_Chip_Select to low (MMC/SD-Card active)
  MMC_PORT&=~MMC_CS_PIN;       //SD卡使能


   Write_Byte_SPI(cmd 0x40);   //送头命令
   Write_Byte_SPI(arg>>24);
   Write_Byte_SPI(arg>>16);     //send 6 Byte Command to MMC/SD-Card
   Write_Byte_SPI(arg>>8);
   Write_Byte_SPI(arg&0xff);
   Write_Byte_SPI(0x95);       //仅仅对RESET有效的CRC效验码
 
   //get 8 bit response
   //Read_Byte_MMC(); //read the first byte,ignore it.
   do
   {  //Only last 8 bit is used here.Read it out.
      tmp = Read_Byte_SPI();
      retry++;
   }
   while((tmp==0xff)&&(retry<100));  //当没有收到有效的命令的时候
  
   if(reading==0)
   MMC_PORT =MMC_CS_PIN;            //MMC_CS_PIN=1;
   else MMC_PORT&=~MMC_CS_PIN;      //MMC_CS_PIN=0;  
   return(tmp);
}
//****************************************************************************
//SD卡初始化(SPI-MODE)
//****************************************************************************
uchar SD_Init(void)

   uchar retry,temp;
   uchar i;
   MMC_PORT&=~MMC_CS_PIN;      //SD卡使能
 
  delay_nus(250);  //Wait MMC/SD ready...
   for (i=0;i<0x0f;i++)
   {
      Write_Byte_SPI(0xff); //send 74 clock at least!!!
   }
   //Send Command CMD0 to MMC/SD Card
   retry="0";
  
   do
   { //retry 200 times to send CMD0 command
     temp="SD"_Write_Command(0,0);
     retry++;
     if(retry==100)
     {
      ;//CMD0 Error!
     }
   }
   while(temp!=1); 
  
   //Send Command CMD1 to MMC/SD-Card
   retry="0";
   do
   { //retry 100 times to send CMD1 command
     temp="SD"_Write_Command(1,0);
     retry++;
     if(retry==100)
     {
     ;
     }
   }
   while(temp!=0);
   retry="0";
    SD_Write_Command(16,512);     //设置一次读写BLOCK的长度为512个字节
 
   MMC_PORT =MMC_CS_PIN;   //MMC_CS_PIN=1;  //set MMC_Chip_Select to high
   return(0); //All commands have been taken.
}
//****************************************************************************
//从SD卡读一个扇区  Return 0 if no Error.
//****************************************************************************
uchar SD_Read_Block(unsigned long address)

   uchar temp="0";uint i="0";
   reading="1";
   temp="SD"_Write_Command(17,address);     //读出RESPONSE    
   while (Read_Byte_SPI()!= 0xfe)
   {;}  //直到读取到了数据的开始头0XFE,才继续
   for(i=0; i<512; i++)
 {
 BUFFER=Read_Byte_SPI();
 }
   Read_Byte_SPI();//CRC - Byte
   Read_Byte_SPI();//CRC - Byte
   reading="0";
   MMC_PORT =MMC_CS_PIN;        //关闭SD卡
   return(temp);
}

  (转自:http://www.laogu.com/wz_2948.htm

文章评论3条评论)

登录后参与讨论

sunyzz 2013-1-4 16:06

在你的初始化中有如下代码for (i=0;i<0x0f;i++) { Write_Byte_SPI(0xff); //send 74 clock at least!!! } 相当于发送15*8个时钟,请问这时你的cpu工作频率是多少小于400k吗,如果是的话,初始化完毕后也没见你将频率改变,是不是你的这段代码的SD卡一直工作在400k以下(读写数据的时候)

用户1284163 2008-7-7 16:54

随后会加入,SD模式的内容,请留意本博客更新。

用户159704 2008-7-3 21:24

这个是SPI模式的吧?有没有SD模式的?想学习。
相关推荐阅读
用户1284163 2009-08-22 12:10
SD卡的读写和加解密
一、概述SD卡全称为 Secrue Digital Memory Card,具有轻巧、可加密、传输速度高、适用于手持设备使用等优点。二、总线接口SD需要高速读写,同时也要使手持等嵌入式设备能方便使用,...
用户1284163 2009-08-22 12:10
USB 3.0规范(Universal Serial Bus 3.0 Specification)
由Intel、微软、惠普、德州仪器、NEC、ST-NXP等业界巨头组成的USB 3.0 Promoter Group负责制定的新一代USB 3.0标准已经正式完成并公开发布。新规范提供了十倍于USB ...
用户1284163 2008-09-08 13:35
CE5.0下SD卡驱动开发(一)
Windows ce 的SD卡驱动协议栈包含总线驱动,主控制端驱动,客户端驱动。总线驱动作为提取和管理层处于主控制驱动和客户端驱动之间。它包括在SDbus.dll文件。为客户端驱动提供了标准的API,...
用户1284163 2008-08-07 16:34
NOR flash和NAND flash的区别(转)
     一般而言,flash分为nor和nand2种,简单的说就是用or门和and门搭建的2种flash。目前用为海量存储器的flash都是nand结构,而一些当成rom使用的flash为nor结构...
用户1284163 2008-07-17 16:28
Flash闪存分类介绍
Flash闪存是非易失性存储器,这是相对于SDRAM等存储器所说的。即存储器断电后,内部的数据仍然可以保存。Flash根据技术方式分为Nand 、Nor Flash和AG-AND Flash,而升级。...
用户1284163 2008-07-17 15:24
JTAG接口
JTAG(Joint Test Action Group,联合测试行动小组)是一种国际标准测试协议(IEEE 1149.1兼容),主要用于芯片内部测试。现在多数的高级器件都支持JTAG协议,如DSP、...
我要评论
3
5
关闭 站长推荐上一条 /2 下一条