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.

使用am335X的starterware测试emmc出现函数执行不下去的问题



使用starterware函数HSMMCSDBusWidthSet(SOC_MMCHS_1_REGS,HS_MMCSD_BUS_WIDTH_8BIT);//8位宽度

当第一个参数为SOC_MMCHS_0_REGS时能够执行函数,当为SOC_MMCHS_1_REGS,出现

No source available for "0x4030fc10"

 

请问这是什么原因?emmc是用MMC1管脚。

 

  • SOC_MMCHS_1_REGS的地址是0x481D8000,不能对这个寄存器进行访问,这是什么原因?

  • 在前面的配置中,有使能MMC1相关的时钟域吗?

  • GPMCClkConfig();   //PinMux Configuration     //MMC1_D0~D7 pull_up mode2   HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_AD(8)) =0x00000012;   HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_AD(9)) =0x00000012;   HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_AD(10)) =0x00000012;   HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_AD(11)) =0x00000012;   HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_AD(12)) =0x00000012;   HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_AD(13)) =0x00000012;   HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_AD(14)) =0x00000012;   HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_AD(15)) =0x00000012;

      //MMC1_CLK     no_pull mode2    HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_CSN(1)) =0x0000000A;   //MMC1_CMD     pull_up mode2    HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_CSN(2)) =0x00000012;

          HSMMCSDModuleClkConfig();         HSMMCSDBusPower(SOC_MMCHS_1_REGS, HS_MMCSD_BUS_POWER_ON);//emmc power on

      HSMMCSDBusVoltSet(SOC_MMCHS_1_REGS,HS_MMCSD_BUS_VOLT_3P3);//power 3.3v

      //clock 400kHZ or less   HSMMCSDIntClock(SOC_MMCHS_1_REGS, HS_MMCSD_INTCLOCK_ON);

     

      SysDelayTimerSetup();//系统延时时钟开启,定时器7   Sysdelay(1);//delay 1ms   for (i=0; i<74; i++);//wait for 74 more clock cycles

       HSMMCSDCommandSend(SOC_MMCHS_1_REGS,     HS_MMCSD_CMD(MMCHS_CMD_INDX_CMD0, HS_MMCSD_CMD_TYPE_NORMAL, HS_MMCSD_NO_RESPONSE, HS_MMCSD_CMD_DIR_WRITE)     ,0x00000000,NULL,MMCHS_BLK_BLEN_SHIFT,0);//send CMD0 ->IDLE State

     

      Sysdelay(10);//延时   HSMMCSDCommandSend(SOC_MMCHS_1_REGS,      HS_MMCSD_CMD(MMCHS_CMD_INDX_CMD1, HS_MMCSD_CMD_TYPE_NORMAL, HS_MMCSD_48BITS_BUSY_RESPONSE, HS_MMCSD_CMD_DIR_WRITE)      ,0x00FF8000,NULL,MMCHS_BLK_BLEN_SHIFT,0);//send CMD1 Idle State->Ready State

         HSMMCSDResponseGet(SOC_MMCHS_1_REGS,Response);//Receive R3  正确返回: 0x80FF8080和0x80FF8000    两种情况      while (Response[0]>>31 != 0x1)//busy      {       Emmc_Cmd1Send();      }

  • MMC1相关的时钟域是用哪个函数打开的?是需要在boot启动的时候进行操作吗?

  • 你不是在调试MMC1的APP么,看截图的状态有些问题,截图里的指针是停在了内部的internal ram地址中?

    你load完.out的程序后,指针能够停止在main函数处吗?可以单步跟踪debug吗?

    MMC1clock的使能在CM_PER中,偏移量为0xF4h.

  • 我在调试MMC1读写emmc的程序。可以进入main()函数进行单步调试,但是在访问函数 HSMMCSDBusPower(SOC_MMCHS_1_REGS, HS_MMCSD_BUS_POWER_ON);//emmc power on的时候,进入函数内部,到 HWREG(baseAddr + MMCHS_HCTL) =             (HWREG(baseAddr + MMCHS_HCTL) & ~MMCHS_HCTL_SDBP) | pwr; 这一个语句后,出现截图状态。

    下面是单步调试的图

    最后停在了这里

     
    这该从什么方向解决问题?
  •  HWREG(0x44E00000 + 0xF4) = 0x00000002;

    打开时钟后,可以对MMC1进行访问和操作。多谢Steven帮忙

  •  HWREG(0x44E00000 + 0xF4) = 0x00000002;

    打开mmc1时钟后。可以对MMC1进行访问和函数操作。多谢Steven帮忙

  • 你好,请问你用starterware调好了你的MMC了么?我现在也在做这块,能不能请教几个问题呢?能不能给个联系方式