【发了好几个论坛了都没人理我~~另求飞思卡尔北京售后技术支持地址和电话(其他联系方式也行!!)】 单片机是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]复制代码
就这个问题~~~读写函数基本没动。
|