This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320C6748:OMAP-L138_FlashAndBootUtils_2_40中的 SDMMC 写入器

Guru**** 2540720 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/568481/tms320c6748-sdmmc-writer-in-omap-l138_flashandbootutils_2_40

器件型号:TMS320C6748

第一。 在函数 local_GetAndWriteFileData()中,为什么在写入块和回读以进行验证之间插入如此长的延迟?

//验证写入的数据,一次一个块  

对于(i = 0;i< numBlks;i++)

if (SDMMC_MEM_writeBytes (hSdmmcMemInfo、
目的地地址、
hSdmmcMemInfo->hSDMMCInfo->dataBytesPerBlk、
&appPtR[i*hSdlmcMemInfo->hSDMMCInfo->dataBytesPerBlk])!= E_PASS)

Debug_printString ("\aar:写入 SDMMC 失败。\r\n");
返回 E_FAIL;


Util_waitLoop (100000);

if (SDMMC_MEM_verifyBytes (hSdmmcMemInfo、
目的地地址、
hSdmmcMemInfo->hSDMMCInfo->dataBytesPerBlk、
&appPtR[i*hSdlmcMemInfo->hSDMMCInfo->dataBytesPerBlk],
gMemRx)!= E_PASS)

Debug_printString ("\aar:验证 SDMMC 失败。\r\n");
返回 E_FAIL;

destAddr += hSdmmcMemInfo->hSDMMCInfo->dataBytesPerBlk;

2。 在 SDMMC_MEM_writeBytes 中、已存在状态检查。  

//等待状态显示完成
while (SDMMMC->MMCST0 & SDMMC_MMCST0_DATDNE_MASK = 0);

3号。 但是、如果删除延迟 UTIL_waitLoop (100000);SDMMMC->MMCST0将为0、程序将在循环中永远等待。

uint32 SDMMC_readNWords (SDMMC_InfoHandle hSDMMCInfo、uint32 *数据、uint32数字字节)

DEVICE_SDMMCRegs * SDMMC =(DEVICE_SDMMCRegs *) hSDMMCInfo->regs;
uint16 i=0、j=0;
uint32状态;
uint32 fifoReadItrCount、wordItrCount;

//设置 FIFO 迭代和字迭代的计数器
fifoReadItrCount= numofBytes >> hSDMMCInfo->dataBytesPerOpPower2;
wordItrCount = hSDMMCInfo->dataBytesPerOp >> 2;

for (i=0;<fifoReadItrCount; i++)

//等待 DRRDY 或某种错误/超时
操作

status=SDMMMC->MMCST0;
IF (STATUS &(SDMMC_MMCST0_CRD_MASK | SDMMC_MMCST0_TOUTRD_MASK))

返回 E_FAIL;


while ((status & SDMMC_MMCST0_DRRDY_MASK)=0);

//读取数据,一次一个字
对于(j=0、<wordItrCount; j++)

*DATA++= SDMMMC->MMCDRR;


返回 E_PASS;

4. 如果延迟保持不变、则 MMCST0返回0x400。 然后从 FIFO 读回数据。

问题:  

为什么需要如此长的延迟? 如何确定所需的延迟周期?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我将其更改为下面的内容以检查忙位、现在看起来不错。

    #define MMCST1 *(unsigned int *) 0x01C4000C  

    // UTIL_waitLoop (100000);

    while ((MMCST1 & 0x1)!=1);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Tony、

    您的评估正确。 理想情况下、检查 BUSY 位是在代码中实现此目的的正确方法、而不是任意延迟。 这是一个n`t 较旧的代码、闪存实用程序实际上没有实时要求、因此开发人员可能已经插入了延迟。

    我将提交一个更改请求、但没有为该软件计划新版本。

    此致、
    Rahul
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢您 Rahul、

    更正我的拼写错误如果有人引用、正确的更改应该是:

    while ((MMCST1 & 0x1)==1);