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.

C6748 OMAP138 MMCSD 初始化与读操作

Other Parts Discussed in Thread: OMAP-L138, TMS320C6748

现在使用TI开发板参考程序“evmc6748_v1-1\tests\experimenter\mmcsd”,在“test_mmcsd.c”内进行mmcsd初始化与首次读操作时,有一个重复尝试的机制如下图:

当首次读操作异常后,会重新进行一次初始化等操作,然后再重新进行读取,请问这种设计的出发点是?

或者说MMSCD接口,SD卡槽与SD卡相关软硬件出现什么情况才会需要上述重复初始化操作?

 

  • C6748 MMCSD接口支持8G与16G的是的卡吗?

  • 有专家能给点解答吗?

    另外,今天在OMAP-L138 C6000 DSP+ARM Processor Technical Reference Manual的MMCSD模块一掌发现有备注:

    按照\evmc6748_v1-1\tests\experimenter\mmcsd给的时钟配置,mmcsd模块function clock由pll0 sysclk2提供,为150Mhz,而代码里关于memory clk的配置如下,这样最终输出的memory clk = function clock/4 = 37.5 >> 400Khz。

    是不是我理解上有问题,还是这个初始化代码有漏洞?

     

     

     

     

  • 应该是大意了。

    我找了另一个SDMMC 烧写工程里是按要求配的参数(OMAP-L138_FlashAndBootUtils_2_40\OMAP-L138\CCS\SDMMCWriter)


    const SDMMC_ConfigObj DEVICE_SDMMC_config =
    {
    SDMMC_LITTLE_ENDIAN, // writeEndian
    SDMMC_LITTLE_ENDIAN, // readEndian
    SDMMC_DAT3_EDGE_DETECT_DISABLE, // dat3Detect
    #if (1)
    249, // initModeClockRate (target 300 KHz with 150 MHz input to module)
    7, // dataModeClockRate (target 10 MHz with 150 MHz input to module)
    #else
    19, // initModeClockRate (target 300 KHz with 12 MHz input to module)
    0, // dataModeClockRate (target 3 MHz with 6 MHz input to module)
    #endif
    SDMMC_4BIT_DATABUS, // busWidth
    0xFF, // timeoutResponse (none)
    0x0000FFFF, // timeoutData
    SDMMC_FIFO_LEVEL_HIGH // fifoThreshold
    };

    SDMMC_ConfigHandle const hDEVICE_SDMMC_config = (SDMMC_ConfigHandle) &DEVICE_SDMMC_config;


    static Uint32 LOCAL_sdmmcwriter()
    {
    SDMMC_MEM_InfoHandle hSDMMCMemInfo;

    Int8 fileName[256];
    Uint32 baseAddress = 0;
    Bool useHeaderForApp = FALSE;

    DEBUG_printString( "Starting " );
    DEBUG_printString( (String) devString );
    DEBUG_printString( " SDMMCWriter.\r\n" );

    // Initialize SD/MMC Memory Device
    hSDMMCMemInfo = SDMMC_MEM_open(DEVICE_SDMMCBOOT_PERIPHNUM, hDEVICE_SDMMC_config);

  • @Tony Tang,下午仔细看了OMAP-L138_FlashAndBootUtils_2_40\OMAP-L138\CCS\SDMMCWriter程序,还有两个问题请教:

    问题1:在下面的SD卡扇区块读写测试中(代码实际每次写与读都是一个512长度的数据块),写与读之间加了一个延时语句,去掉该延时语句后程序会停留在函数SDMMC_readNWords内,status=SDMMC->MMCST0; status一直为0,导致死循环。请问对SD卡进行连续的单数据块读写操作之间必须加这样的延时吗?

    问题2:同样的工程内,我将SDMMC_MEM_writebytes屏蔽,进入循环后直接进行读操作,则导致程序在SDMMC_readNWords内,status=SDMMC->MMCST0; status为TOUTRD超时,需要通过工程内如下代码重复一次初始化后,才能正常读取,想知道这个具体原因?






  • 由专家出来指点下吗?

  • countryhotel 说:
    问题1:在下面的SD卡扇区块读写测试中(代码实际每次写与读都是一个512长度的数据块),写与读之间加了一个延时语句,去掉该延时语句后程序会停留在函数SDMMC_readNWords内,status=SDMMC->MMCST0; status一直为0,导致死循环。请问对SD卡进行连续的单数据块读写操作之间必须加这样的延时吗?

    对照了TRM27.3.4的流程,这个SDMMC_readNWords的操作没有完整按照27.3.4的步骤来,其中1-4都省了,取而代之的是这个UTIL_waitLoop(100000). 其中第1,2步是用来找卡的,只能对做出响应的卡进行操作。

    因为前面刚做完写操作,虽然数据从MMC的FIFO送给MMC卡了,但MMC卡从自己的FIFO写到其memory上是需要时间的,是不能直接马上进行回读的,其实是它不会对这个立即跟上的读操作做出响应的。换言之,根本就没有接收控制器发出的读命令,所以也不会有响应了。而增加的延时即是等SD卡向自己的内存写数完成。

    countryhotel 说:
    问题2:同样的工程内,我将SDMMC_MEM_writebytes屏蔽,进入循环后直接进行读操作,则导致程序在SDMMC_readNWords内,status=SDMMC->MMCST0; status为TOUTRD超时,需要通过工程内如下代码重复一次初始化后,才能正常读取,想知道这个具体原因?

    这个应该是跟前面的道理是一样的吧。

    建议按手册的完整流程完善你的API进行操作。

  • 把这个delay改为如下,检查MMCST1的busy位再往下执行,就可以了。

    #define MMCST1   *(unsigned int *)0x01C4000C 

    // UTIL_waitLoop(100000);

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

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

    应该是笔误 

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

  • 谢谢斧正。

  • 对应TRM中:

  • 是的:

    27.2.9.7.6 Determining Whether the Memory Card is Busy
    The card sends a busy signal either when waiting for an R1b-type response or when programming the last
    write data into its flash memory. The MMC/SD controller has two flags to notify you whether the memory
    card is sending a busy signal. The two flags are complements of each other:
    • The BSYDNE flag in MMCST0 is set if the card did not send or is not sending a busy signal when the
    MMC/SD controller is expecting a busy signal (BSYEXP = 1 in MMCCMD). The interrupt by this bit is
    enabled by a corresponding interrupt enable bit (EBSYDNE = 1 in MMCIM).
    • The BUSY flag in MMCST1 is set when a busy signal is received from the card.

  • 这个问题我也遇到了,至今没有解决, 你说的这个检查MMCST1 BUSY的方法,在看这个帖子前就已经试过了,没有效果,BUSY的值为0。
    就是按照TI的例子代码来做,在初始化->detectCard以后,直接调用Read,就会出现同样的问题,这时必须重新再进行一遍初始化流程才能正常Read。

    一直没有找到问题的原因。不知道有没有专家知道这个是怎么回事。

  • 我也是这样的。MMCST0和MMCST1的状态好像一直很混乱。检测BUSY或者dxdry或者fifo empty都不行。没法连续写。我的板子是C6748_LCDK官方例程,主频456M。starterware中例程有点太偷工减料了。您的现在有解决思路了没?方便QQ请教沟通一下吗?我的QQ584195364

  • 你好,我的板子是TMS320C6748,用的是官网的starterware_c6748_mmcsd例程,初始化之后直接往SD卡写数据失败(偶尔成功,同样的代码),写函数返回正确,就不知道是什么原因,请大神指教
  • 你好,我的板子是TMS320C6748,用的是官网的starterware_c6748_mmcsd例程,初始化之后直接往SD卡写数据失败(偶尔成功,同样的代码),写函数返回正确,就不知道是什么原因,请大神指教
  • 你好,我的板子是TMS320C6748,用的是官网的starterware_c6748_mmcsd例程,初始化之后直接往SD卡写数据失败(偶尔成功,同样的代码),写函数返回正确,就不知道是什么原因,请大神指教