qinkaiabc 发表于 2013-11-25 21:18:14

请教!STM32F03DISCOVERY 调试SPI模式SD卡初始化失败

 从ST官网下载了STM32F0xx_StdPeriph_Lib_V1.1.0的固件库,发现里面没有有关SD卡的驱动程序,我又下载了STM32F10x_StdPeriph_Lib_V3.5.0的版本里面提供了sd卡驱动函数。
复制内容到剪贴板   
[*]void SD_SPI_Init(void)   
[*]{   
[*]  GPIO_InitTypeDef  GPIO_InitStructure;   
[*]  SPI_InitTypeDef   SPI_InitStructure;   
[*]    
[*]  /*!< 初始化SD卡使用的IO端口的时钟 */   
[*]  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB , ENABLE);   
[*]    
[*]  /*!< SD_SPI 外设时钟使能 */   
[*]  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);    
[*]    
[*]  /*!< 配置SD_SPI 管脚: SCK */   
[*]  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;


再利用 http://bbs.eeworld.com.cn/images/attachicons/common.gif stm32_eval_spi_sd.c (24.77 KB) 
http://bbs.eeworld.com.cn/images/attachicons/common.gif stm32_eval_spi_sd.h (9.79 KB) 这两个文件里的其他函数来初始化SD卡(8G)
发下
复制内容到剪贴板   
[*]SD_Error SD_GoIdleState(void)   
[*]{   
[*]  /*!< SD chip select low */   
[*]  SD_CS_LOW();   
[*]     
[*]  /*!< Send CMD0 (SD_CMD_GO_IDLE_STATE) to put SD in SPI mode */   
[*]  SD_SendCmd(SD_CMD_GO_IDLE_STATE, 0, 0x95);
       
[*]  
       
[*]  /*!< Wait for In Idle State Response (R1 Format) equal to 0x01 */
       
[*]  if (SD_GetResponse(SD_IN_IDLE_STATE))
       
[*]  {
       
[*]    /*!< No Idle State Response: return response failue */
       
[*]    return SD_RESPONSE_FAILURE;
       
[*]  }   
[*]  /*----------Activates the card initialization process-----------*/   
[*]  do   
[*]  {   
[*]    /*!< SD chip select high */   
[*]    SD_CS_HIGH();   
[*]       
[*]    /*!< Send Dummy byte 0xFF */   
[*]    SD_WriteByte(SD_DUMMY_BYTE);   
[*]       
[*]    /*!< SD chip select low */   
[*]    SD_CS_LOW();   
[*]       
[*]    /*!< Send CMD1 (Activates the card process) until response equal to 0x0 */   
[*]    SD_SendCmd(SD_CMD_SEND_OP_COND, 0, 0xFF);   
[*]    /*!< Wait for no error Response (R1 Format) equal to 0x00 */   
[*]  }   
[*]  while (SD_GetResponse(SD_RESPONSE_NO_ERROR));   
[*]     
[*]  /*!< SD chip select high */   
[*]  SD_CS_HIGH();   
[*]     
[*]  /*!< Send dummy byte 0xFF */   
[*]  SD_WriteByte(SD_DUMMY_BYTE);   
[*]     
[*]  return SD_RESPONSE_NO_ERROR;   
[*]}


发现发送SD_SendCmd(SD_CMD_GO_IDLE_STATE, 0, 0x95);SD没响应,进入不了 Idle State。是不是程序不兼容?我看差不多的啊(我用其他stm32开发板SDIO方法可以驱动SD卡)由于STM32F03没有SDIO借口,所以只能使用SPI模式。问一下大家怎么弄的?

 

发表于 2013-11-26 11:39:04

RE:请教!STM32F03DISCOVERY 调试SPI模式SD卡初始化失败

SPI初始化了吗?用示波器检测一下SPI是否有数据发送出去。

qinkaiabc 发表于 2013-11-27 18:44:36

回复:请教!STM32F03DISCOVERY 调试SPI模式SD卡初始化失败

<div style="padding:5px;border:1px dashed #ccc;">回复第 2 楼 于2013-11-26 11:39:04发表:
SPI初始化了吗?用示波器检测一下SPI是否有数据发送出去。
 
 
*            SD_CS   ->     PB12
*            SD_SCK   ->    PB13
*            SD_MISO  ->    PB14
*            SD_MOSI  ->    PB15
 
