- /****************************************
- *函数名称:SD_Initialize
- *输 入:无
- *输 出:0 -成功
- 其他 -失败
- *功 能:SD 卡初始化
- ******************************************/
- UINT8 SD_Initialize(VOID)
- {
- UINT8 r1; // 存放 SD 卡的返回值
- UINT16 retry; // 用来进行超时计数
- UINT8 buf[4];
- UINT32 i;
- /* 初始化 IO */
- SD_SPI_Init();
- /* 设置到低速模式 */
- SD_SPI_SpeedLow();
- for(i=0;i<10;i++)
- {
- /* 发送最少 74 个时钟 */
- SD_SPI_ReadWriteByte(0XFF);
- }
- retry=20;
- do
- {
- /* 进入 IDLE 状态 */
- r1=SD_SendCmd(CMD0,0,0x95);
- }while((r1!=0X01) && retry--);
- /* 默认无卡 */
- SD_Type=0;
- if(r1==0X01)
- {
- if(SD_SendCmd(CMD8,0x1AA,0x87)==1)//SD V2.0
- {
- for(i=0;i<4;i++)
- {
- /* 等待应答 */
- buf[i]=SD_SPI_ReadWriteByte(0XFF);
- }
- /* 卡是否支持 2.7~3.6V */
- if(buf[2]==0X01&&buf[3]==0XAA)
- {
- retry=0XFFFE;
- do
- {
- /* 发送 CMD55 */
- SD_SendCmd(CMD55,0,0X01);
- /* 发送 CMD41 */
- r1=SD_SendCmd(CMD41,0x40000000,0X01);
- }while(r1&&retry--);
- /* 鉴别 SD2.0 卡版本开始 */
- if(retry&&SD_SendCmd(CMD58,0,0X01)==0)
- {
- for(i=0;i<4;i++)
- {
- /* 得到 OCR 值 */
- buf[i]=SD_SPI_ReadWriteByte(0XFF);
- }
- /* 检查 CCS */
- if(buf[0]&0x40)SD_Type=SD_TYPE_V2HC;
- else SD_Type=SD_TYPE_V2;
- }
- }
- }
- else//SD V1.x/ MMC V3
- {
- /* 发送 CMD55 */
- SD_SendCmd(CMD55,0,0X01);
- /* 发送 CMD41 */
- r1=SD_SendCmd(CMD41,0,0X01);
- if(r1<=1)
- {
- SD_Type=SD_TYPE_V1;
- retry=0XFFFE;
- do //等待退出 IDLE 模式
- {
- /* 发送 CMD55 */
- SD_SendCmd(CMD55,0,0X01);
- /* 发送 CMD41 */
- r1=SD_SendCmd(CMD41,0,0X01);
- }while(r1&&retry--);
- }
- else//MMC 卡不支持 CMD55+CMD41 识别
- {
- /* MMC V3 */
- SD_Type=SD_TYPE_MMC;
- retry=0XFFFE;
- /* 等待退出 IDLE 模式 */
- do
- {
- /* 发送 CMD1 */
- r1=SD_SendCmd(CMD1,0,0X01);
- }while(r1&&retry--);
- }
- if(retry==0||SD_SendCmd(CMD16,512,0X01)!=0)
- {
- /* 错误的卡 */
- SD_Type=SD_TYPE_ERR;
- }
- }
- }
- /* 取消片选 */
- SD_DisSelect();
- /* 高速 */
- SD_SPI_SpeedHigh();
- if(SD_Type)return 0;
- if(r1) return r1;
- /* 其他错误 */
- return 0xAA;
- }
|