#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
uchar is_init;
uchar pbuf[512];//数据缓冲区
uchar text;
/*******************SD错误码定义************************/
#define INIT_CMD0_ERROR 0X01
#define INIT_CMD1_ERROR 0X02
#define WRITE_BLOCK_ERROR 0X03
#define READ_BLOCK_ERROR 0X04
/*******************************************************/
/**********************************************************/
/* 函数名称 : 延时函数 */
/* 函数功能 : 延时 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*--------------------------------------------------------*/
void delay(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1141;j++);
}
}
/**********************************************************/
/* 函数名称 : 模拟SPI延时函数 */
/* 函数功能 : 延时 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*--------------------------------------------------------*/
void timer()
{
unsigned char i=100;
while(i --);
}
/**********************************************************/
/* 函数名称 : 模拟SPI总线端口初始化 */
/* 函数功能 : PD端口初始化 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*--------------------------------------------------------*/
void Simulation_SPI_INIT()
{
/*
CS PD.0
DIN PD.1
SCK PD.2
DOUT PD.3
*/
DDRA|=BIT(2);
PORTA|=BIT(2);
DDRB = 0XFF;
DDRD = 0XF7; //PD口全为输出
PORTD = 0XFF;
// DDRD &= 0XF7; //PD.3设为输入
}
/**********************************************************/
/* 函数名称 : 模拟SPI写函数 */
/* 函数功能 : SPI写数据 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*--------------------------------------------------------*/
void Simulation_SPI_WRITE(unsigned char datain)
{
unsigned char i;
for(i=0;i<8;i++)
{
if((datain << i) & 0x80)
{
PORTD |= 0X02;
}
else
{
PORTD &= 0XFD;
}
PORTD &= 0XFB;//SCL = 0
if(is_init)
{timer();}
PORTD |= 0X04;//SCL = 1
if(is_init)
{timer();}
}
}
/**********************************************************/
/* 函数名称 : 模拟SPI读函数 */
/* 函数功能 : SPI读数据 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*--------------------------------------------------------*/
unsigned char Simulation_SPI_READ(void)
{
unsigned char temp = 0,i;
PORTD |= 0X08;
for(i = 0;i ++;i < 8)
{
PORTD &= 0XFB;
if(is_init){timer();}
if(PIND & 0X08)
{
temp |= (0x80 >> i);
}
PORTD |= 0X04;
if(is_init){timer();}
}
return temp;
}
/**********************************************************/
/* 函数名称 : SD卡写函数 */
/* 函数功能 : 向SD卡写入 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*--------------------------------------------------------*/
unsigned char SD_WRITE(unsigned char *pcmd)
{
unsigned char temp,time = 0,i;
for(i = 0;i < 6;i ++)
{
Simulation_SPI_WRITE(pcmd[i]);
}
do
{
temp = Simulation_SPI_READ();
time ++;
}while((temp == 0xff) && (time < 100));
return(temp);
}
/**********************************************************/
/* 函数名称 : SD复位 */
/* 函数功能 : */
/* 参数 : 无 */
/* 返回值 : 无 */
/*--------------------------------------------------------*/
unsigned char SD_RESET()
{
unsigned char time,temp,i;
unsigned char pcmd[]={0x40,0x00,0x00,0x00,0x00,0x95};
is_init = 1;
PORTD |= 0X01;//CS = 1
for (i = 0;i < 0xff;i ++)
{
Simulation_SPI_WRITE(0xff);//120CLK
}
PORTD &= 0XFE;//CS = 0
time = 0;
do
{
temp = SD_WRITE(pcmd);
//text = temp;//0x00
time ++;
if(time == 200)
{
return(INIT_CMD0_ERROR);
}
}while(temp != 0x01);
PORTD |= 0X01;//CS = 1
Simulation_SPI_WRITE(0XFF);//补偿8个时钟
return(0);//复位成功
}
void main()
{
Simulation_SPI_INIT();
text = SD_RESET();
PORTB = text;
while(1);
}
以上是我的复位程序,CMD0返回值一直不对,求大神指教 |