打印
[Kinetis]

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

[复制链接]
1491|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
     【发了好几个论坛了都没人理我~~另求飞思卡尔北京售后技术支持地址和电话(其他联系方式也行!!)】       单片机是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]复制代码




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



相关帖子

来自 2楼
雨思小米粥|  楼主 | 2015-9-14 16:13 | 只看该作者
找到错误,是个十分低级的错误~~~

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

使用特权

评论回复
板凳
雨思小米粥|  楼主 | 2015-9-2 13:28 | 只看该作者
:'(:'(

使用特权

评论回复
地板
雨思小米粥|  楼主 | 2015-9-3 21:34 | 只看该作者
:'(:'(:'(

使用特权

评论回复
5
雨思小米粥|  楼主 | 2015-9-4 11:27 | 只看该作者
:'(~~~~求帮忙 啊

使用特权

评论回复
6
enjoylife2017| | 2015-9-4 16:16 | 只看该作者
兄弟,你这个比我还复杂。我不知道你的问题。但我现在的问题是CMD17的响应是0x00400900我不知道怎么回事,都卡了好久了。前面的初始化到CMD3都好的,CMD3响应是0x700.我是SD74线模式的。能交流一下吗。

使用特权

评论回复
7
enjoylife2017| | 2015-9-4 16:21 | 只看该作者
兄弟你好。我还没到你的问题呢。不过我现在的问题是CMD17响应是0x00400900.然后就不接受其他的响应了。我是FPGA下SD4线模式的。不知道你的初始化流程是什么,能分享一下吗?最好是贴出对应的响应。。。帮帮忙啊。

使用特权

评论回复
8
雨思小米粥|  楼主 | 2015-9-5 21:39 | 只看该作者
enjoylife2017 发表于 2015-9-4 16:21
兄弟你好。我还没到你的问题呢。不过我现在的问题是CMD17响应是0x00400900.然后就不接受其他的响应了。我是 ...

:'(:'(同病相怜啊~~~感觉像是两个要饭的在寒风中凑在了一起。。。。我发了三个论坛的飞思卡尔社区都没一个人搭理我~~~哎~~~~流程的话明天我看看能不能帮到你~~~

使用特权

评论回复
9
enjoylife2017| | 2015-9-5 22:29 | 只看该作者
O(∩_∩)O谢谢。不过我要告诉你一个又气又笑的是。今晚6点左右我是调通了的。可以正确的去读我的32G的内存卡的第一扇区的。真的,但是当我在往后写的时候,不知怎么的,我突然发现在第一扇区的第5排开始有一个数据没传输出来,但是刚才都是好的,我就把32G的卡格式化了一下,结果第一扇区的数据就是看不到了。只看到最后一排数据的55AA。真是郁闷啊!我截个图给你看。

00.jpg (245.49 KB )

00.jpg

使用特权

评论回复
10
enjoylife2017| | 2015-9-5 22:31 | 只看该作者
图片里可以清楚地看到数据只看到55AA,也就是第一扇区的最后4个数据,其余的就是不出来。哎。我的QQ是1170430934,交流一下吧。

使用特权

评论回复
11
FSL_TICS_ZJJ| | 2015-9-6 13:11 | 只看该作者
楼主你好!
你这个问题的确比较复杂。
这样,建议你把这个问题同时提交到飞思卡尔的英文论坛。网址是https://community.freescale.com/welcome 谢谢。那边会有来自全球的飞思卡尔熟悉SDHC以及相关FAT文件的工程师帮你解答。
问题描述请采用英文书写方式。

使用特权

评论回复
评论
雨思小米粥 2015-9-14 16:14 回复TA
老大,可以结帖了。答案置顶到二楼了 
12
雨思小米粥|  楼主 | 2015-9-7 21:21 | 只看该作者
enjoylife2017 发表于 2015-9-5 22:31
图片里可以清楚地看到数据只看到55AA,也就是第一扇区的最后4个数据,其余的就是不出来。哎。我的QQ是11704 ...

:)MY GOD!!!!!!小米粥

使用特权

评论回复
13
雨思小米粥|  楼主 | 2015-9-7 21:23 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-9-6 13:11
楼主你好!
你这个问题的确比较复杂。
这样,建议你把这个问题同时提交到飞思卡尔的英文论坛。网址是https: ...

:L好的,我估计得翻译一会儿了~~~~哈哈哈谢谢啦~~~

使用特权

评论回复
14
enjoylife2017| | 2015-9-7 22:46 | 只看该作者
我的问题解决了。原因是我的程序是对的。然而我给的CMD17的参数是0,他读的是物理扇区的数据,不是逻辑扇区0的数据,当然就不是启动扇区的数据了。我之前用的是中文版的WINHEX,他不给力呀,我用了英文版的winhex就看见了我读到的是物理0扇区。

使用特权

评论回复
15
FSL_TICS_ZJJ| | 2015-9-8 09:27 | 只看该作者
enjoylife2017 发表于 2015-9-7 22:46
我的问题解决了。原因是我的程序是对的。然而我给的CMD17的参数是0,他读的是物理扇区的数据,不是逻辑扇区 ...

那么还是读取软件的问题了。
好的,感谢你的经验分享。

使用特权

评论回复
16
雨思小米粥|  楼主 | 2015-9-8 21:22 | 只看该作者
enjoylife2017 发表于 2015-9-7 22:46
我的问题解决了。原因是我的程序是对的。然而我给的CMD17的参数是0,他读的是物理扇区的数据,不是逻辑扇区 ...

:(英文版的???我也试试~~

使用特权

评论回复
17
enjoylife2017| | 2015-9-8 23:10 | 只看该作者
你试了有结果没?用英文版,就会打开物理驱动器里的SD卡,看图吧。

000.png (134.87 KB )

000.png

使用特权

评论回复
18
香水橙| | 2015-9-15 15:56 | 只看该作者
哈哈,看完楼主的问题,就估计是硬件连线错误,不过现在说起来有点马后**的味道 :lol

奇怪,楼主2楼的问题是怎么加上去的?

使用特权

评论回复
19
雨思小米粥|  楼主 | 2015-9-15 16:48 | 只看该作者
香水橙 发表于 2015-9-15 15:56
哈哈,看完楼主的问题,就估计是硬件连线错误,不过现在说起来有点马后**的味道

奇怪,楼主2楼的问题 ...

其实刚开始出问题就检查硬件了,但是愣是没发现~~~~还是最后不经意发现的~~~
二楼是置顶帖

使用特权

评论回复
20
hipylee| | 2019-2-27 13:45 | 只看该作者
您好,看了你使用飞思卡尔驱动SD卡的帖子,我现在也在用飞思卡尔的eSDHC驱动SD卡,刚开始,不太会弄,能不能给我共享一下你的驱动源码学习一下,非常感谢。1941543816@qq.com

使用特权

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

本版积分规则

8

主题

55

帖子

1

粉丝