OpenEdv-开源电子网

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

实验例程中的SD卡实验中把SPI1口改为SPI2口后卡初始化失败是为什么呢?

[复制链接]

19

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2011-9-19
在线时间
8 小时
发表于 2011-9-19 15:25:13 | 显示全部楼层 |阅读模式
原子哥及各位大侠帮我看一下,我利用了SD卡实验例程中的spi.c  spi.h  mmc_sd.c  mmc_sd.h几个文件,其余的都是自己写的,那几个源文件和头文件中我稍稍进行了修改,因为我用的是库,我用SPI1的时候都很正常,但是改到SPI2的时候就不行了,初始化的时候总是失败,不知道大家可不可以帮我看看是什么原因呢;
还有,你的程序中的SPI1的时钟分频是直接操作寄存器做的,但是我改成库函数的时候也不行了,初始化失败了,也不知道为什么;
后来我在改成SPI2口的时候我就直接在mmc_sd.c这个源文件中直接用库函数写时钟的分频,spi.c源文件中时钟分频函数我全给注释掉了;
但是调SPI2口的时候总是不能,我把我改后的工程文件发一个附件,希望大家帮忙看看,改一下,谢谢啊

TF_Finish_SPI1.rar

654.9 KB, 下载次数: 1269

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2011-9-19 15:36:33 | 显示全部楼层
回复【楼主位】baiydcwy:
---------------------------------
改成库函数的不行?可以参考下我们提供的库函数版本的代码啊.
至于spi2不行,你可以软件仿真一下.
注意SPI2的时钟频率和SPI1的时钟频率来源不是一样的.他们差2倍.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

19

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2011-9-19
在线时间
8 小时
 楼主| 发表于 2011-9-19 15:44:16 | 显示全部楼层
这个我已经改过了,我用的就是你们库函数版本的,而且我已经将它们的时钟设成一样的了,这个附件里面我用的是8M的,然后又进行的分频,在SPI1里面可以,但是改SPI2后就不行了,这个问题已经搞了几天了,还没有搞好啊
回复 支持 反对

使用道具 举报

19

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2011-9-19
在线时间
8 小时
 楼主| 发表于 2011-9-19 15:50:40 | 显示全部楼层
软件仿真我也试过,在初始化的时候通过SPI2发送数据的时候,发送缓存空标志位总是为1,次数过了200次超时退出
初始化中调用这个函数的时候也是过了200次超时退出,调用完这个函数后就退出初始化函数了,也就初始化失败了
u8 SD_Idle_Sta(void)
{
u16 i;
u8 retry;       
for(i=0;i<0xf00;i++);//纯延时,等待SD卡上电完成  
//先产生>74个脉冲,让SD卡自己初始化完成
for(i=0;i<10;i++)SPIx_ReadWriteByte(0xFF); 
//-----------------SD卡复位到idle开始-----------------
//循环连续发送CMD0,直到SD卡返回0x01,进入IDLE状态
//超时则直接退出
retry = 0;
do
{    
//发送CMD0,让SD卡进入IDLE状态
i = SD_SendCommand(CMD0, 0, 0x95);
retry++;
}while((i!=0x01)&&(retry<200));
//跳出循环后,检查原因:初始化成功?or 重试超时?
if(retry==200)return 1; //失败
return 0;//成功     
}
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2011-9-19 16:30:31 | 显示全部楼层
回复【4楼】baiydcwy:
---------------------------------
那说明你是spi2的初始化和时钟设置有问题了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

19

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2011-9-19
在线时间
8 小时
 楼主| 发表于 2011-9-19 16:39:59 | 显示全部楼层
void SPIx_Init(void)
{  
SPI_InitTypeDef  SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE );
   
//这里只针对SPI口初始化
/* Configure SPI1 pins: SCK, MISO and MOSI */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* SPI1 configuration */
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //选择了串行时钟的稳态:时钟悬空高
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //数据捕获于第二个时钟沿
SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;//SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128; //定义波特率预分频的值:波特率预分频值为256
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式
SPI_Init(SPI2, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器

/* Enable SPI1  */
SPI_Cmd(SPI2, ENABLE); //使能SPI外设 
}  
这是我的SPI初始化程序
//配置系统时钟,使能各外设时钟
void RCC_Configuration(void)
{
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
FLASH_SetLatency(FLASH_Latency_0);
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
// RCC_PLLConfig(RCC_PLLSource_HSE_Div2,RCC_PLLMul_2);
// RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET)
{
}
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);
while(RCC_GetSYSCLKSource() != 0x04)
{
}
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO,ENABLE);
}
这个是我的RCC初始化函数,我用SPI1口和SPI2两个版本的工程文件中就只有SPI口初始化这一点有区别,别的地方没有区别,还有一点就是前面说的,SPI1中的时钟分频函数是用的你写的函数,是直接操作寄存器的,而我在SPI2中就没有用这个函数,只是在mmc_spi.c文件中需要要调用分频函数的地方直接用下面的库函数写:
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;
SPI_Init(SPI2,&SPI_InitStructure);
但是不知道是哪里的原因

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2011-9-19 16:46:12 | 显示全部楼层
回复【6楼】baiydcwy:
---------------------------------
我的分频是针对spi1的,你针对spi2要做修改的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

19

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2011-9-19
在线时间
8 小时
 楼主| 发表于 2011-9-19 17:09:11 | 显示全部楼层
