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

STM32 SDIO 通信问题

[复制链接]
xufengjuan 提问时间:2011-9-13 17:26 /
我调程序时,CMD0可以正常,但CMD8超时,一般会因为什么原因造成这种情况!请赐教
收藏 评论14 发布时间:2011-9-13 17:26

举报

14个回答
xufengjuan 回答时间:2011-9-14 08:56:31

RE:STM32 SDIO

这是我的部分程序,请大家指教
int main(void)
{
#ifdef DEBUG
  debug();
#endif
   // Interrupt Config
  NVIC_Configuration();
  
  /////////////////////////////////////////////////////////////////////
  //////// SDCARD Initialisation //////////////////////////////////////
  /////////////////Section adapted from ST example/////////////////////
  
  /*-------------------------- SD Init ----------------------------- */
  Status = SD_Init();
  if (Status == SD_OK)
  {
    /*----------------- Read CSD/CID MSD registers ------------------*/
    Status = SD_GetCardInfo(&SDCardInfo);
  }
  
  if (Status == SD_OK)
  {
    /*----------------- Select Card --------------------------------*/
    Status = SD_SelectDeselect((u32) (SDCardInfo.RCA > 31) == 1) ? 1 : 0);
      count++;
    }
    if (count >= SD_MAX_VOLT_TRIAL)
    {
      errorstatus = SD_INVALID_VOLTRANGE;
      return(errorstatus);
    }
    if (response &= SD_HIGH_CAPACITY)
    {
      CardType = SDIO_HIGH_CAPACITY_SD_CARD;
    }
  }/* else MMC Card */
  return(errorstatus);
}

static void GPIO_Configuration(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
  /* Enable the SDIO AHB Clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDIO, ENABLE);
  /* GPIOC and GPIOD Periph clock enable */
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD, ENABLE);
  GPIO_PinAFConfig(GPIOC,GPIO_PinSource8|GPIO_PinSource9|GPIO_PinSource10|GPIO_PinSource11|GPIO_PinSource12,GPIO_AF_SDIO);
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource2,GPIO_AF_SDIO);
  /* Configure PC.08, PC.09, PC.10, PC.11, PC.12 pin: D0, D1, D2, D3, CLK pin */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
  /* Configure PD.02 CMD line */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
}
废鱼 回答时间:2011-9-14 09:54:07

RE:STM32 SDIO

有可能这里没写好,我的试过读几次都是0x01,
1)最好在SPI_ReadWriteByte(crc);之后把这时接受到的垃圾数据取走,因为SPI是双向通信,每一个发送同时都会收到一个数据。
2)最好在CS设置高后发送8一个DUMMY字节。
xufengjuan 回答时间:2011-9-14 11:43:38

回复:STM32 SDIO

回复第 3 楼 于2011-09-14 01:54:07发表:
有可能这里没写好,我的试过读几次都是0x01,
1)最好在SPI_ReadWriteByte(crc);之后把这时接受到的垃圾数据取走,因为SPI是双向通信,每一个发送同时都会收到一个数据。
2)最好在CS设置高后发送8一个DUMMY字节。 

您好!我采用的SDIO方式,程序里没有SPI_ReadWriteByte(crc);这个函数啊,还有程序中没有给CS置高啊
问题幼稚,见谅!
废鱼 回答时间:2011-9-14 14:37:38

RE:STM32 SDIO

下面这段代码,你把CMD8都屏蔽掉了。
/* CMD8: SEND_IF_COND --------------------------------------------------------*/
/* Send CMD8 to verify SD card interface operating condition */
/* Argument: - [31:12]: Reserved (shall be set to '0')
- [11:8]: Supply Voltage (VHS) 0x1 (Range: 2.7-3.6 V)
- [7:0]: Check Pattern (recommended 0xAA) */
/* CMD Response: R7 */
// SDIO_CmdInitStructure.SDIO_Argument = SD_CHECK_PATTERN;
// SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SEND_IF_COND;
// SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
// SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
// SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
// for(;i < 74; i++)
// { }
// SDIO_SendCommand(&SDIO_CmdInitStructure);
// errorstatus = CmdResp7Error(); //errorstatus is SD_CMD_RSP_TIMEOUT
xufengjuan 回答时间:2011-9-14 15:02:49

回复:STM32 SDIO

