|

楼主 |
发表于 2021-4-7 16:15:52
|
显示全部楼层
本帖最后由 chinashaoshu 于 2021-4-7 16:29 编辑
- SD_Error SD_PowerON(void)
- {
- __IO SD_Error errorstatus = SD_OK;
- uint32_t response = 0, count = 0, cnt = 0,validvoltage = 0;
- uint32_t SDType = SD_STD_CAPACITY;
- /*!< Power ON Sequence -----------------------------------------------------*/
- /*!< Set Power State to ON */
- /*!< Enable SDIO Clock */
- /* Required power up waiting time before starting the SD initialization sequence */
- extern void delay_us(uint32_t n);
- delay_us(50);
- __retry://重点是这里***********************
- /*!< CMD0: GO_IDLE_STATE ---------------------------------------------------*/
- /*!< No CMD response required */
- /*!< 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 */
- .....
- if (errorstatus == SD_OK)
- {
- CardType = SDIO_STD_CAPACITY_SD_CARD_V2_0; /*!< SD Card 2.0 */
- SDType = SD_HIGH_CAPACITY;
- /*!< Send ACMD41 SD_APP_OP_COND with Argument 0x80100000 */
- while ((!validvoltage) && (count < SD_MAX_VOLT_TRIAL))
- {
- ....
- }
- if (count >= SD_MAX_VOLT_TRIAL)
- {
- errorstatus = SD_INVALID_VOLTRANGE;
- return(errorstatus);
- }
- if (response &= SD_HIGH_CAPACITY)
- {
- CardType = SDIO_HIGH_CAPACITY_SD_CARD;
- }
- }
- else
- {
- if(cnt++<10) //重点是这里*************
- goto __retry;
-
- CardType = SDIO_STD_CAPACITY_SD_CARD_V1_1;
- SDType = SD_STD_CAPACITY;
- 。。。。。。。。。。。。
- }
- DEBUG_LOG(DEBUG_SD,("retyn times = %d,wait volt times = %d.\n", cnt,count));//打印
- return(errorstatus);
- }
复制代码
我在主机发送CMD8: SEND_IF_COND 查询CMD Response: R7得到的不是SD_OK的情况下 如果不是0,我就让他重复发送CMD0和CMD7,做多10次,如果还不行就放弃。
或者说 CMD8: SEND_IF_COND 连续发送两遍 就没有问题。。。
这样的话,就可以了,且cnt=1,也就是说,基本一次以后,就能识别成功。另外发现两种卡,等待电压就绪的时间不一样。
硬汉老师,我这样处理,有没有可能不按套路来啊,或者可能带来其他问题啊。。。
|
-
-
|