对,但是我已经改了,你在初始化的时候低速时钟是256分频,我用SPI2的时候做的是128分频,高速时钟的时候你用的是4分频,我用的是2分频,APB1上的是36M,APB2上是72M,SPI1在APB2中,SPI2在APB1中,这样改后它们的时钟频率是一样的了,但是还是不行。
不知道你方不方便看一下我发的附件里面的东西呢,或者你要是方便的话,能不能把例程里面程序稍稍改一下,将SPI1时钟分频那一块改成SPI2的时钟分频,因为我的时钟分频是用库函数写的,你是用操作寄存器写的,我用库函数改过SPI1的时钟分频函数,但是改完后SPI1就不能正常运行了,改回去直接操作寄存器又可以了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2011-9-19 18:06:33 | 显示全部楼层
检查硬件连接是否有问题!!!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

46

主题

284

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2011-6-20
在线时间
0 小时
发表于 2011-9-19 18:37:09 | 显示全部楼层

看看我修改的吧   曾经也是用在SD卡上面的   程序是OK的!

SPI2.rar

1.64 KB, 下载次数: 2823

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2011-9-19 19:14:37 | 显示全部楼层
貌似楼主的片选弄错了。
 
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

19

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2011-9-19
在线时间
8 小时
 楼主| 发表于 2011-9-20 08:21:24 | 显示全部楼层
忘了说明一下了,STM32的SPI口的片选搞的不是太明白,所以就直接没有用这个片选,我的卡片选直接接地的,所以有关片选的程序是不起作用的,这种做法在SPI1中用的都蛮正常,所以我觉得不像是片选的问题。硬件是我觉得也没有什么问题,我用万用表检查了好几遍,因为我做的转接板,做了两个,第一个是插在SPI1上面的,第二个板是插在SPI2上的板,然后将第一个板插在第二个板上,PA4,PA5,PA6,PA7与它相对应的是PB12,PB13,PB14,PB15
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2011-9-20 08:40:26 | 显示全部楼层
回复【12楼】baiydcwy:
---------------------------------
你用的什么芯片?STM32F103RBT6么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

19

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2011-9-19
在线时间
8 小时
 楼主| 发表于 2011-9-20 08:55:22 | 显示全部楼层
是的,用是RBT6,我刚刚把9楼的文件添加到我的工程中去了,还是不行,串口收到的全是0
回复 支持 反对

使用道具 举报

19

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2011-9-19
在线时间
8 小时
 楼主| 发表于 2011-9-20 08:59:48 | 显示全部楼层
好了,刚刚是把串口调试助手的波特率搞错了,用的是115200,而程序中的是9600,所以收到的总是全0,用SPI2好了,9楼的是用操作寄存器做的,我现在看怎么改一下,改成库的,改发了再发一下,大家指导一下啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2011-9-20 09:09:53 | 显示全部楼层
 
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

19

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2011-9-19
在线时间
8 小时
 楼主| 发表于 2011-9-20 09:42:02 | 显示全部楼层
呵呵,但是以前不是这个问题,波特率什么的都没有错,但就是行不通,搞的我快一个星期了,我去看看他写的和我写的有什么区别,9楼的用的是你写的操作寄存器版本的,他是直接将所有SPI1的地方直接改为SPI2,而我是用库写的,别的好像没有太大区别,我再仔细看看去,看看到底哪里出了问题。
回复 支持 反对

使用道具 举报

46

主题

284

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2011-6-20
在线时间
0 小时
发表于 2011-9-25 18:37:50 | 显示全部楼层
我是用原子哥的SPI1改的 我觉得主要就是使能SPI2时钟不一样
回复 支持 反对

使用道具 举报

6

主题

114

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2011-2-28
在线时间
8 小时
发表于 2011-9-30 17:05:30 | 显示全部楼层
  你们讨论的是不是迷你SD卡的驱动啊。
我会很乐意与你交流的。
回复 支持 反对

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2012-5-15
在线时间
0 小时
发表于 2012-5-15 13:20:06 | 显示全部楼层
楼主,我也和你的情况一样。可添加了9楼的SPI.c还是不行。你能不能把SPI2相关的配置上传一下啊。
回复 支持 反对

使用道具 举报

50

主题

270

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
492
金钱
492
注册时间
2013-2-2
在线时间
0 小时
发表于 2013-4-6 19:05:25 | 显示全部楼层
回复【10楼】muc520:
---------------------------------
楼主,你SPI2的程序能上传一下吗
回复 支持 反对

使用道具 举报

46

主题

284

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2011-6-20
在线时间
0 小时
发表于 2013-4-13 14:06:16 | 显示全部楼层
回复【21楼】qq382663074:

回复【10楼】muc520:
---------------------------------
楼主,你SPI2的程序能上传一下吗

---------------------------------
仔细看看 ,已经上传过了
回复 支持 反对

使用道具 举报

8

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2015-5-31
在线时间
7 小时
发表于 2015-9-13 09:15:05 | 显示全部楼层
回复【22楼】muc520:
---------------------------------
楼主的程序最后是怎么通过的?哪个代码改了?
玩好四轴
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-9-2
在线时间
0 小时
发表于 2015-9-19 16:15:59 | 显示全部楼层
回复【23楼】qiujiafu:
---------------------------------
用9楼的代码可以的,你直接用就行了
回复 支持 反对

使用道具 举报

16

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2015-12-3
在线时间
54 小时
发表于 2016-2-27 17:18:19 | 显示全部楼层
有没有知道什么时候用spi1,什么时候用spi2啊?求教,大神
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2016-11-6
在线时间
12 小时
发表于 2019-4-11 19:03:25 | 显示全部楼层
你好,我在做SD卡的时候也用了spi2,一样无法通过,能具体说一下改了哪里了吗
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
398
金钱
398
注册时间
2020-5-26
在线时间
121 小时
发表于 2022-7-10 11:01:23 | 显示全部楼层

你好,我在做SD卡的时候也用了spi2,一样无法通过,能具体说一下改了哪里了吗
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 17:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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