搜索
bottom↓
回复: 11

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

[复制链接]

出0入0汤圆

发表于 2015-8-30 21:57:26 | 显示全部楼层 |阅读模式
本帖最后由 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的程序)

  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. }
复制代码



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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2015-9-14 16:11:18 | 显示全部楼层
找到错误,是个十分低级的错误~~~

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

出0入0汤圆

 楼主| 发表于 2015-8-30 22:09:28 | 显示全部楼层
本帖最后由 bright2307 于 2015-8-30 22:13 编辑

补充一下上面没写完的“规律”
依次写入
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入0汤圆

 楼主| 发表于 2015-8-31 19:32:38 来自手机 | 显示全部楼层
木有人啊~~~

出0入0汤圆

 楼主| 发表于 2015-9-2 13:29:45 | 显示全部楼层
{
请求帮忙啊

出0入0汤圆

 楼主| 发表于 2015-9-3 21:39:10 | 显示全部楼层

{  
请求帮忙啊

出0入0汤圆

 楼主| 发表于 2015-9-4 11:26:05 | 显示全部楼层
自己再顶顶

出0入0汤圆

发表于 2015-9-14 16:38:51 | 显示全部楼层
我去,一个帖子全是楼主自问自答。。。
有时候犯的一些低级错误真的是让人抓狂,检查了好几遍都没有发现,调试却怎么都过不了

出0入0汤圆

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

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

出0入0汤圆

发表于 2015-8-30 21:57:27 | 显示全部楼层
这里分享楼主的最终的问题原因便于大家参考,来自楼主自己的在其他坛子的分享:
找到错误,是个十分低级的错误~~~

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

出0入0汤圆

 楼主| 发表于 2015-9-18 15:11:25 | 显示全部楼层
本帖最后由 bright2307 于 2015-9-18 15:13 编辑
FSL_TICS_ZJJ 发表于 2015-9-17 16:02
这里分享楼主的最终的问题原因便于大家参考,来自楼主自己的在其他坛子的分享:
找到错误,是个十分低级的错 ...


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

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

出0入0汤圆

发表于 2015-9-21 10:04:04 | 显示全部楼层
bright2307 发表于 2015-9-18 15:11
每个帖子都回了啊~~~这里的答案也顶二楼了~~

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

好的,硬件非常重要,遇到问题的时候,一定要先检查自己的硬件,只有硬件没有问题,再检查软件情况。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 23:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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