2440移植fatfs关于读写sd卡底层函数的问题
U8 SD_ReadMultipleBlock(U32 blockaddr,U16 blocknum,U8 *buf){
int status;
rd_cnt=0;
rSDIFSTA=rSDIFSTA|(1<<16);
rSDIDCON=(2<<22)|(1<<19)|(1<<17)|(Wide<<16)|(1<<14)|(2<<12)|(blocknum<<0);
rSDICARG=blockaddr<<9;
RERDCMD:
rSDICCON=(0x1<<9)|(0x1<<8)|0x52;
if(!Chk_CMDend(18, 1))
goto RERDCMD;
rSDICSTA=0xa00;
while(rd_cnt<512*blocknum)
{
if((rSDIDSTA&0x20)==0x20)
{
rSDIDSTA=(0x1<<0x5);
break;
}
status=rSDIFSTA;
if((status&0x1000)==0x1000)
{
*buf++=rSDIDAT8;
rd_cnt++;
}
}
if(!Chk_DATend())
{
Uart_Printf("Data error!\n");
return 1;
}
rSDIDCON=rSDIDCON&~(7<<12);
rSDIFSTA=rSDIFSTA&0x200;
rSDIDSTA=0x10;
RERCMD12:
rSDICARG=0x0;
rSDICCON=(0x1<<9)|(0x1<<8)|0x4c;
if(!Chk_CMDend(12, 1))
goto RERCMD12;
rSDICSTA=0xa00;
return 0;
}
------------------------------------------------------------
这个地方时按字节操作的*buf++=rSDIDAT8;
buf是8位的,而定义rSDIDAT8的时候,#define rSDIDAT8 (*(volatile unsigned char *)0x5a000040) //SDI data
而这个定义是在小端模式下。
但是看又说sd是大端存储,故而应定义成大端模式。。
这个地方比较纠结:
1、把rSDIDAT8 定义的时候 取的是一个字节的地址,这样坐正确么?或该怎么样处理?
2、大小端到底该怎么配置,LD_WORD等在读写底层驱动中是否使用?ads下是否必须定义成函数形式?
3、sdhc的操作和sd的操作仅仅初始化不同,读写函数基本一模一样? 关于大端小端我的理解是;当以单字节去操作时是没有区别的(不知道对不对!),大端和小端的区别是在于存一个大于一个字节的情况,如32bit的平台下 存一个int 型数据在地址0x00000000,0x12345678,在小端时候:0x0000 0000-->0x78, 0x0000 0001-->0x56,0x0000 0002-->0x34, 0x0000 0004-->0x12;而大端为:0x0000 0000-->0x12, 0x0000 0001-->0x34,0x0000 0002-->0x56, 0x0000 0004-->0x78,;所以我觉得单从一个字节的写入和读出跟大小端没啥关系,比如你要向0x0000 0000 写0x88,大端小端应该是一样的!
----------纯属个人理解,不对之处欢迎指出!{:smile:} sdhc卡在非文件系统下进行扇区的读写操作,发现插在电脑上要么无法识别,要么可以显示盘符但是无法格式化。
再来进行非扇区读写操作发现失败 ~ 我的这张卡是不是废掉了?!{:mad:} 买了一个新的读卡器,插到电脑上,就提示尚未格式话,
顿时我沉重的心情没了 朋友。我最近也在搞SD卡读写文件,不过没弄出来 可以请教下你这个具体该怎么弄么?我的f_open函数返回FR_OK,但是就是SD卡中什么都看不到。什么反应都没有。望指教。衷心感谢。我的QQ。374075382
页:
[1]