新手入门
- 积分
- 11
- 金钱
- 11
- 注册时间
- 2022-9-6
- 在线时间
- 3 小时
|
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,²úÉúÒ»¸öÊý¾Ý´«ÊäÃüÁî
if (nblks > 1) // ¶à¿é¶Á
{
SDMMC_Send_Cmd(SD_CMD_READ_MULT_BLOCK, 1, addr); // ·¢ËÍCMD18+´ÓaddrµØÖ·³ö¶ÁÈ¡Êý¾Ý,¶ÌÏìÓ¦
errorstatus = CmdResp1Error(SD_CMD_READ_MULT_BLOCK); // µÈ´ýR1ÏìÓ¦
if (errorstatus != SD_OK)
{
printf("SD_CMD_READ_MULT_BLOCK Error\r\n");
return errorstatus; // ÏìÓ¦´íÎó
}
}
else // µ¥¿é¶Á
{
SDMMC_Send_Cmd(SD_CMD_READ_SINGLE_BLOCK, 1, addr); // ·¢ËÍCMD17+´ÓaddrµØÖ·³ö¶ÁÈ¡Êý¾Ý,¶ÌÏìÓ¦
errorstatus = CmdResp1Error(SD_CMD_READ_SINGLE_BLOCK); // µÈ´ýR1ÏìÓ¦
if (errorstatus != SD_OK)
return errorstatus; // ÏìÓ¦´íÎó
}
INTX_DISABLE(); // ¹Ø±Õ×ÜÖжÏ(POLLINGģʽ,ÑϽûÖжϴò¶ÏSDMMC¶Áд²Ù×÷!!!)
while (!(SDMMC1->STA & ((1 << 5) | (1 << 1) | (1 << 3) | (1 << 8)))) // ÎÞÉÏÒç/CRC/³¬Ê±/Íê³É(±êÖ¾)
{
if (SDMMC1->STA & (1 << 15)) // ½ÓÊÕÇø°ëÂú,±íʾÖÁÉÙ´æÁË8¸ö×Ö
{
for (count = 0; count < 8; count++) // Ñ­»·¶ÁÈ¡Êý¾Ý
{
*(tempbuff + count) = SDMMC1->FIFO;
}
tempbuff += 8;
timeout = 0X7FFFFF; // ¶ÁÊý¾ÝÒç³öʱ¼ä
}
else // ´¦Àí³¬Ê±
{
if (timeout == 0)
return SD_DATA_TIMEOUT;
timeout--;
}
}
SDMMC1->CMD &= ~(1 << 6); // CMDTRANS=0,½áÊøÊý¾Ý´«Êä
INTX_ENABLE(); // ¿ªÆô×ÜÖжÏ
if (SDMMC1->STA & (1 << 3)) // Êý¾Ý³¬Ê±´íÎó
{
SDMMC1->ICR |= 1 << 3; // Çå´íÎó±êÖ¾
return SD_DATA_TIMEOUT;
}
else if (SDMMC1->STA & (1 << 1)) // Êý¾Ý¿éCRC´íÎó
{
SDMMC1->ICR |= 1 << 1; // Çå´íÎó±êÖ¾
if (nblks > 1) // Õë¶Ô¿ÉÄܳöÏÖµÄCRC´íÎó,Èç¹ûÊǶà¿é¶ÁÈ¡,±ØÐë·¢ËͽáÊø´«ÊäÃüÁî!
{
SDMMC_Send_Cmd(SD_CMD_STOP_TRANSMISSION, 1, 0); // ·¢ËÍCMD12+½áÊø´«Êä
errorstatus = CmdResp1Error(SD_CMD_STOP_TRANSMISSION); // µÈ´ýR1ÏìÓ¦
}
return SD_DATA_CRC_FAIL;
}
else if (SDMMC1->STA & (1 << 5)) // ½ÓÊÕfifoÉÏÒç´íÎó
{
SDMMC1->ICR |= 1 << 5; // Çå´íÎó±êÖ¾
return SD_RX_OVERRUN;
}
if ((SDMMC1->STA & (1 << 8)) && (nblks > 1)) // ¶à¿é½ÓÊÕ½áÊø,·¢ËͽáÊøÖ¸Áî
{
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); // ·¢ËÍCMD12+½áÊø´«Êä
errorstatus = CmdResp1Error(SD_CMD_STOP_TRANSMISSION); // µÈ´ýR1ÏìÓ¦
if (errorstatus != SD_OK)
return errorstatus;
}
}
SDMMC1->ICR = 0X1FE00FFF; // Çå³ýËùÓбê¼Ç
return errorstatus;
}
程序会死在while (!(SDMMC1->STA & ((1 << 5) | (1 << 1) | (1 << 3) | (1 << 8)))) 这个循环里面,永远出不来
|
|