ARM LPC2368 SD卡驱动

[复制链接]
 楼主| wsinter 发表于 2011-4-17 19:53 | 显示全部楼层 |阅读模式
初始化时 为什么我在发送CMD55 APP_CMD时候总是SD卡没有响应呢
 楼主| wsinter 发表于 2011-4-18 08:57 | 显示全部楼层
状态寄存器总是显示超时
  1. uint32 MCI_Send_ACMD( void )
  2. {
  3.   uint8 i, retryCount;
  4.   uint32 CmdArgument;
  5.   uint32 respStatus;
  6.   uint32 respValue[4];

  7.   if ( MCI_CardType == SD_CARD )
  8.   {
  9.         CmdArgument = CardRCA;        /* Use the address from SET_RELATIVE_ADDR cmd */
  10.   }
  11.   else                        /* if MMC or unknown card type, use 0x0. */
  12. {
  13.         CmdArgument = 0x00000000;
  14.   }
  15.   retryCount = 20;
  16.   while ( retryCount > 0 )
  17.   {
  18.                 MCI_SendCmd( APP_CMD, CmdArgument, EXPECT_SHORT_RESP, 0 );
  19.         respStatus = MCI_GetCmdResp( APP_CMD, EXPECT_SHORT_RESP, (uint32 *)&respValue[0] );
  20.         if ( !respStatus && (respValue[0] & CARD_STATUS_ACMD_ENABLE) )                {
  21.           return( TRUE );
  22.         }
  23.         for ( i = 0; i < 0x20; i++ );
  24.         retryCount--;
  25.   }
  26.   return( FALSE );
  27. }
回来的状态respStatus总是超时是为什么啊
  1. uint32 MCI_GetCmdResp( uint8 ExpectCmdData, uint32 ExpectResp, uint32 *CmdResp )
  2. {
  3.   uint32 CmdRespStatus = 0;
  4.   uint32 LastCmdIndex;
  5.   if ( ExpectResp == EXPECT_NO_RESP )
  6.   {
  7.         return ( 0 );
  8.   }

  9.   while ( 1 )
  10.   {
  11.         CmdRespStatus = MCI_STATUS;                           //MCI_STATUS            MCI 状态寄存器
  12.         if ( CmdRespStatus & (MCI_CMD_TIMEOUT) )   //MCI_CMD_TIMEOUT                (1 << 2)
  13.         {
  14.           MCI_CLEAR = CmdRespStatus | MCI_CMD_TIMEOUT;
  15.           MCI_COMMAND = 0;
  16.           MCI_ARGUMENT = 0xFFFFFFFF;
  17.           return ( CmdRespStatus );
  18.         }
  19.         if (  CmdRespStatus & MCI_CMD_CRC_FAIL )                        // MCI_CMD_CRC_FAIL         (1 << 0)
  20.         {
  21.           MCI_CLEAR = CmdRespStatus | MCI_CMD_CRC_FAIL;
  22.           LastCmdIndex = MCI_COMMAND & 0x003F;
  23.           if ( (LastCmdIndex == SEND_OP_COND) || (LastCmdIndex == SEND_APP_OP_COND)   //SEND_OP_COND 1     SEND_APP_OP_COND        41
  24.                         || (LastCmdIndex == STOP_TRANSMISSION) )                                  {
  25.                 MCI_COMMAND = 0;
  26.                 MCI_ARGUMENT = 0xFFFFFFFF;         
  27.                 break;                                                                                  }
  28.           else
  29.           {
  30.                 return ( CmdRespStatus );
  31.           }
  32.         }
  33.         else if ( CmdRespStatus & MCI_CMD_RESP_END )            //MCI_CMD_RESP_END        (1 << 6)
  34.         {
  35.           MCI_CLEAR = CmdRespStatus | MCI_CMD_RESP_END;
  36.           break;                }
  37.   }
  38.        
  39.   if ( (MCI_RESP_CMD & 0x3F) != ExpectCmdData )                 //MCI_RESP_CMD 命令响应寄存器
  40.   {
  41.                 if ( (ExpectCmdData != SEND_OP_COND) && (ExpectCmdData != SEND_APP_OP_COND)
  42.                 && (ExpectCmdData != ALL_SEND_CID) && (ExpectCmdData != SEND_CSD) )
  43.         {
  44.           CmdRespStatus = INVALID_RESPONSE;               
  45.                return ( INVALID_RESPONSE );
  46.         }
  47.   }

  48.   if ( ExpectResp == EXPECT_SHORT_RESP )
  49.   {
  50.         *CmdResp = MCI_RESP0;
  51.   }
  52.   else if ( ExpectResp == EXPECT_LONG_RESP )
  53.   {
  54.         *CmdResp = MCI_RESP0;
  55.         *(CmdResp+1) = MCI_RESP1;
  56.         *(CmdResp+2) = MCI_RESP2;
  57.         *(CmdResp+3) = MCI_RESP3;
  58.   }
  59.   return ( 0 );        }
 楼主| wsinter 发表于 2011-4-18 11:15 | 显示全部楼层
没人做过吗
hehu8 发表于 2012-2-28 18:50 | 显示全部楼层
下个周立功的驱动就行了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

6

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

0

主题

6

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部