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

2019-07-21 03:01发布

原子哥及各位大侠帮我看一下,我利用了SD卡实验例程中的spi.c  spi.h  mmc_sd.c  mmc_sd.h几个文件,其余的都是自己写的,那几个源文件和头文件中我稍稍进行了修改,因为我用的是库,我用SPI1的时候都很正常,但是改到SPI2的时候就不行了,初始化的时候总是失败,不知道大家可不可以帮我看看是什么原因呢;
还有,你的程序中的SPI1的时钟分频是直接操作寄存器做的,但是我改成库函数的时候也不行了,初始化失败了,也不知道为什么;
后来我在改成SPI2口的时候我就直接在mmc_sd.c这个源文件中直接用库函数写时钟的分频,spi.c源文件中时钟分频函数我全给注释掉了;
但是调SPI2口的时候总是不能,我把我改后的工程文件发一个附件,希望大家帮忙看看,改一下,谢谢啊
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
25条回答
正点原子
1楼-- · 2019-07-21 04:08
回复【楼主位】baiydcwy:
---------------------------------
改成库函数的不行?可以参考下我们提供的库函数版本的代码啊.
至于spi2不行,你可以软件仿真一下.
注意SPI2的时钟频率和SPI1的时钟频率来源不是一样的.他们差2倍.
baiydcwy
2楼-- · 2019-07-21 04:54
这个我已经改过了,我用的就是你们库函数版本的,而且我已经将它们的时钟设成一样的了,这个附件里面我用的是8M的,然后又进行的分频,在SPI1里面可以,但是改SPI2后就不行了,这个问题已经搞了几天了,还没有搞好啊
baiydcwy
3楼-- · 2019-07-21 09:45
 精彩回答 2  元偷偷看……
正点原子
4楼-- · 2019-07-21 10:50
 精彩回答 2  元偷偷看……
baiydcwy
5楼-- · 2019-07-21 16:03
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);
但是不知道是哪里的原因

正点原子
6楼-- · 2019-07-21 20:31
回复【6楼】baiydcwy:
---------------------------------
我的分频是针对spi1的,你针对spi2要做修改的.

一周热门 更多>