内容如题:
我发现的注释里面的一个小问题,就是时钟的注释:
其中SDIOCLK为48M,若初始时始终不能高于400KHz,则分频至少为120,然后减去2就是118,对应的十六进制为0x76,刚好就是SDIO_INIT_CLK_DIV的宏定义值。
所以此处的注释应该为SDIOCLK = 48MHz, SDIO_CK = HCLK/(118 + 2) = 400 KHz
还有就是另外一点我比较佩服的是关于读取操作中的字节对其问题,原子哥也考虑到了,当开始我没看明白,后来想了想才看懂什么意思:
在读取磁盘的操作中有一个判断指向buf的指针的地址是否对4求余为零,如果不为零就先读取到指定的四字节对齐的__align(4) u8 SDIO_DATA_BUFFER[512];中,然后复制到要操作的buf;当然如果已经对齐了,就直接读就是了,分别是读单个块还是多个块。
u8 SD_ReadDisk(u8*buf,u32 sector,u8 cnt)
{
u8 sta=SD_OK;
long long lsector=sector;
u8 n;
if(CardType!=SDIO_STD_CAPACITY_SD_CARD_V1_1)lsector<<=9;
if((u32)buf%4!=0)
{
for(n=0;n<cnt;n++)
{
sta=SD_ReadBlock(SDIO_DATA_BUFFER,lsector+512*n,512);//单个sector的读操作
memcpy(buf,SDIO_DATA_BUFFER,512);
buf+=512;
}
}else
{
if(cnt==1)sta=SD_ReadBlock(buf,lsector,512); //单个sector的读操作
else sta=SD_ReadMultiBlocks(buf,lsector,512,cnt);//多个sector
}
return sta;
}
最后有一个问题,也是我想问的一个,关于读取过程中使用DMA方式的,如果遇到了用于读取的指针不为4字节对齐的话?!!!!
好吧,我没问题了,我懂了,是我理解错了,我没疑问了。
是我一开始看错了,如果不为四字节对其的话,是要先读取到四字节对其的中去,然后放到要存的buf中,我自己给自己解答了,是我没看好。所以不存在对齐的问题。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
---------------------------------
感谢原子哥,不怪我就行。本来刚开始学SDIO的时候用F1的板子,其中的SD卡实验使用的是SPI模式,也查了一些SDIO的资料,不过感觉没有看懂。然后等F4的板子出来后,发现里面有使用SDIO的解释,就仔细对比着看了下,发现效果不错,我竟然看懂了,知道SDIO控制器是怎么个工作流程了,然后在计算时钟的时候发现注释用的是F1的,就提了出来,不怪我就好,我只是发表我的看法而已。然后对比着看了下查询和DMA模式,对工作原理也有了一定的了解。
正如你说的,DMA方式容易出错,并且每次读取扇区的时候,都要对DMA进行下初始化,感觉有点浪费时间,希望可以精简下,那样就可以节省很大的CPU开销。当然,最后我还是觉得查询的方式靠谱点。
一周热门 更多>