bright2307 发表于 2015-8-30 21:57:26

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

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

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

0扇区WINhex的数据



0扇区,SDHC读出来数据(用x类型打印的)


我如果在mcu端在500扇区写入(其他靠后的扇区也试过,结果一样)17,在winhex上应该看到的全是 1对吧,好吧,看图
我对499扇区写入十进制35,winhex应该显示0x23
    对500扇区写入十进制17,winhex应该显示0x11
对501扇区循环写入0-255

串口打印出来的数据正常


winhex读出来的数据如下



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


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

//读SD卡的一个block
//输入:u32 sector 取地址(sector值,非物理地址)
//   u8 *buffer 数据存储地址(大小至少512byte)                   
//返回值:0: 成功
//       other:失败                                                                                                                          
u8 SD_ReadSingleBlock(u32 sector, u8 *buffer)
{
        u32 rev;
        u16 results;
        u32        j;
u32        *ptr = (u32*)buffer;
//         if(MySD_Reg.CARDTYPE==ESDHC_CARD_SD) //如果是普通SD卡 把块地址转换成字节地址
//         {
//                 sector = sector<<9;
//         }
        sector = sector + 8192;
       
       while (SDHC->PRSSTAT & SDHC_PRSSTAT_DLA_MASK){};//等待DATA线空闲
       SDHC->BLKATTR &= (~ SDHC_BLKATTR_BLKCNT_MASK); //清除快数
       SDHC->BLKATTR |= SDHC_BLKATTR_BLKCNT(1);
       results=SD_SendCommand(ESDHC_CMD17,sector,rev); //发送读单块命令
        if(results!=ESDHC_OK) return ESDHC_ERROR_DATA_TRANSFER;
        //开始读取一个扇区------------------------------
    //读取数据时,每次读取4个字节
      for (j = (512+3)>>2;j!= 0;j--)
      {
            if (SDHC->IRQSTAT & (    SDHC_IRQSTAT_DEBE_MASK //Data End Bit Error
                                  | SDHC_IRQSTAT_DCE_MASK//Data CRC Error
                                  | SDHC_IRQSTAT_DTOE_MASK)) //DataTimeout Error
            {
                SDHC->IRQSTAT |= SDHC_IRQSTAT_DEBE_MASK
                              | SDHC_IRQSTAT_DCE_MASK
                              | SDHC_IRQSTAT_DTOE_MASK
                              | SDHC_IRQSTAT_BRR_MASK; //Buffer Read Ready
                return ESDHC_ERROR_DATA_TRANSFER;
            }
                                       
            while (0 == (SDHC->PRSSTAT & SDHC_PRSSTAT_BREN_MASK)){}; //等待数据准备好       
                                                *ptr=SDHC->DATPORT;       *ptr++;        //这里取代 *ptr++=SDHC->DATPORT;       因为这句有BUG
      }
        return ESDHC_OK;
}

//写入SD卡的一个block                                  
//输入:u32 sector 扇区地址(sector值,非物理地址)
//   u8 *buffer 数据存储地址   
//返回值:0: 成功
//       other:失败                                                                                                                          
u8 SD_WriteSingleBlock(u32 sector, const u8 *buffer)
{
        u32 rev;
        u16 results;
        u32        j;
u32        *ptr = (u32*)buffer;
//         if(MySD_Reg.CARDTYPE==ESDHC_CARD_SD) //如果是普通SD卡 把块地址转换成字节地址
//         {
//                 sector = sector<<9;
//         }
        sector = sector + 8192;
       while (SDHC->PRSSTAT & SDHC_PRSSTAT_DLA_MASK){};//等待DATA线空闲
        SDHC->BLKATTR &= (~ SDHC_BLKATTR_BLKCNT_MASK); //清除快数
        SDHC->BLKATTR |= SDHC_BLKATTR_BLKCNT(1);
       
        results=SD_SendCommand(ESDHC_CMD24,sector,rev);

        if(results!=ESDHC_OK) return ESDHC_ERROR_DATA_TRANSFER;

        //开始写入一个扇区------------------------------
               
    //读取数据时,每次读取4个字节
      for (j = (512)>>2;j!= 0;j--)
      {
                                       
            if (SDHC->IRQSTAT & (    SDHC_IRQSTAT_DEBE_MASK //Data End Bit Error
                                  | SDHC_IRQSTAT_DCE_MASK//Data CRC Error
                                  | SDHC_IRQSTAT_DTOE_MASK)) //DataTimeout Error
                                       
            {
                SDHC->IRQSTAT |= SDHC_IRQSTAT_DEBE_MASK
                              | SDHC_IRQSTAT_DCE_MASK
                              | SDHC_IRQSTAT_DTOE_MASK
                              | SDHC_IRQSTAT_BWR_MASK; //Buffer Write Ready
                return ESDHC_ERROR_DATA_TRANSFER;
            }
                                               
            while (0 == (SDHC->PRSSTAT & SDHC_PRSSTAT_BWEN_MASK)){}; //等待数据准备好
                                                        SDHC->DATPORT=*ptr;       *ptr++;        //这里取代 *ptr++=SDHC->DATPORT;       因为这句有BUG

      }
        return ESDHC_OK;
}



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