//头文件定义
/**
  * @brief  SD SPI Interface pins
  */
#define SD_SPI                           SPI2
#define SD_SPI_CLK                       RCC_APB1Periph_SPI2
#define SD_SPI_SCK_PIN                   GPIO_Pin_13                 /* PB.13 */
#define SD_SPI_SCK_GPIO_PORT             GPIOB                       /* GPIOB */
#define SD_SPI_SCK_GPIO_CLK              RCC_AHBPeriph_GPIOB
#define SD_SPI_SCK_SOURCE                GPIO_PinSource13
#define SD_SPI_SCK_AF                    GPIO_AF_0
 #define SD_SPI_MISO_PIN                 GPIO_Pin_14                  /* PB.14 */
 #define SD_SPI_MISO_GPIO_PORT           GPIOB                       /* GPIOB */
 #define SD_SPI_MISO_GPIO_CLK            RCC_AHBPeriph_GPIOB
 #define SD_SPI_MISO_SOURCE              GPIO_PinSource14
 #define SD_SPI_MISO_AF                  GPIO_AF_0
#define SD_SPI_MOSI_PIN                  GPIO_Pin_15                  /* PB.15 */
#define SD_SPI_MOSI_GPIO_PORT            GPIOB                      /* GPIOB */
#define SD_SPI_MOSI_GPIO_CLK             RCC_AHBPeriph_GPIOB
#define SD_SPI_MOSI_SOURCE               GPIO_PinSource15
#define SD_SPI_MOSI_AF                   GPIO_AF_0
#define SD_CS_PIN                        GPIO_Pin_12                  /* PB.12 */
#define SD_CS_GPIO_PORT                  GPIOB                       /* GPIOB*/
#define SD_CS_GPIO_CLK                   RCC_AHBPeriph_GPIOB
 
