📄 sd_spi.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 + -