📄 sdhal.c
字号:
#include <stdio.h>
#include <sys/unistd.h>
#include <io.h>
#include <string.h>
#include "system.h"
#include "alt_types.h"
#include "altera_avalon_pio_regs.h"
#include "sdconfig.h"
#include "sdhal.h"
/********************************************************************************************************************/
INT32U SPI_Clk_Delay;
void SD_HardWareInit(void)
{
SPI_Clk_Delay = 30;
// 初始化SPI接口
IOWR_ALTERA_AVALON_PIO_DATA(SD_CS_BASE, high);
IOWR_ALTERA_AVALON_PIO_DATA(SD_CLK_BASE, high);
IOWR_ALTERA_AVALON_PIO_DATA(SD_DOUT_BASE, high);
}
//提高SPI时钟速率
void SPI_ClkToMax(void)
{
SPI_Clk_Delay = 0;
}
//延迟,用来控制SDCLK频率
void SPI_Delay(INT32U delay)
{
while(delay--);
}
//SPI 读写
INT8U SPI_RW_Byte(INT8U byte)
{
INT8U i, dat;
dat = 0;
for(i=0; i<8; i++)
{
SPI_SCK_CLR();
if(byte&0x80) //高位为1
SPI_MOSI_SET();
else
SPI_MOSI_CLR();
byte <<= 1;
dat <<= 1;
dat |= SD_MISO_STATUS();
SPI_Delay(SPI_Clk_Delay);
SPI_SCK_SET();
SPI_Delay(SPI_Clk_Delay);
}
return dat;
}
//SPI片选拉低
void SPI_CS_Assert(void)
{
SPI_CS_CLR();
}
//SPI片选置高
void SPI_CS_Deassert(void)
{
SPI_CS_SET();
}
//检测卡是否完全插入
INT8U SD_ChkCard(void)
{
if (SD_INSERT_STATUS() != 0)
return 0; // 未完全插入
else
return 1; // 完全插入
}
//检测卡写保护
INT8U SD_ChkCardWP(void)
{
if (SD_WP_STATUS() != 0)
return 1; // 卡写保护
else
return 0; // 卡未写保护
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -