打印
[其他MCU]

SPI驱动SD卡,SD卡无法复位

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


}



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

相关帖子

沙发
FSL_TICS_Jeremy| | 2015-2-9 09:19 | 只看该作者
请参考此篇经验分享。
https://bbs.21ic.com/icview-845702-1-1.html

使用特权

评论回复
板凳
wnsd|  楼主 | 2015-2-9 11:09 | 只看该作者
FSL_TICS_Jeremy 发表于 2015-2-9 09:19
请参考此篇经验分享。
https://bbs.21ic.com/icview-845702-1-1.html

您的这篇**我看过,里面只是一个流程,没有细讲,没有解决我的问题

使用特权

评论回复
地板
FSL_TICS_Jeremy| | 2015-2-10 09:13 | 只看该作者
wnsd 发表于 2015-2-9 11:09
您的这篇**我看过,里面只是一个流程,没有细讲,没有解决我的问题

两个建议,1. 你可以使用的我上传的代码再试试;2. 如果你有逻辑分析仪的话,你可以看看你的MCU读写SD卡的过程。
spi.zip (7.71 KB)

使用特权

评论回复
5
wnsd|  楼主 | 2015-2-11 00:57 | 只看该作者
FSL_TICS_Jeremy 发表于 2015-2-10 09:13
两个建议,1. 你可以使用的我上传的代码再试试;2. 如果你有逻辑分析仪的话,你可以看看你的MCU读写SD卡 ...

逻辑分析仪是什么东西

使用特权

评论回复
6
wnsd|  楼主 | 2015-2-11 01:00 | 只看该作者
FSL_TICS_Jeremy 发表于 2015-2-10 09:13
两个建议,1. 你可以使用的我上传的代码再试试;2. 如果你有逻辑分析仪的话,你可以看看你的MCU读写SD卡 ...

函数体都一样 我怀疑我的初始化或者那个SPI读写函数有问题,SPI驱动SD卡都是用一个叫(SPI读写一个字节)的函数体,我怀疑我这个函数体有问题

使用特权

评论回复
7
FSL_TICS_Jeremy| | 2015-2-11 09:09 | 只看该作者
wnsd 发表于 2015-2-11 00:57
逻辑分析仪是什么东西

主要是为了分析各种通信时候的波形的,在这一点上要比示波器好用。

使用特权

评论回复
8
wnsd|  楼主 | 2015-2-12 11:20 | 只看该作者
FSL_TICS_Jeremy 发表于 2015-2-11 09:09
主要是为了分析各种通信时候的波形的,在这一点上要比示波器好用。

我调用的函数体都一样没有问题,但还是不行,我怀疑我的初始化有问题

使用特权

评论回复
9
wnsd|  楼主 | 2015-2-12 11:21 | 只看该作者
FSL_TICS_Jeremy 发表于 2015-2-11 09:09
主要是为了分析各种通信时候的波形的,在这一点上要比示波器好用。

我调用的函数体都一样没有问题,但还是不行,我怀疑我的初始化有问题

使用特权

评论回复
10
wnsd|  楼主 | 2015-2-13 17:10 | 只看该作者
FSL_TICS_Jeremy 发表于 2015-2-11 09:09
主要是为了分析各种通信时候的波形的,在这一点上要比示波器好用。

请教您一下,SPI中每8个时钟中间的空闲时间怎么调

使用特权

评论回复
11
FSL_TICS_Jeremy| | 2015-2-15 09:00 | 只看该作者
wnsd 发表于 2015-2-13 17:10
请教您一下,SPI中每8个时钟中间的空闲时间怎么调

我不是很清楚,你说的每8个时钟中间的空闲时间是指每次发生一个字节后,中间有个等待时间吗?

使用特权

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

本版积分规则

4

主题

17

帖子

0

粉丝