从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模式。问一下大家怎么弄的?
|
RE:请教!STM32F03DISCOVERY 调试SPI模式SD卡初始化失败
回复:请教!STM32F03DISCOVERY 调试SPI模式SD卡初始化失败
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
2013-11-27 18:44 上传
点击文件名下载附件
2.76 MB, 下载次数: 87
回复:请教!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);"> /*!
RE:请教!STM32F03DISCOVERY 调试SPI模式SD卡初始化失败
RE:请教!STM32F03DISCOVERY 调试SPI模式SD卡初始化失败
RE:请教!STM32F03DISCOVERY 调试SPI模式SD卡初始化失败
2、如果硬件SPI不得行,可以试试软件SPI,用高低电平模拟SPI,看看软件SPI是否OK。 我怀疑是SPI或者端口复用的始终未打开,导致端口没有输出电平序列。
先试试软件SPI吧
RE:请教!STM32F03DISCOVERY 调试SPI模式SD卡初始化失败
2、其他的SPI方式配置都没问题的。
3、如果有问题,给MCK MOSI MISO CS都增加10K的上拉电阻吧
RE:请教!STM32F03DISCOVERY 调试SPI模式SD卡初始化失败