打印
[总线接口]

SPI驱动SD卡,无法初始化

[复制链接]
999|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wnsd|  楼主 | 2015-2-9 00:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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)
{
   
}


}



我无法复位,各位,求大家帮助我

相关帖子

沙发
lvyunhua| | 2015-2-9 09:31 | 只看该作者
没有看到SD_Init();  函数阿?

使用特权

评论回复
板凳
wnsd|  楼主 | 2015-2-9 10:47 | 只看该作者
lvyunhua 发表于 2015-2-9 09:31
没有看到SD_Init();  函数阿?

void SD_Init(void)
{
        SPI_Init();
        SD_deselect();
}
void SPI_Init(void)
{
  
  DSPI_0.MCR.R = 0x80013001;     //设置DSPI0为主模式,CS信号低有效,禁止FIFO
  DSPI_0.CTAR[0].R = 0x3A0A7727; //配置CTAR[0],设置为每帧数据为8位,高位在前,波特率为50KHz
  DSPI_0.MCR.B.HALT = 0x0;             //DSPI0处于运行状态
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

17

帖子

0

粉丝