最近做自己公司芯片的sd/mmc 模块,在enable SD高速模式下时会出现crc 错误。可气的是做为公司的fae竟然没有除datasheet之外的资料!这个fae也太可怜了。。。。
现象为:SD速度较低的SDclk=31Mhz会出现writing CRC error.但高速mode下(通过cmd6,switch command设置)clk>31Mhz以及SD低速mode就不会出现问题。
怀疑:1. 高速mode timing
2. Nac超时
3. DMA错误
高速mode timing要求Twl Twh 最小为7ns. Ttlh,Tthl最大为3ns,抓图如下:
31Mhz
50Mhz
330Mhz
都为TTL电平,低=0.7V,高=>2.4V.
发现timing满足高速要求。
继续发现DMA也没有问题。而且系统也没有报nac之类的time out,应该不是超时。
那究竟是什么问题呢,在read时没有问题,write缺会crc error!
继续说代码检查,发现发cmd12时会disable clock frozen ! 会不会出现这样的问题?用实验说明问题,cmd12是multi-block时,发stop command来停止读写的。如果全部使用single block问题会消失的话,应该就是它的问题。
实验发现single block问题解除。看来就是multi-block的问题。继续究。
《后记》
问题解决,原来是在sd的data transfer的dma结束时没有等待sd card data transfer complete所致。dma已经传输结束,但是在写数据时,数据还没有传到sd card memory里的flash中,如果此时再次起动sd传输,就会导致写入错误数据。
解决方法:在dma结束的callback中,等待sd_status_dd.