• 大小: 9KB
    文件类型: .c
    金币: 1
    下载: 0 次
    发布日期: 2021-06-11
  • 语言: 其他
  • 标签: SPI  

资源简介

实现对SD卡的读取,包括实现SPI总线的控制和对SD卡初始化等

资源截图

代码片段和文件信息

#include 
#include “sd.h“
#include “myfun.h“ //公共函数头文件


#define _SD_Write_Sector 0

#define CS_SD_EN    (CS=0)      //为低时表示片选
#define CS_SD_DIS   (CS=1)      //disable     
#define SCK_SD_LOW   SD_SCL=0;     //low
#define SCK_SD_HIGH  SD_SCL=1;   // SCK = 1
#define SI_SD_LOW    SD_SI=0;      //(SISO均相对SSD)
#define SI_SD_HIGH   SD_SI=1;      //SI=1
/*******************************************************

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

//变量定义
//--------------------------------------------------------------
bit is_init;        //在初始化的时候设置此变量为1同步数据传输(SPI)会放慢
//---------------------------------------------------------------

//unsigned char bdata _dat;
//sbit _dat7=_dat^7;
//sbit _dat6=_dat^6;
//sbit _dat5=_dat^5;
//sbit _dat4=_dat^4;
//sbit _dat3=_dat^3;
//sbit _dat2=_dat^2;
//sbit _dat1=_dat^1;
//sbit _dat0=_dat^0;

#ifdef _STC12C_SPI
void SD_spi_write(unsigned char spidata)      ////////注意读的时候,也要写一个字节
{  
 if (is_init)
  CLK_DIV=0x07;
 else
  CLK_DIV=0x00;
 
 SPSTAT=0xC0;
 SPDAT=spidata;
 while(!(SPSTAT & 0x80));
}

unsigned char SD_spi_read()////////注意读的时候,也要写一个字节
{  
 unsigned char spidata;
 if (is_init)
  CLK_DIV=0x07;
 else
  CLK_DIV=0x00;
 
 SPSTAT=0xC0;
 SPDAT=0xAA;
 while(!(SPSTAT & 0x80));
 spidata=SPSTA;
 return spidata;
}

#else
/******************************************************************
 - 功能描述:IO模拟SPI,发送一个字节
 - 隶属模块:SD卡模块
 - 函数属性:内部
 - 参数说明:x是要发送的字节
 - 返回说明:无返回
 - 注:其中is_init为1时,写的速度放慢,初始化SD卡SPI速度不能太高
 ******************************************************************/

void SD_spi_write(unsigned char x) 
{
  unsigned char i;
  for (i = 0; i < 8; i++)
  {
    if (x & 0x80)
    {
      SI_SD_HIGH;
    }
    else
    {
      SI_SD_LOW;
    }
    SCK_SD_LOW ;
    if(is_init) delay(DELAY_TIME);
    _nop_();
    SCK_SD_HIGH;
    if(is_init) delay(DELAY_TIME);
    _nop_();
    x<<=1;
  }

}

/******************************************************************
 - 功能描述:IO模拟SPI,读取一个字节
 - 隶属模块:SD卡模块
 - 函数属性:内部
 - 参数说明:无
 - 返回说明:返回读到的字节
 ******************************************************************/

unsigned char SD_spi_read() //SPI读一个字节
{  
  unsigned char irByte=0; 
  
  for(i=0;i<8;i++)
  { 
    SD_SO=1;
    SCK_SD_LOW ;
    if(is_init) delay(DELAY_TIME);
    _nop_();
    SCK_SD_HIGH;
    if(is_init) delay(DELAY_TIME);
    _nop_();
    rByte<<=1; 
    rByte|=SD_SO; 
  } 
  return rByte; 
}
#endif

/******************************************************************
 - 功能描述:向SD卡写命令
 - 隶属模块:SD卡模块
 - 函数属性:内部
 - 参数说明:SD卡的命令是6个字节,pcmd是指向命令字节序列的指针
 - 返回说明:命令写入后,SD卡的回应值,调用不成功,将返回0xff
 ******************************************************************/

unsigned char SD_Write_Cmd(unsigned char *pcmd) //向SD卡写命令,pcmd是命令字节序列的首地址
{
 unsigned char temptime=0;

 SD_CS=1;
 SD_spi_write(0xFF); //提高兼容性,如果没有这里,有些SD卡可能不支持 
// SD_spi_write(0xFF); //提高兼容性,如果没有这里,有

评论

共有 条评论