本帖最后由 bright2307 于 2015-8-30 21:58 编辑
单片机是MK30DN512Z,写完sdhc底层驱动测试没问题,测试向N扇区写入数据,然后再读出来,数据一样。
加上了ZNFAT,发现0扇区的检测没通过。于是单步调试发现buffer里面的数据跟校验的数据不对。于是将0扇区打印出来,发现了不一样。打开winhex看了看,原来我写进去的数据也不对,但是单片机读出来就是我写进去的数据——扇区应该没问题,对某扇区写0 ,就会变成全0,些其他的就会。。。看图吧。
0扇区WINhex的数据
555.PNG (55.4 KB, 下载次数: 0)
下载附件
2015-8-30 21:49 上传
总结发现,写入 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;
- }
复制代码
就这个问题~~~读写函数基本没动。
写出来后这两天混乱的大脑清晰多了~~~
我自己再捋一遍~~~
谢谢各位大神~~~
哈哈,当时真的是急得没办法了,各大论坛都发了~~~不过总算是解决了
每个帖子都回了啊~~~这里的答案也顶二楼了~~
答案里里少了一个字~~~是引脚弄反了
好的,硬件非常重要,遇到问题的时候,一定要先检查自己的硬件,只有硬件没有问题,再检查软件情况。
一周热门 更多>