你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
qinkaiabc 提问时间:2013-11-25 21:18 /
 从ST官网下载了STM32F0xx_StdPeriph_Lib_V1.1.0的固件库,发现里面没有有关SD卡的驱动程序,我又下载了STM32F10x_StdPeriph_Lib_V3.5.0的版本里面提供了sd卡驱动函数。
[color=#336699 !important]复制内容到剪贴板
       
  • 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;



再利用  stm32_eval_spi_sd.c (24.77 KB) 
 stm32_eval_spi_sd.h (9.79 KB) 这两个文件里的其他函数来初始化SD卡(8G)
发下
[color=#336699 !important]复制内容到剪贴板
       
  • 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模式。问一下大家怎么弄的?

 
收藏 评论8 发布时间:2013-11-25 21:18

举报

8个回答
废鱼 回答时间: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);"> /*!

STM32F03-SD.zip

下载

2.76 MB, 下载次数: 87

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不一样,看看你的问题是不是这个原因。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版