我遇到EMMC读/写问题。我正在尝试在Omap35x上编写EMMC驱动程序。在我初始化emmc卡和omap之后,该卡进入tran状态。我的读写命令永远不会成功。以下是我所做的:
- 发送CMD0(MMCHS_CMD=0x00000000MMCHS_ARG=0xf0f0f0)
- 忙时发送CMD1(MMCHS_CMD=0x01020000 MMCHS_ARG=0x40FF8080)
- 发送CMD2(MMCHS_CMD=0x02090000 MMCHS_ARG=0x00000000)
- 发送CMD3(MMCHS_CMD=0x031a0000 MMCHS_ARG=0x00010000)响应=0x500标识状态
- m_regs->MMCHS_CON&=~0x00000001
- 发送CMD9(MMCHS_CMD=0x009090000 MMCHS_ARG=0x00010000)
- 发送CMD13检查状态(MMCHS_CMD=0x0D1a0000 MMCHS_ARG=0x00010000)响应=0x700
- 发送CMD7(MMCHS_CMD=0x071a0000 MMCHS_ARG=0x00010000)响应=0x700
- 未转换状态时,发送CMD6(MMCHS_CMD=0x061a0000 MMCHS_ARG=0x03b90100)响应=0x80010.将时钟设置为48 MHz发送CMD 16(MMCHS_CMD=0x101a0000 MMCHS_ARG=0x00000200)11.发送CMD13检查状态(MMCHS_CMD=0x0D1a0000 MMCHS_ARG=0x00010000)响应=0x900
在上述步骤之后,我尝试发送命令CMD24(MMCHS_CMD=0x182A0002 MMCHS_ARG=0x0000001和MMCHS_BLK=0x0000200),Omap成功进入MMCHS_STAT_BWR,然后我发送512字节的数据。我可以使用示波器观察通过数据线发送的数据,但当我轮询TC/DTO时,我从MMCHS_STAT收到一个0x108111,表示数据超时。我可以收到该命令的响应0x900。
对于读取,我将发送CMD17(MMCHS_CMD=0x112A0012 MMCHS_ARG=0x00000001和MMCHS_BLK=0x00000200)。我还可以接收到该命令的响应0x900。Omap成功进入MMCHS_STAT_BRR,但我无法观察到任何通过数据线发送的数据。
如果你发现我所做的步骤有任何问题,或者你有一个例子可以让它发挥作用,请告诉我。
您曾经尝试过以默认速度进行写/读吗?您可以跳过步骤9,不要在步骤10中将时钟更改为48MHz。然后再试一次。
此外,当CMD6的响应在步骤9中切换到高速模式时,READY_FOR_DATA的位还没有准备好。我认为你可以添加一个CMD13来确保eMMC是否准备好数据。如果eMMC的容量超过2GB,则无需在步骤10中发送CMD16。高容量eMMC默认为扇区模式。
数据超时的限制值是多少?在我的实验中,一些eMMC在响应后8ms以上发送第一个数据。