之前调试时没屏蔽,不好意思,后来想屏蔽下试试,但后面的CMD55还是一样出问题,也是超时,我刚测我的CLK也就是PC12脚没有波形输出,是不是这个问题?怎么解决呢?
1.没屏蔽时CMD8超时
2.SDIO_CLK没时钟输出
xufengjuan 回答时间:2011-9-14 15:07:30

回复:STM32 SDIO

回复第 5 楼 于2011-09-14 06:37:38发表:
下面这段代码,你把CMD8都屏蔽掉了。
/* CMD8: SEND_IF_COND --------------------------------------------------------*/
/* Send CMD8 to verify SD card interface operating condition */
/* Argument: - [31:12]: Reserved (shall be set to '0')
- [11:8]: Supply Voltage (VHS) 0x1 (Range: 2.7-3.6 V)
- [7:0]: Check Pattern (recommended 0xAA) */
/* CMD Response: R7 */
// SDIO_CmdInitStructure.SDIO_Argument = SD_CHECK_PATTERN;
// SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SEND_IF_COND;
// SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
// SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
// SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
// for(;i < 74; i++)
// { }
// SDIO_SendCommand(&SDIO_CmdInitStructure);
// errorstatus = CmdResp7Error(); //errorstatus is SD_CMD_RSP_TIMEOUT
 

之前调试时没屏蔽,不好意思,后来想屏蔽下试试,但后面的CMD55还是一样出问题,也是超时,我刚测我的CLK也就是PC12脚没有波形输出,是不是这个问题?怎么解决呢?
1.没屏蔽时CMD8超时
2.SDIO_CLK没时钟输出
废鱼 回答时间:2011-9-14 16:08:15

RE:STM32 SDIO

没有开启SDIO的时钟。你开启试试。
RCC_AHBPeriphClockCmd(RCC_RCC_AHBPeriph_SDIO, ENABLE);
废鱼 回答时间:2011-9-14 16:09:40

RE:STM32 SDIO

CMD0只是复位SD卡,而并不是通信。所以这个问题还是通信的问题。
xufengjuan 回答时间:2011-9-14 16:54:49

回复:STM32 SDIO

回复第 9 楼 于2011-09-14 08:09:40发表:
CMD0只是复位SD卡,而并不是通信。所以这个问题还是通信的问题。 

我用的是207的板子,RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDIO, ENABLE);开时钟,可为什么打不开呢?
 
xufengjuan 回答时间:2011-9-15 09:59:06

回复:STM32 SDIO 通信问题

回复第 10 楼 于2011-09-14 08:54:49发表:
回复第 9 楼 于2011-09-14 08:09:40发表:
CMD0只是复位SD卡,而并不是通信。所以这个问题还是通信的问题。 

我用的是207的板子,RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDIO, ENABLE);开时钟,可为什么打不开呢?
 
 

问题解决了,是引脚复用的问题。感谢!
qqatscau-366093 回答时间:2012-9-5 18:00:02

RE:STM32 SDIO 通信问题

MARK。。。。。
heishadow 回答时间:2013-6-27 16:42:50

RE:STM32 SDIO 通信问题

您好:
我用STM32F4时也遇到和您相同的问题,但我应该不是引脚复用的问题(SDIO和USART4/USART5复用),我在初始化IO时就已经复用了:
GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_SDIO);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_SDIO);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_SDIO);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_SDIO);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_SDIO);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource2, GPIO_AF_SDIO);
现在执行到:
SDIO_CmdInitStructure.SDIO_Argument = SD_CHECK_PATTERN;
SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SEND_IF_COND;
SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
delay_us(100);
SDIO_SendCommand(&SDIO_CmdInitStructure);
errorstatus = CmdResp7Error();
一直超时,请指教!
lukeydou 回答时间:2014-1-3 10:53:35

回复:STM32 SDIO 通信问题

你好,请问你的问题解决了么,我也遇到类似的问题,我用的是103系列的,我在写CMD8后也一直收不到回应命令,总是提示CMDSTAT: error CMDTIMEOUT的超时错误!
lukeydou 回答时间:2014-1-3 10:54:52

RE:STM32 SDIO 通信问题

检查过,clk时钟是有了,管脚复用的问题也不存在,还有可能是哪些原因造成的呢?

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版