⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sd_spi.c

📁 SDMMC 源码 SD、MMC卡的读写程序
💻 C
字号:
 /*!
 *@file sd_spi.c
 *
 * 
 *
 *@version v1.0.0
 *@date    2007
 *@author  jacky291@126.com
 */
#include "sd_spi.h"

#ifndef __IO_H
#include "io.h"
#endif
#ifndef __TIME_H
#include "time.h"
#endif
#ifndef __TIME0_H
#include "time0.h"
#endif

uint32 SD_SPI_FREQ;

/*!
*@brief
*        SPI_SPEED_Set
*        set speed
*
*@param  f:frequent
*@retval none
*/  
 void SD_SPI_Clk( uint32 f )
 {
      SD_SPI_FREQ = Fpclk/TIME0_FDIV/f/4;
 }
 
/*!
*@brief
*        SD_SPI_Delay()
*        delay
*
*@param  delay:count value
*@retval none
*/
void SD_SPI_Delay()
{
#if TIME_EN
     TIME t0,t1;
     t0 = now();
     while(1){
         t1 = now();
         if(t1.millions -t0.millions > SD_SPI_FREQ){
         
                break;
         };
     };
#else
     uint32 i=delay;
     while(i>0) i--;
#endif
}

/*!
*@brief
*        SD_powerOn()
*        powerOn
*
*@param  none
*@retval none
*/
void SD_powerOn()
{
     io_disAssert(1<<SD_POWER_PIN);
     
}

/*!
*@brief
*        SD_powerOff()
*        powerOff
*
*@param  none
*@retval none
*/
void SD_powerOff()
{
     io_assert(1<<SD_POWER_PIN);
}

/*!
*@brief
*        SD_SPI_Init()
*        init spi
*
*@param  none
*@retval none
*/
void SD_SPI_Init()
{
#if TIME_EN
    time_init(07,1,1,0,0);
#endif
     /* 电源管理端口 */ 
     io_fun_sel(SD_POWER_PIN,0x00);
     io_dirSet(1<<SD_POWER_PIN,IO_OUT);
#if SOFT_SPI_MODE 
     io_fun_sel(SD_SPI_CS_PIN,0x00);
     io_fun_sel(SD_SPI_DATA_In_PIN,0x00);
     io_fun_sel(SD_SPI_DATA_Out_PIN,0x00);
     io_fun_sel(SD_SPI_CLK_PIN,0x00);
     io_dirSet(1<<SD_SPI_CS_PIN,IO_OUT);
     io_dirSet(1<<SD_SPI_DATA_In_PIN,IO_IN);
     io_dirSet(1<<SD_SPI_DATA_Out_PIN,IO_OUT);
     io_dirSet(1<<SD_SPI_CLK_PIN,IO_OUT);
     SD_SPI_Send_1();
#else
     io_fun_sel(SD_SPI_CS_PIN,0x01);
     io_fun_sel(SD_SPI_DATA_In_PIN,0x01);
     io_fun_sel(SD_SPI_DATA_Out_PIN,0x01);
     io_fun_sel(SD_SPI_CLK_PIN,0x01);
     S0PCCR = SD_SPI_FDIV;				            	   
     S0PCR  = SD_SPI_CONFIG;		                        
#endif     
}

/*!
*@brief
*        SD_SPI_RevByte()
*        receive the data
*
*@param  none
*@retval the receive data(8 bits)
*/
uint8 SD_SPI_RecByte()
{
      uint8 Rev = 0x00;
#if SOFT_SPI_MODE 
      uint8 i;
      for(i=0;i<8;i++){
          SD_SPI_CLK_UP();
          SD_SPI_Delay();
          if(SD_SPI_DATA_In()>0){
                   Rev=Rev|0x80>>i;
          };
          SD_SPI_Delay();
          SD_SPI_CLK_DOWN();
          SD_SPI_Delay(); 
      };
      SD_SPI_Delay();
#else
      while( 0==(S0PSR&0x80));
      Rev = S0PDR ;
#endif
      return Rev;
}

/*!
*@brief
*        SD_SPI_SendByte(uint8 data)
*        send the data
*
*@param  the data sended(8 bits)
*@retval 
*/
uint8 SD_SPI_SendByte(uint8 dat)
{
#if SOFT_SPI_MODE                           
      uint8 i,SendMask=0x80;
      for(i=0;i<8;i++){
             if((dat&SendMask>>i)>0){
                           SD_SPI_Send_1();
              }else{
                           SD_SPI_Send_0();
             };
             SD_SPI_Delay();
             SD_SPI_CLK_UP();
             SD_SPI_Delay();
             SD_SPI_CLK_DOWN();
             SD_SPI_Delay(); 
      };   
      SD_SPI_Send_1(); 
      SD_SPI_Delay(); 
      return 0; 
#else      
      S0PDR = dat;
      while(0==(S0PSR&0x80));		/*! 等待SPIF置位,即等待数据发送完毕*/
      return S0PSR;    
#endif   
}

/*!
*@brief
*        SD_SPI_WaitFor(uint32 timeout)
*        wait for the response
*
*@param  uint32 timeout:the timeout value
*@retval if the data arrived,return 0,else return SPI_TIME_OUT
*/
uint8 SD_SPI_WaitForLow(uint32 timeout)
{   
      uint32 i;
#if SOFT_SPI_MODE 
      do{
          SD_SPI_CLK_UP();
          SD_SPI_Delay();
          if(SD_SPI_DATA_In()==0){
                   return 0;
          };
          SD_SPI_CLK_DOWN();
          SD_SPI_Delay();
          i++;
      }while(i<timeout);
#else
       do{
          if( SD_SPI_RecByte() != 0xFF ) return 0;
          i++;
      }while(i<timeout);
#endif
      return SPI_TIMEOUT;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -