查看: 3229|回复: 8

[求助] SDHC读出来的数据和winhex读出来的不一样。。

[复制链接]

该用户从未签到

6

主题

36

帖子

0

注册会员

Rank: 2

积分
192
最后登录
2018-5-7
发表于 2015-8-31 22:56:38 | 显示全部楼层 |阅读模式
本帖最后由 xiaomizhouzhou 于 2015-8-31 22:58 编辑

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

依次写入
0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  
winhex应该显示
0  1  2  3  4  5  6  7  8  9   A    B    C   D   E   F   但是实际显示是
0  2  1  3  8  A  9  B  4  6   5    7    C   E   D   F

不一样的那些数字都是互换的~~~我再查查读写函数~~~
按这个将读出来的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[4];
  •         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[4];
  •         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;
  • }


[color=rgb(51, 102, 153) !important]复制代码




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

我知道答案 目前已有8人回答

评分

参与人数 1NXP金币 +3 收起 理由
小七 + 3

查看全部评分

回复

使用道具 举报

该用户从未签到

6

主题

36

帖子

0

注册会员

Rank: 2

积分
192
最后登录
2018-5-7
 楼主| 发表于 2015-9-14 16:20:11 | 显示全部楼层
本帖最后由 xiaomizhouzhou 于 2015-9-21 10:06 编辑

找到错误,是个十分低级的错误~~~

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

使用道具 举报

该用户从未签到

6

主题

36

帖子

0

注册会员

Rank: 2

积分
192
最后登录
2018-5-7
 楼主| 发表于 2015-9-2 13:28:57 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

6

主题

36

帖子

0

注册会员

Rank: 2

积分
192
最后登录
2018-5-7
 楼主| 发表于 2015-9-3 21:40:01 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

8

主题

39

帖子

0

注册会员

Rank: 2

积分
90
最后登录
2018-6-1
发表于 2015-9-10 17:50:47 | 显示全部楼层
帮顶一下
回复

使用道具 举报

该用户从未签到

3

主题

51

帖子

0

注册会员

Rank: 2

积分
87
最后登录
1970-1-1
发表于 2015-9-14 20:37:51 | 显示全部楼层
对于SD卡比较无语,有人知道为嘛读SD卡AD采值会受影响吗? 光电组-北京邮电大学-pikachu-智能车技术报告.pdf (1.35 MB, 下载次数: 3)
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

36

帖子

0

注册会员

Rank: 2

积分
192
最后登录
2018-5-7
 楼主| 发表于 2015-9-15 16:46:11 | 显示全部楼层
佳佳儿 发表于 2015-9-14 20:37
对于SD卡比较无语,有人知道为嘛读SD卡AD采值会受影响吗?

?这都有影响??
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2018-8-30 16:02
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    36

    主题

    1065

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1851
    最后登录
    2019-11-19
    发表于 2015-9-16 10:37:47 | 显示全部楼层
    佳佳儿 发表于 2015-9-14 20:37
    对于SD卡比较无语,有人知道为嘛读SD卡AD采值会受影响吗?

    你为什么发了一个技术报告
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    59

    帖子

    0

    注册会员

    Rank: 2

    积分
    107
    最后登录
    2015-9-23
    发表于 2015-9-17 23:07:47 | 显示全部楼层
    支持
    回复

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-28 17:42 , Processed in 0.114562 second(s), 33 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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