野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 24591|回复: 5

有关SD卡的SDIO驱动程序疑惑

[复制链接]
发表于 2014-4-3 16:38:01 | 显示全部楼层 |阅读模式
小弟不是真心贴代码的,可是看到下面的代码之后就疑惑了:
  while (!(SDIO->STA & (SDIO_FLAG_DBCKEND | SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_STBITERR)))
  {
    if (SDIO_GetFlagStatus(SDIO_FLAG_TXFIFOHE) != RESET)
    {
      if ((512 - bytestransferred) < 32)
      {
          //C primer plus这本书还是很好的,可以发现?运算符一般用于不足1的时候进一搞的,碉堡
          //restwords:字的个数,因为是32位机机
        restwords = ((512 - bytestransferred) % 4 == 0) ? ((512 - bytestransferred) / 4) : (( 512 -  bytestransferred) / 4 + 1);
        for (count = 0; count < restwords; count++, tempbuff++, bytestransferred += 4)
        {
          SDIO_WriteData(*tempbuff);
        }
      }
      else
      {
        for (count = 0; count < 8; count++)
        {
          SDIO_WriteData(*(tempbuff + count));
        }
        tempbuff += 8;
        bytestransferred += 32;
      }
    }
  }
这段代码是SD_WriteBlock函数里面的,这边小弟有一个问题,这个bytestransferred 变量是干嘛的,为什么bytestransferred 要加32??
回复

使用道具 举报

发表于 2014-4-3 16:47:20 | 显示全部楼层
用来记录已经传输的字节数,因为SDIO_WriteData一次写入32位数据(一个字),即4个字节,所以写完一次bytestransferred就加4个字节

后面tempbuf写入了8个字,即32个字节,所以bytestransferred+=32
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-3 16:57:22 | 显示全部楼层
flyleaf 发表于 2014-4-3 16:47
用来记录已经传输的字节数,因为SDIO_WriteData一次写入32位数据(一个字),即4个字节,所以写完一次bytes ...

可是传入的数组是uint8_t Buffer_Block_Tx[BLOCK_SIZE],是char型,这里难道是强制转换了?可是为什么要这样做呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-3 17:02:53 | 显示全部楼层
flyleaf 发表于 2014-4-3 16:47
用来记录已经传输的字节数,因为SDIO_WriteData一次写入32位数据(一个字),即4个字节,所以写完一次bytes ...

小弟理解一下,这段代码是传一个块数据的,可是为什么要搞这么复杂呢?直接if(xxxxx < 512)循环传一个块不就OK?
回复 支持 反对

使用道具 举报

发表于 2014-4-3 17:17:27 | 显示全部楼层
随风而至 发表于 2014-4-3 16:57
可是传入的数组是uint8_t Buffer_Block_Tx,是char型,这里难道是强制转换了?可是为什么要这样做呢?

因为SDIO外设的数据寄存器是1个字,32位的。所以实际写入的时候一次写入4个字节,你截的这段代码没有看到强制转换的过程,但肯定是有的,指针的这种用法也比较常见
回复 支持 反对

使用道具 举报

发表于 2014-4-3 17:19:42 | 显示全部楼层
随风而至 发表于 2014-4-3 17:02
小弟理解一下,这段代码是传一个块数据的,可是为什么要搞这么复杂呢?直接if(xxxxx < 512)循环传一个块不 ...

就是上面提到的问题,因为每次写入寄存器的不是1个字节,而是4个字节。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-9-29 03:20 , Processed in 0.048546 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表