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;
}
就这个问题~~~读写函数基本没动。
写出来后这两天混乱的大脑清晰多了~~~
我自己再捋一遍~~~
谢谢各位大神~~~ {:sweat:} 找到错误,是个十分低级的错误~~~
今天再次看程序,看到了初始化那里,想来是不是引脚错了?拿来原理图一看,马丹~~~~~~~D1和D0引脚弄了~~~日了狗了!!!一阵激动,,,割线,单片机引脚飞线,上电测试 ——————通过!!当初原理图检查了N遍愣是没看出来~~~哎,要不然总说电工总是死在那些自己鄙视到不能再鄙视的细节上。。。 本帖最后由 bright2307 于 2015-8-30 22:13 编辑
补充一下上面没写完的“规律”
依次写入
0123456789101112131415
winhex应该显示
0123456789 A B C D E F 但是实际显示是
02138A9B46 5 7 C E D F
不一样的那些数字都是互换的~~~我再查查读写函数~~~
按这个将读出来的0扇区转化,就全是对的了~~始终不明白哪里出错了 木有人啊~~~ {{:cry:} {:cry:}
请求帮忙啊
{
请求帮忙啊 自己再顶顶 我去,一个帖子全是楼主自问自答。。。
有时候犯的一些低级错误真的是让人抓狂,检查了好几遍都没有发现,调试却怎么都过不了 落叶随风 发表于 2015-9-14 16:38
我去,一个帖子全是楼主自问自答。。。
有时候犯的一些低级错误真的是让人抓狂,检查了好几遍都没有发现, ...
哈哈,当时真的是急得没办法了,各大论坛都发了~~~不过总算是解决了 这里分享楼主的最终的问题原因便于大家参考,来自楼主自己的在其他坛子的分享:
找到错误,是个十分低级的错误~~~
今天再次看程序,看到了初始化那里,想来是不是引脚错了?拿来原理图一看D1和D0引脚弄了,割线,单片机引脚飞线,上电测试 ——————通过!!当初原理图检查了N遍愣是没看出来~~~哎,要不然总说电工总是死在那些自己鄙视到不能再鄙视的细节上。。 本帖最后由 bright2307 于 2015-9-18 15:13 编辑
FSL_TICS_ZJJ 发表于 2015-9-17 16:02
这里分享楼主的最终的问题原因便于大家参考,来自楼主自己的在其他坛子的分享:
找到错误,是个十分低级的错 ...
每个帖子都回了啊~~~这里的答案也顶二楼了~~
答案里里少了一个字~~~是引脚弄反了{:cry:} bright2307 发表于 2015-9-18 15:11
每个帖子都回了啊~~~这里的答案也顶二楼了~~
答案里里少了一个字~~~是引脚弄反了...
好的,硬件非常重要,遇到问题的时候,一定要先检查自己的硬件,只有硬件没有问题,再检查软件情况。
页:
[1]