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

请教!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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版