//硬件底层初始化
void SD_SPI_Init(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
  SPI_InitTypeDef   SPI_InitStructure;
 
  /*!< 初始化SD卡使用的IO端口的时钟 */
  RCC_AHBPeriphClockCmd(SD_CS_GPIO_CLK | SD_SPI_MOSI_GPIO_CLK | SD_SPI_MISO_GPIO_CLK |
                        SD_SPI_SCK_GPIO_CLK , ENABLE);
 
  /*!< SD_SPI 外设时钟使能 */
  RCC_APB1PeriphClockCmd(SD_SPI_CLK, ENABLE); 
 
  /*!< 配置SD_SPI 管脚: SCK */
  GPIO_InitStructure.GPIO_Pin = SD_SPI_SCK_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
  GPIO_Init(SD_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);
       
  /*!< 配置 SD_SPI 管脚: MOSI */
  GPIO_InitStructure.GPIO_Pin = SD_SPI_MOSI_PIN;
  GPIO_Init(SD_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);
       
  /*!< 配置 SD_SPI 管脚: MISO */
  GPIO_InitStructure.GPIO_Pin = SD_SPI_MISO_PIN;
  GPIO_Init(SD_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);
 
 <span style="color: rgb(255, 0, 0);"> /*!

fengye5340 发表于 2013-11-29 16:13:07

回复:请教!STM32F03DISCOVERY 调试SPI模式SD卡初始化失败

<div style="padding:5px;border:1px dashed #ccc;">回复第 3 楼 于2013-11-27 18:44:36发表:
<div style="padding:5px;border:1px dashed #ccc;">回复第 2 楼 于2013-11-26 11:39:04发表:
SPI初始化了吗?用示波器检测一下SPI是否有数据发送出去。
 
 
*            SD_CS   ->     PB12
*            SD_SCK   ->    PB13
*            SD_MISO  ->    PB14
*            SD_MOSI  ->    PB15
 
//头文件定义
/**
  * @brief  SD SPI Interface pins
  */
#define SD_SPI                           SPI2
#define SD_SPI_CLK                       RCC_APB1Periph_SPI2
#define SD_SPI_SCK_PIN                   GPIO_Pin_13                 /* PB.13 */
#define SD_SPI_SCK_GPIO_PORT             GPIOB                       /* GPIOB */
#define SD_SPI_SCK_GPIO_CLK              RCC_AHBPeriph_GPIOB
#define SD_SPI_SCK_SOURCE                GPIO_PinSource13
#define SD_SPI_SCK_AF                    GPIO_AF_0
 #define SD_SPI_MISO_PIN                 GPIO_Pin_14                  /* PB.14 */
 #define SD_SPI_MISO_GPIO_PORT           GPIOB                       /* GPIOB */
 #define SD_SPI_MISO_GPIO_CLK            RCC_AHBPeriph_GPIOB
 #define SD_SPI_MISO_SOURCE              GPIO_PinSource14
 #define SD_SPI_MISO_AF                  GPIO_AF_0
#define SD_SPI_MOSI_PIN                  GPIO_Pin_15                  /* PB.15 */
#define SD_SPI_MOSI_GPIO_PORT            GPIOB                      /* GPIOB */
#define SD_SPI_MOSI_GPIO_CLK             RCC_AHBPeriph_GPIOB
#define SD_SPI_MOSI_SOURCE               GPIO_PinSource15
#define SD_SPI_MOSI_AF                   GPIO_AF_0
#define SD_CS_PIN                        GPIO_Pin_12                  /* PB.12 */
#define SD_CS_GPIO_PORT                  GPIOB                       /* GPIOB*/
#define SD_CS_GPIO_CLK                   RCC_AHBPeriph_GPIOB
 
//硬件底层初始化
void SD_SPI_Init(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
  SPI_InitTypeDef   SPI_InitStructure;
 
  /*!< 初始化SD卡使用的IO端口的时钟 */
  RCC_AHBPeriphClockCmd(SD_CS_GPIO_CLK | SD_SPI_MOSI_GPIO_CLK | SD_SPI_MISO_GPIO_CLK |
                        SD_SPI_SCK_GPIO_CLK , ENABLE);
 
  /*!< SD_SPI 外设时钟使能 */
  RCC_APB1PeriphClockCmd(SD_SPI_CLK, ENABLE); 
 
  /*!< 配置SD_SPI 管脚: SCK */
  GPIO_InitStructure.GPIO_Pin = SD_SPI_SCK_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
  GPIO_Init(SD_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);
       
  /*!< 配置 SD_SPI 管脚: MOSI */
  GPIO_InitStructure.GPIO_Pin = SD_SPI_MOSI_PIN;
  GPIO_Init(SD_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);
       
  /*!< 配置 SD_SPI 管脚: MISO */
  GPIO_InitStructure.GPIO_Pin = SD_SPI_MISO_PIN;
  GPIO_Init(SD_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);
 
 <span style="color: rgb(255, 0, 0);"> /*!

勒布朗 发表于 2013-11-29 21:27:24

RE:请教!STM32F03DISCOVERY 调试SPI模式SD卡初始化失败

1确保硬件电路没问题。2示波器检查SPI

dzc2001 发表于 2013-11-30 17:46:44

RE:请教!STM32F03DISCOVERY 调试SPI模式SD卡初始化失败

这两个mcu不同,spi操作的时序可能也有变化,找个逻辑分析仪看看,能看出来

wkuang 发表于 2013-12-1 23:03:34

RE:请教!STM32F03DISCOVERY 调试SPI模式SD卡初始化失败

1、检查SPI硬件管教,看看IO始终是否打开,IO复用是否正确。
2、如果硬件SPI不得行,可以试试软件SPI,用高低电平模拟SPI,看看软件SPI是否OK。   我怀疑是SPI或者端口复用的始终未打开,导致端口没有输出电平序列。

先试试软件SPI吧

fengye5340 发表于 2013-12-2 10:52:27

RE:请教!STM32F03DISCOVERY 调试SPI模式SD卡初始化失败

1、这句话不能注释掉 SPI_RxFIFOThresholdConfig(SD_SPI, SPI_RxFIFOThreshold_QF);
   2、其他的SPI方式配置都没问题的。
   3、如果有问题,给MCK MOSI MISO CS都增加10K的上拉电阻吧

feiante-155820 发表于 2013-12-14 20:39:28

RE:请教!STM32F03DISCOVERY 调试SPI模式SD卡初始化失败

F030芯片的SPI作了改进,有2个FIFO了,和F103不一样,看看你的问题是不是这个原因。
页: [1]
查看完整版本: 请教!STM32F03DISCOVERY 调试SPI模式SD卡初始化失败