SD卡初始化 有了这些基本知识,下面就讨论下SD卡在SPI模式下的初始化激活过程。 SD卡初始化激活在手册中,激活过程如下图:
第一步,上电,将CS信号拉低,给SD卡发送至少74个时钟周期(发送10个0xFF),让SD卡完成自身检查和初始化,进入空闲状态(IDLE)。之后,对SD卡发送CMD0使其进入SPI模式。不论你是什么卡,SD卡从D_OUT线上的返回值都是一样的,如果是0x01,说明CMD0操作是成功的,此时SD卡还处在IDLE状态。
第二步,发送CMD8命令,上面说过,可以通过CMD8的返回来确定SD卡的版本,如果SD卡对此命令不识别,那么说明你的SD卡的版本是旧的,如果SD卡对CMD8有正确的返回值,那么你的SD卡的硬件层版本是2.0的,支持大容量储存的,属于SDHC卡。
第三步,如果CMD8指令有正确的返回,那么就可以用ACMD41命令将SD卡从IDLE状态切换到读写状态,要发送ACMD41 命令,需要先发送CMD55 命令,如果SD卡能正常切换状态进入读写状态,那么返回的R1类型的值为0x00,如果出现其他值,那么表明切换失败。 SD卡读写未完待续 PS:在STM8L151G6平台上,对SPI的配置会影响通信的数据正确性,如下面的SPI配置(有外接上拉电阻): /*PB5:SPI_CLK*/ GPIO_Init(GPIOB, GPIO_Pin_5, GPIO_Mode_Out_OD_Low_Slow); /*PB6:SPI_MOSI*/ GPIO_Init(GPIOB, GPIO_Pin_6, GPIO_Mode_Out_OD_Low_Slow); //主机模式,配置为输入 GPIO_Init(GPIOB, GPIO_Pin_7, GPIO_Mode_In_FL_No_IT); /* SD_SPI Config */ SPI_Init(SPI1, SPI_FirstBit_MSB, SPI_BaudRatePrescaler_128, SPI_Mode_Master, SPI_CPOL_High, SPI_CPHA_2Edge, SPI_Direction_2Lines_FullDuplex, SPI_NSS_Soft, 0x07); /* SD_SPI enable */ SPI_Cmd(SPI1, ENABLE); SD_WriteReadByte(0xFF);上面的这种配置会导致通信失败,具体体现在CMD8(0x48 0x00 0x00 0x01 0xAA 0x87)的返回上,正确的返回时应是0x01 0x00 0x00 0x01 0xAA,但是在这种配置下返回的是0x01 0x00 0x00 0x01 0xAB,在后面不对了。但是只要把SPI的配置改成下面这种就好了。 /*PB5:SPI_CLK*/ GPIO_Init(GPIOB, GPIO_Pin_5, GPIO_Mode_Out_PP_High_Fast); /*PB6:SPI_MOSI*/ GPIO_Init(GPIOB, GPIO_Pin_6, GPIO_Mode_Out_PP_High_Fast); //主机模式,配置为输入 GPIO_Init(GPIOB, GPIO_Pin_7, GPIO_Mode_In_FL_No_IT); /* SD_SPI Config */ SPI_Init(SPI1, SPI_FirstBit_MSB, SPI_BaudRatePrescaler_128, SPI_Mode_Master, SPI_CPOL_High, SPI_CPHA_2Edge, SPI_Direction_2Lines_FullDuplex, SPI_NSS_Soft, 0x07); /* SD_SPI enable */ SPI_Cmd(SPI1, ENABLE); SD_WriteReadByte(0xFF);目前还没有找到这个问题的原因。 参考资料:
* http://www.tuicool.com/articles/aimqQ3
* http://blog.sina.com.cn/s/blog_4f09c0b50101636h.html
* http://blog.csdn.net/wangwenxue1989/article/details/40889669
* http://blog.csdn.net/u011455056/article/details/13022559
* http://elm-chan.org/docs/mmc/mmc_e.html
* http://comm.chinaaet.com/adi/blogdetail/38988.html
|