OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5294|回复: 8

SD卡实验

[复制链接]

10

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-10-17
在线时间
0 小时
发表于 2013-12-11 11:04:35 | 显示全部楼层 |阅读模式

 初始化SD卡的时候,发送CMD0之前,要发送至少74个时钟。

这里是使用的一个FOR循环:
  for(i=0;i<10;i++)
      SD_SPI_ReadWriteByte(0XFF);  //发送最少74个脉冲
晶振:12.88M,则时钟周期为1/12.88us。。

问题1:上面的fou循环执行一次需要多长时间呢?
问题2:在for循环里为什么需要向spi写入SD_SPI_ReadWriteByte(0XFF); ?

还有一个问题是设置SPI的速度的,
void SPI2_SetSpeed(u8 SpeedSet)
{
 SPI2->CR1&=0XFFC7;
 SPI2->CR1|=SpeedSet;
 SPI_Cmd(SPI2,ENABLE);
}
CR1中各位的含义是什么呢?

不好意思。。。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-12-11 12:26:17 | 显示全部楼层
回复【楼主位】天若海愚:
---------------------------------
1、for的执行时间完全取决于你所做循环的函数
2、发送0xff使MOSI处于高电平,主要是提供始终信号给SD卡
3、CR1是硬件SPI的分频寄存器
楼主可以参考库函数的void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct)函数介绍,里面讲的比较详细
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

10

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-10-17
在线时间
0 小时
 楼主| 发表于 2013-12-11 19:00:17 | 显示全部楼层
回复【2楼】Badu_Space:
---------------------------------
非常感谢您耐心的解答。。
还有就是SD_SPI_ReadWriteByte(0XFF)这句如何知道是发送8个时钟的?
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-12-12 08:48:55 | 显示全部楼层
回复【3楼】天若海愚:
---------------------------------
这要看你发送的数据是8bit的还是16bit的,如果你设置的数据为8bit的,所提供的时钟就是8个,如果你设置的数据为16bit的,所提供的时钟就是16个
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

10

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-10-17
在线时间
0 小时
 楼主| 发表于 2013-12-12 10:53:25 | 显示全部楼层
回复【4楼】Badu_Space:
---------------------------------
没能理解您说的。
往上推得出原函数:
u8 SD_SPI_ReadWriteByte(u8 data)
{
return SPI2_ReadWriteByte(data);
}
继续推:
u8 SPI2_ReadWriteByte(u8 TxData)
{
u8 retry=0;  
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
{
retry++;
if(retry>200)return 0;
}   
SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个数据
retry=0;

while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
{
retry++;
if(retry>200)return 0;
}        
return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据     
}

究竟是哪条语句实现了我发送8个时钟?
不好意思了。。
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-12-12 11:23:31 | 显示全部楼层
回复【5楼】天若海愚:
---------------------------------
这句SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个数据
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

10

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-10-17
在线时间
0 小时
 楼主| 发表于 2013-12-12 15:10:25 | 显示全部楼层
回复【6楼】Badu_Space:
---------------------------------
感谢您。。
我刚接触STM32不久,能给点学习意见么?51学了3个月之后就直接切入到STM32上了。。
目前就是用原子的开发板练习。。
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-12-12 15:57:37 | 显示全部楼层
回复【7楼】天若海愚:
---------------------------------
我接触STM32也才半年,所以给不了什么好的建议,呵呵
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

10

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-10-17
在线时间
0 小时
 楼主| 发表于 2013-12-12 16:23:36 | 显示全部楼层
回复【8楼】Badu_Space:
---------------------------------
感觉已经是高手了。。学习。。。呵呵
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-15 03:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表