打印

网上看SD某个扇区写入512个字节的程序,请教个问题

[复制链接]
2163|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
meter007|  楼主 | 2011-3-9 13:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我是在看振南电子51读写SD卡视频看到的 就是24号命令
下面的程序中这句程序不用写了吗? (标红的的那句)
unsigned char mmc_write_sector(unsigned long sector, char *buffer)
{
    char cmd[] = {0x58, 0x00, 0x00, 0x00, 0x00,0xFF};  //CMD24 ----写命令24      

        char temp256[256] = {0};    //该数组用于观察卡返回数据

    unsigned char i=0;     
    unsigned char res=0x00;     //-----SD卡返回的数据
     
        sector = sector << 9;       //----每个扇区512字节
     
    cmd[1] = (sector & 0xFF000000) >> 24;                //----扇区地址
    cmd[2] = (sector & 0x00FF0000) >> 16;
    cmd[3] = (sector & 0x0000FF00) >> 8;
cmd[4] = (sector & 0x000000FF) ;  //就是这句  为什么不用写?

相关帖子

沙发
sytu_chyq| | 2011-3-9 15:06 | 只看该作者
写扇区就是从扇区的起始地址开始写吧
所以就是0咯

再看这一句
sector = sector << 9;       //----每个扇区512字节
即使写了也是0 啊

使用特权

评论回复
板凳
sdpz| | 2011-3-9 23:28 | 只看该作者
如果我没猜错的话:
unsigned long sector 是扇区编号

sector = sector << 9; 是将编号转成地址

cmd[4] = (sector & 0x000000FF) ; 这句不用写的原因是, 经过移位的sector低8位是0,而char cmd[]初始化的时候,cmd[4]已经是0了,没必要重新赋值。

结论:
cmd[1],cmd[2],cmd[3] 初始化浪费CPU时间

使用特权

评论回复
地板
古道热肠| | 2011-3-9 23:34 | 只看该作者
楼上网友正解,CMD[4]的值肯定是0,因其初始化为0,所以不必再赋值了。

使用特权

评论回复
5
古道热肠| | 2011-3-9 23:36 | 只看该作者
cmd[1] = (sector & 0xFF000000) >> 24;        
这种相与然后移位的写法相当占用存储空间和运行时间的。

使用特权

评论回复
6
sdpz| | 2011-3-10 00:05 | 只看该作者
本帖最后由 sdpz 于 2011-3-10 02:19 编辑

幸运的是C51编译器懂得优化这种写法。
这段代码比较耗时的是 unsinged long <<9
建议改成 unsinged int sector,  512*65536足够访问 32GB空间
写法大概是
cmd[1] = sector_H>>7;
cmd[2] = (sector_H<<1) | (sector_L>>7);
cmd[3] = sector_L << 1;
cmd[4] = 0;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

41

帖子

0

粉丝