SDHC读出来的数据和winhex读出来的不一样。。。

2020-02-11 10:14发布

本帖最后由 bright2307 于 2015-8-30 21:58 编辑

        单片机是MK30DN512Z,写完sdhc底层驱动测试没问题,测试向N扇区写入数据,然后再读出来,数据一样。
        加上了ZNFAT,发现0扇区的检测没通过。于是单步调试发现buffer里面的数据跟校验的数据不对。于是将0扇区打印出来,发现了不一样。打开winhex看了看,原来我写进去的数据也不对,但是单片机读出来就是我写进去的数据——扇区应该没问题,对某扇区写0 ,就会变成全0,些其他的就会。。。看图吧。

0扇区WINhex的数据
555.PNG (55.4 KB, 下载次数: 0) 下载附件 2015-8-30 21:49 上传

总结发现,写入 01  显示02
                写入02显示01
                写入03显示03
                写入05显示0A
                写入0a显示05...........


扇区读写函数如下(超核K60的程序)

  1. //读SD卡的一个block
  2. //输入:u32 sector 取地址(sector值,非物理地址)
  3. //     u8 *buffer 数据存储地址(大小至少512byte)                   
  4. //返回值:0: 成功
  5. //       other:失败                                                                                                                          
  6. u8 SD_ReadSingleBlock(u32 sector, u8 *buffer)
  7. {
  8.         u32 rev[4];
  9.         u16 results;
  10.         u32        j;
  11.   u32        *ptr = (u32*)buffer;
  12. //         if(MySD_Reg.CARDTYPE==ESDHC_CARD_SD) //如果是普通SD卡 把块地址转换成字节地址
  13. //         {
  14. //                 sector = sector<<9;
  15. //         }
  16.         sector = sector + 8192;
  17.        
  18.          while (SDHC->PRSSTAT & SDHC_PRSSTAT_DLA_MASK){};//等待DATA线空闲
  19.          SDHC->BLKATTR &= (~ SDHC_BLKATTR_BLKCNT_MASK); //清除快数
  20.          SDHC->BLKATTR |= SDHC_BLKATTR_BLKCNT(1);
  21.          results=SD_SendCommand(ESDHC_CMD17,sector,rev); //发送读单块命令
  22.         if(results!=ESDHC_OK) return ESDHC_ERROR_DATA_TRANSFER;  
  23.         //开始读取一个扇区------------------------------
  24.     //读取数据时,每次读取4个字节
  25.         for (j = (512+3)>>2;j!= 0;j--)
  26.         {
  27.             if (SDHC->IRQSTAT & (    SDHC_IRQSTAT_DEBE_MASK //Data End Bit Error
  28.                                   | SDHC_IRQSTAT_DCE_MASK  //Data CRC Error
  29.                                   | SDHC_IRQSTAT_DTOE_MASK)) //DataTimeout Error
  30.             {
  31.                 SDHC->IRQSTAT |= SDHC_IRQSTAT_DEBE_MASK
  32.                               | SDHC_IRQSTAT_DCE_MASK
  33.                               | SDHC_IRQSTAT_DTOE_MASK
  34.                               | SDHC_IRQSTAT_BRR_MASK; //Buffer Read Ready
  35.                 return ESDHC_ERROR_DATA_TRANSFER;
  36.             }
  37.                                        
  38.             while (0 == (SDHC->PRSSTAT & SDHC_PRSSTAT_BREN_MASK)){}; //等待数据准备好       
  39.                                                 *ptr=SDHC->DATPORT;         *ptr++;        //这里取代 *ptr++=SDHC->DATPORT;         因为这句有BUG
  40.         }
  41.         return ESDHC_OK;
  42. }

  43. //写入SD卡的一个block                                    
  44. //输入:u32 sector 扇区地址(sector值,非物理地址)
  45. //     u8 *buffer 数据存储地址   
  46. //返回值:0: 成功
  47. //       other:失败                                                                                                                          
  48. u8 SD_WriteSingleBlock(u32 sector, const u8 *buffer)
  49. {
  50.         u32 rev[4];
  51.         u16 results;
  52.         u32        j;
  53.   u32        *ptr = (u32*)buffer;
  54. //         if(MySD_Reg.CARDTYPE==ESDHC_CARD_SD) //如果是普通SD卡 把块地址转换成字节地址
  55. //         {
  56. //                 sector = sector<<9;
  57. //         }
  58.         sector = sector + 8192;
  59.          while (SDHC->PRSSTAT & SDHC_PRSSTAT_DLA_MASK){};//等待DATA线空闲
  60.         SDHC->BLKATTR &= (~ SDHC_BLKATTR_BLKCNT_MASK); //清除快数
  61.         SDHC->BLKATTR |= SDHC_BLKATTR_BLKCNT(1);
  62.        
  63.         results=SD_SendCommand(ESDHC_CMD24,sector,rev);

  64.         if(results!=ESDHC_OK) return ESDHC_ERROR_DATA_TRANSFER;  

  65.         //开始写入一个扇区------------------------------
  66.                
  67.     //读取数据时,每次读取4个字节
  68.         for (j = (512)>>2;j!= 0;j--)
  69.         {
  70.                                        
  71.             if (SDHC->IRQSTAT & (    SDHC_IRQSTAT_DEBE_MASK //Data End Bit Error
  72.                                   | SDHC_IRQSTAT_DCE_MASK  //Data CRC Error
  73.                                   | SDHC_IRQSTAT_DTOE_MASK)) //DataTimeout Error
  74.                                        
  75.             {
  76.                 SDHC->IRQSTAT |= SDHC_IRQSTAT_DEBE_MASK
  77.                               | SDHC_IRQSTAT_DCE_MASK
  78.                               | SDHC_IRQSTAT_DTOE_MASK
  79.                               | SDHC_IRQSTAT_BWR_MASK; //Buffer Write Ready
  80.                 return ESDHC_ERROR_DATA_TRANSFER;
  81.             }
  82.                                                
  83.             while (0 == (SDHC->PRSSTAT & SDHC_PRSSTAT_BWEN_MASK)){}; //等待数据准备好
  84.                                                         SDHC->DATPORT=*ptr;         *ptr++;        //这里取代 *ptr++=SDHC->DATPORT;         因为这句有BUG

  85.         }
  86.         return ESDHC_OK;
  87. }
复制代码


就这个问题~~~读写函数基本没动。

写出来后这两天混乱的大脑清晰多了~~~
我自己再捋一遍~~~
谢谢各位大神~~~
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。