打印

ARM LPC2368 SD卡驱动

[复制链接]
1875|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wsinter|  楼主 | 2011-4-17 19:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
wsinter|  楼主 | 2011-4-18 08:57 | 只看该作者
状态寄存器总是显示超时
uint32 MCI_Send_ACMD( void )
{
  uint8 i, retryCount;
  uint32 CmdArgument;
  uint32 respStatus;
  uint32 respValue[4];

  if ( MCI_CardType == SD_CARD )
  {
        CmdArgument = CardRCA;        /* Use the address from SET_RELATIVE_ADDR cmd */
  }
  else                        /* if MMC or unknown card type, use 0x0. */
{
        CmdArgument = 0x00000000;
  }
  retryCount = 20;
  while ( retryCount > 0 )
  {
                MCI_SendCmd( APP_CMD, CmdArgument, EXPECT_SHORT_RESP, 0 );
        respStatus = MCI_GetCmdResp( APP_CMD, EXPECT_SHORT_RESP, (uint32 *)&respValue[0] );
        if ( !respStatus && (respValue[0] & CARD_STATUS_ACMD_ENABLE) )                {
          return( TRUE );
        }
        for ( i = 0; i < 0x20; i++ );
        retryCount--;
  }
  return( FALSE );
}
回来的状态respStatus总是超时是为什么啊
uint32 MCI_GetCmdResp( uint8 ExpectCmdData, uint32 ExpectResp, uint32 *CmdResp )
{
  uint32 CmdRespStatus = 0;
  uint32 LastCmdIndex;
  if ( ExpectResp == EXPECT_NO_RESP )
  {
        return ( 0 );
  }

  while ( 1 )
  {
        CmdRespStatus = MCI_STATUS;                           //MCI_STATUS            MCI 状态寄存器
        if ( CmdRespStatus & (MCI_CMD_TIMEOUT) )   //MCI_CMD_TIMEOUT                (1 << 2)
        {
          MCI_CLEAR = CmdRespStatus | MCI_CMD_TIMEOUT;
          MCI_COMMAND = 0;
          MCI_ARGUMENT = 0xFFFFFFFF;
          return ( CmdRespStatus );
        }
        if (  CmdRespStatus & MCI_CMD_CRC_FAIL )                        // MCI_CMD_CRC_FAIL         (1 << 0)
        {
          MCI_CLEAR = CmdRespStatus | MCI_CMD_CRC_FAIL;
          LastCmdIndex = MCI_COMMAND & 0x003F;
          if ( (LastCmdIndex == SEND_OP_COND) || (LastCmdIndex == SEND_APP_OP_COND)   //SEND_OP_COND 1     SEND_APP_OP_COND        41
                        || (LastCmdIndex == STOP_TRANSMISSION) )                                  {
                MCI_COMMAND = 0;
                MCI_ARGUMENT = 0xFFFFFFFF;         
                break;                                                                                  }
          else
          {
                return ( CmdRespStatus );
          }
        }
        else if ( CmdRespStatus & MCI_CMD_RESP_END )            //MCI_CMD_RESP_END        (1 << 6)
        {
          MCI_CLEAR = CmdRespStatus | MCI_CMD_RESP_END;
          break;                }
  }
       
  if ( (MCI_RESP_CMD & 0x3F) != ExpectCmdData )                 //MCI_RESP_CMD 命令响应寄存器
  {
                if ( (ExpectCmdData != SEND_OP_COND) && (ExpectCmdData != SEND_APP_OP_COND)
                && (ExpectCmdData != ALL_SEND_CID) && (ExpectCmdData != SEND_CSD) )
        {
          CmdRespStatus = INVALID_RESPONSE;               
               return ( INVALID_RESPONSE );
        }
  }

  if ( ExpectResp == EXPECT_SHORT_RESP )
  {
        *CmdResp = MCI_RESP0;
  }
  else if ( ExpectResp == EXPECT_LONG_RESP )
  {
        *CmdResp = MCI_RESP0;
        *(CmdResp+1) = MCI_RESP1;
        *(CmdResp+2) = MCI_RESP2;
        *(CmdResp+3) = MCI_RESP3;
  }
  return ( 0 );        }

使用特权

评论回复
板凳
wsinter|  楼主 | 2011-4-18 11:15 | 只看该作者
没人做过吗

使用特权

评论回复
地板
hehu8| | 2012-2-28 18:50 | 只看该作者
下个周立功的驱动就行了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

6

帖子

1

粉丝