写出来后这两天混乱的大脑清晰多了~~~
我自己再捋一遍~~~
谢谢各位大神~~~

bright2307 发表于 2015-9-14 16:11:18

{:sweat:} 找到错误,是个十分低级的错误~~~

        今天再次看程序,看到了初始化那里,想来是不是引脚错了?拿来原理图一看,马丹~~~~~~~D1和D0引脚弄了~~~日了狗了!!!一阵激动,,,割线,单片机引脚飞线,上电测试 ——————通过!!当初原理图检查了N遍愣是没看出来~~~哎,要不然总说电工总是死在那些自己鄙视到不能再鄙视的细节上。。。

bright2307 发表于 2015-8-30 22:09:28

本帖最后由 bright2307 于 2015-8-30 22:13 编辑

补充一下上面没写完的“规律”
依次写入
0123456789101112131415
winhex应该显示
0123456789   A    B    C   D   E   F   但是实际显示是
02138A9B46   5    7    C   E   D   F

不一样的那些数字都是互换的~~~我再查查读写函数~~~
按这个将读出来的0扇区转化,就全是对的了~~始终不明白哪里出错了

bright2307 发表于 2015-8-31 19:32:38

木有人啊~~~

bright2307 发表于 2015-9-2 13:29:45

{{:cry:} {:cry:}
请求帮忙啊

bright2307 发表于 2015-9-3 21:39:10


{
请求帮忙啊

bright2307 发表于 2015-9-4 11:26:05

自己再顶顶

落叶随风 发表于 2015-9-14 16:38:51

我去,一个帖子全是楼主自问自答。。。
有时候犯的一些低级错误真的是让人抓狂,检查了好几遍都没有发现,调试却怎么都过不了

bright2307 发表于 2015-9-14 17:40:46

落叶随风 发表于 2015-9-14 16:38
我去,一个帖子全是楼主自问自答。。。
有时候犯的一些低级错误真的是让人抓狂,检查了好几遍都没有发现, ...

哈哈,当时真的是急得没办法了,各大论坛都发了~~~不过总算是解决了

FSL_TICS_ZJJ 发表于 2015-8-30 21:57:27

这里分享楼主的最终的问题原因便于大家参考,来自楼主自己的在其他坛子的分享:
找到错误,是个十分低级的错误~~~

      今天再次看程序,看到了初始化那里,想来是不是引脚错了?拿来原理图一看D1和D0引脚弄了,割线,单片机引脚飞线,上电测试 ——————通过!!当初原理图检查了N遍愣是没看出来~~~哎,要不然总说电工总是死在那些自己鄙视到不能再鄙视的细节上。。

bright2307 发表于 2015-9-18 15:11:25

本帖最后由 bright2307 于 2015-9-18 15:13 编辑

FSL_TICS_ZJJ 发表于 2015-9-17 16:02
这里分享楼主的最终的问题原因便于大家参考,来自楼主自己的在其他坛子的分享:
找到错误,是个十分低级的错 ...

每个帖子都回了啊~~~这里的答案也顶二楼了~~

答案里里少了一个字~~~是引脚弄反了{:cry:}

FSL_TICS_ZJJ 发表于 2015-9-21 10:04:04

bright2307 发表于 2015-9-18 15:11
每个帖子都回了啊~~~这里的答案也顶二楼了~~

答案里里少了一个字~~~是引脚弄反了...

好的,硬件非常重要,遇到问题的时候,一定要先检查自己的硬件,只有硬件没有问题,再检查软件情况。
页: [1]
查看完整版本: SDHC读出来的数据和winhex读出来的不一样。。。