有没有对EMMC/MMC/SD熟悉的人帮忙看一下,非常感谢!
初始化过程:1、发送CMD0,arg = 0x0; // 复位2、一直发送CMD1,arg = 0x40ff8080; // 直到收到0xc0ff8080(OCR寄存器),即收到外设没有busy为止3、发送CMD2,arg = 0x0; // 获取CID寄存器的信息,值为(0xc05d51d3)(0x52011f7a)(0x574d4233)(0x15010038)&nBSP; ID = 0x15与实际的EMMC的ID一致;4、发送CMD3,arg = 0X20000; // 分配一个地址0x2给外设,5、发送CMD9,arg = 0x20000; // 通过分配的地址,获取设备的CSD寄存器的值;值为(0x8e40400d)(0xf6dbffef)(0x0f5903ff)(0xd0270132)6、发送CMD7,arg = 0x20000; // 选择外设7、// 由于发送CMD8,MSDC_STA状态位里的FIFO empty并没有被清掉,没办法从DAT里面读取EXT_CSD寄存器的值,但不影响读写吧8、发送CMD16,arg = 0x200; // 设置block len为512
这时状态已经切换为trans状态了,按道理,是可以进行读写操作了;用默认的1线做以下测试:
/* 写过程(测试1)*/// 因为一个block len的长度为512字节,直接写一个block吧9、发送CMD24,arg = 0x0; // 在地址为0开始写,写一个block10、往寄存器里面写数据,写到56*4个字节之前,就不能再往寄存器里面写了,寄存器状态变了FULL了。
/* 既然一次不能写太多到寄存器里面,就写少一点吧(测试2)*/11、发送CMD16,arg = 0x8; // 设置block len为8个byte12、发送CMD24,arg = 0x0; // 在地址为0开始写发送完CMD24后,在命令线上直接返回0x20000900,意思是设置block len错误
/* 读操作 (测试3)*/13、发送CMD17后,主机的FIFOCNT既然有数据,就开始读取一个block的数据,512个byte,好开心,没报错;结果读到的数据全是0,肯定哪里有问题了;
请问:1、往主机的DAT里面写56*4个字节后,就满了,block len为512byte,怎么写?2、为何设置了block len不等于512时,如设置为0x8(测试2),发送CMD24就会报block len设置错误?3、读512个字节全是0,是我的操作有问题?
帮忙看一下,非常感谢!