void delay1(void)
{
uint32_t j;
for(j=0;j<14000;j++)
{}
}
/*************************************************************/
/* SPI读写一个字节 */
/*************************************************************/
uint8_t SPI_Byte(uint8_t value) // : SPI读写一个字节(发送完成后返回本次通讯读取的数据)
{
uint8_t input;
DSPI_0.PUSHR.R = 0x08000000|value; //赋值需要发送的数据
while(DSPI_0.SR.B.TCF==0) //等待发送完成
{}
DSPI_0.SR.B.TCF=1; //清除发送完成标志位
//Parameter_sent(DSPI_0.SR.B.RFDF);
while(DSPI_0.SR.B.RFDF==0) //等待接收到数据
{}
input=(uint8_t)(DSPI_0.POPR.R); //读取接收到的数据
DSPI_0.SR.B.RFDF=1; //清除接收标志位
return(input); //返回接收到的数据
}
/*************************************************************/
/* 向SD卡写入命令 */
/*************************************************************/
uint8_t SD_send_command(uint8_t cmd, uint32_t arg)
{
uint8_t a
;
uint8_t retry=0,i=0;
SPI_Byte(0xff);
SD_select();
SPI_Byte(cmd | 0x40);//分别写入命令
SPI_Byte(arg>>24);
SPI_Byte(arg>>16);
SPI_Byte(arg>>8);
SPI_Byte(arg);
SPI_Byte(0x95);
a = SPI_Byte(0xff);
while(a == 0xff)
{ a = SPI_Byte(0xff);
delay1();
if(retry++ > 100) break;//超时退出
}//等待响应,
SD_deselect();
SPI_Byte(0xff);
return a;//返回状态值
}
/*************************************************************/
/* 初始化SD卡 */
/*************************************************************/
uint8_t SD_Reset(void)
{
uint8_t i;
uint8_t retry;
uint8_t a=0;
retry = 0;
do
{
for(i=0;i<10;i++) SPI_Byte(0xff);
a = SD_send_command(0,0); //发空闲命令
flag[retry]=a;
retry++;
delay1();
if(retry>=250) return 1; //超时退出
} while(a != 0x01);
return 0;//正常返回
}
/************************************************************/
/* 主函数 */
/************************************************************/
int main(void)
{
SWT_DisableWatchDog();
SYSTEM_Init();
initUART1();
SIU_init();
SD_Init(); //spi初始化
delay1(); //上电延时
while(SD_Reset()!=0)
{
}
}
我无法复位,各位,求大家帮助我
|