OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 940|回复: 0

STM32H743核心板摄像头与SD卡共用故障

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2022-9-6
在线时间
3 小时
发表于 2024-1-28 22:09:31 | 显示全部楼层 |阅读模式
1金钱
原子哥,我现在有个项目需要用到STM32H743核心板,外挂OV5640摄像头和SD卡,我使用开发板调试的时候,摄像头和SD卡按照例子复用,但是SD卡初始化正常,但是挂载失败,程序会卡死在读块里面出不来。
SD_Error SD_ReadBlocks(u8 *buf, long long addr, u16 blksize, u32 nblks)
{
        SD_Error errorstatus = SD_OK;
        u32 count = 0;
        u32 timeout = SDMMC_DATATIMEOUT;
        u32 *tempbuff = (u32 *)buf;                           // ת»»Îªu32Ö¸Õë
        SDMMC1->DCTRL = 0x0;                                   // Êý¾Ý¿ØÖƼĴæÆ÷ÇåÁã(¹ØDMA)
        if (CardType == HIGH_CAPACITY_SD_CARD) // ´óÈÝÁ¿¿¨
        {
                blksize = 512;
                addr >>= 9;
        }
        SDMMC_Send_Cmd(SD_CMD_SET_BLOCKLEN, 1, blksize);  // ·¢ËÍCMD16+ÉèÖÃÊý¾Ý³¤¶ÈΪblksize,¶ÌÏìÓ¦
        errorstatus = CmdResp1Error(SD_CMD_SET_BLOCKLEN); // µÈ´ýR1ÏìÓ¦
        if (errorstatus != SD_OK)
        {
                log_printf("SDMMC_Send_Cmd=%d\r\n", errorstatus);
                return errorstatus; // ÏìÓ¦´íÎó
        }
        SDMMC_Send_Data_Cfg(SD_DATATIMEOUT, nblks * blksize, 9, 1); // nblks*blksize,¿é´óСºãΪ512,¿¨µ½¿ØÖÆÆ÷
        SDMMC1->CMD |= 1 << 6;                                                                                // CMDTRANS=1,&#178;ú&#201;ú&#210;&#187;&#184;&#246;&#202;&#253;&#190;&#221;&#180;&#171;&#202;&#228;&#195;ü&#193;&#238;
        if (nblks > 1)                                                                                                // &#182;à&#191;é&#182;&#193;
        {
                SDMMC_Send_Cmd(SD_CMD_READ_MULT_BLOCK, 1, addr);         // ·&#162;&#203;&#205;CMD18+&#180;&#211;addr&#181;&#216;&#214;·&#179;&#246;&#182;&#193;&#200;&#161;&#202;&#253;&#190;&#221;,&#182;&#204;&#207;ì&#211;&#166;
                errorstatus = CmdResp1Error(SD_CMD_READ_MULT_BLOCK); // &#181;&#200;&#180;&#253;R1&#207;ì&#211;&#166;
                if (errorstatus != SD_OK)
                {
                        printf("SD_CMD_READ_MULT_BLOCK Error\r\n");
                        return errorstatus; // &#207;ì&#211;&#166;&#180;í&#206;ó
                }
        }
        else // &#181;&#165;&#191;é&#182;&#193;
        {
                SDMMC_Send_Cmd(SD_CMD_READ_SINGLE_BLOCK, 1, addr);           // ·&#162;&#203;&#205;CMD17+&#180;&#211;addr&#181;&#216;&#214;·&#179;&#246;&#182;&#193;&#200;&#161;&#202;&#253;&#190;&#221;,&#182;&#204;&#207;ì&#211;&#166;
                errorstatus = CmdResp1Error(SD_CMD_READ_SINGLE_BLOCK); // &#181;&#200;&#180;&#253;R1&#207;ì&#211;&#166;
                if (errorstatus != SD_OK)
                        return errorstatus; // &#207;ì&#211;&#166;&#180;í&#206;ó
        }
        INTX_DISABLE();                                                                                                                 // &#185;&#216;±&#213;×&#220;&#214;&#208;&#182;&#207;(POLLING&#196;&#163;&#202;&#189;,&#209;&#207;&#189;&#251;&#214;&#208;&#182;&#207;&#180;ò&#182;&#207;SDMMC&#182;&#193;&#208;&#180;&#178;&#217;×÷!!!)
        while (!(SDMMC1->STA & ((1 << 5) | (1 << 1) | (1 << 3) | (1 << 8)))) // &#206;&#222;&#201;&#207;&#210;&#231;/CRC/&#179;&#172;&#202;±/&#205;ê&#179;&#201;(±ê&#214;&#190;)
        {
                if (SDMMC1->STA & (1 << 15)) // &#189;&#211;&#202;&#213;&#199;&#248;°&#235;&#194;ú,±í&#202;&#190;&#214;&#193;&#201;&#217;&#180;&#230;&#193;&#203;8&#184;&#246;×&#214;
                {
                        for (count = 0; count < 8; count++) // &#209;&#173;&#187;·&#182;&#193;&#200;&#161;&#202;&#253;&#190;&#221;
                        {
                                *(tempbuff + count) = SDMMC1->FIFO;
                        }
                        tempbuff += 8;
                        timeout = 0X7FFFFF; // &#182;&#193;&#202;&#253;&#190;&#221;&#210;&#231;&#179;&#246;&#202;±&#188;&#228;
                }
                else // &#180;&#166;&#192;í&#179;&#172;&#202;±
                {
                        if (timeout == 0)
                                return SD_DATA_TIMEOUT;
                        timeout--;
                }
        }
        SDMMC1->CMD &= ~(1 << 6);        // CMDTRANS=0,&#189;á&#202;&#248;&#202;&#253;&#190;&#221;&#180;&#171;&#202;&#228;
        INTX_ENABLE();                                // &#191;&#170;&#198;&#244;×&#220;&#214;&#208;&#182;&#207;
        if (SDMMC1->STA & (1 << 3)) // &#202;&#253;&#190;&#221;&#179;&#172;&#202;±&#180;í&#206;ó
        {
                SDMMC1->ICR |= 1 << 3; // &#199;&#229;&#180;í&#206;ó±ê&#214;&#190;
                return SD_DATA_TIMEOUT;
        }
        else if (SDMMC1->STA & (1 << 1)) // &#202;&#253;&#190;&#221;&#191;éCRC&#180;í&#206;ó
        {
                SDMMC1->ICR |= 1 << 1; // &#199;&#229;&#180;í&#206;ó±ê&#214;&#190;
                if (nblks > 1)                   // &#213;&#235;&#182;&#212;&#191;&#201;&#196;&#220;&#179;&#246;&#207;&#214;&#181;&#196;CRC&#180;í&#206;ó,&#200;&#231;&#185;&#251;&#202;&#199;&#182;à&#191;é&#182;&#193;&#200;&#161;,±&#216;&#208;&#235;·&#162;&#203;&#205;&#189;á&#202;&#248;&#180;&#171;&#202;&#228;&#195;ü&#193;&#238;!
                {
                        SDMMC_Send_Cmd(SD_CMD_STOP_TRANSMISSION, 1, 0);                   // ·&#162;&#203;&#205;CMD12+&#189;á&#202;&#248;&#180;&#171;&#202;&#228;
                        errorstatus = CmdResp1Error(SD_CMD_STOP_TRANSMISSION); // &#181;&#200;&#180;&#253;R1&#207;ì&#211;&#166;
                }
                return SD_DATA_CRC_FAIL;
        }
        else if (SDMMC1->STA & (1 << 5)) // &#189;&#211;&#202;&#213;fifo&#201;&#207;&#210;&#231;&#180;í&#206;ó
        {
                SDMMC1->ICR |= 1 << 5; // &#199;&#229;&#180;í&#206;ó±ê&#214;&#190;
                return SD_RX_OVERRUN;
        }
        if ((SDMMC1->STA & (1 << 8)) && (nblks > 1)) // &#182;à&#191;é&#189;&#211;&#202;&#213;&#189;á&#202;&#248;,·&#162;&#203;&#205;&#189;á&#202;&#248;&#214;&#184;&#193;&#238;
        {
                if ((STD_CAPACITY_SD_CARD_V1_1 == CardType) || (STD_CAPACITY_SD_CARD_V2_0 == CardType) || (HIGH_CAPACITY_SD_CARD == CardType))
                {
                        SDMMC_Send_Cmd(SD_CMD_STOP_TRANSMISSION, 1, 0);                   // ·&#162;&#203;&#205;CMD12+&#189;á&#202;&#248;&#180;&#171;&#202;&#228;
                        errorstatus = CmdResp1Error(SD_CMD_STOP_TRANSMISSION); // &#181;&#200;&#180;&#253;R1&#207;ì&#211;&#166;
                        if (errorstatus != SD_OK)
                                return errorstatus;
                }
        }
        SDMMC1->ICR = 0X1FE00FFF; // &#199;&#229;&#179;&#253;&#203;ù&#211;&#208;±ê&#188;&#199;
        return errorstatus;
}

程序会死在while (!(SDMMC1->STA & ((1 << 5) | (1 << 1) | (1 << 3) | (1 << 8)))) 这个循环里面,永远出不来

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 21:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表