430读写SD卡

6楼
SPI 接口的通信方式是:
写数据:主机MOSI向从机发SCK和MOSI数据。不理会MISO.
读数据:主机向从机发SCK,并读取MISO的数据。不理会MOSI。

430的SPI我用过,我的测试方法是这样的。
将430的SPI口的MIOS,MOSI相连。
用下面的程序测试

//输入SPI输出数据,返回SPI 8CLK 的读数。
unsignd char SPI(unsiged char OutData);

unsigned char a,i;
for(i=0; i<128; i++)
{
a=SPI(i);
}

我当时测的结果是这样的。
OUT IN
0    xx
1   0
2   1
3   2
......
SPI是一个8位的移位寄存器,只有8BIT满了后,我们的程序才读得出来,
但是上面的例子中,写的同时马上读,是读不到的,原因是从8位的移位寄存器到总线要1个以上的CPU时钟才可。
你先把你的SPI训服了,再弄你的SD卡。
7楼
程序通过了,发出复位命令后就收到正确的响应了。
确实是SPI的事!
可是又发现问题

430发出命令计算卡容量:cardSize=MMC_ReadCardSize();计算出的结果是2032 664 576bytes
但是卡放入读卡器中用WinHex查看,它给出的结果是Free Space:2030 960 640bytes,Total Capacity(总容量):2031 226 368bytes。(这个Free Space是总容量减去文件系统所占的容量后的真正的数据区容量)。问题就是430计算的卡容量与用WinHex查看的结果不一致。

我觉得这个卡容量的误差倒是不大,可能是两个程序计算容量的算法上的不一致。更要命的问题是,430执行写SD卡命令mmcWriteSector(266240, buffer); (266240是我用WinHex查看SD卡真正数据区的开始地址,前面是引导扇区、FAT和根目录区),然后执行读SD卡命令mmcReadSector(266240, bbuffer);用cspy中watch查看buffer和bbuffer两个数组,发现内容确实一样,但是我用WinHex查看查看SD卡地址266240,没有写入任何数全是0!

不知debug对这种现象有什么高见
再次感谢debug的解释,谢谢您
8楼
实读:  2032 664 576bytes  79280000
WinHex:2030 960 640bytes  790E0000  
相差1A0000 1.625MByte
如果你可以确定你写入数据到SD卡后,读的回的Buffer不是同一个缓冲区,或是同一个缓冲区但清0过。那就可以证明你的R/W 没有问题。

另外你用WinHex查看下下这两下扇,有没有一个是你想要的数据:
266240 + (0x1A0000 / 512)
266240 - (0x1A0000 / 512)
9楼
看到了,[em05]
相差了249个扇区!我怎么就没想到在附近的扇区看看是否有数。

这样的话,按照块地址来写数据,在做文件系统时就很麻烦。假设做成文件的话,文件大小为一个簇,在数据区的一个簇写入数据,同时在FAT1FAT2中标记一个字节和在根目录中占用32个字节,而SD卡写操作只能以扇区的首地址写入,但是在FAT1FAT2中430必须在指定地址写一个字节(根目录也是一样)。这样的话用430以文件形式存储在SD卡将很难实现

是不是只能做一个文件大小正好为512个簇?(这样在FAT中可以直接写)
10楼
这是一个FAT16文件系统的源码,你试试把你的读/写扇区的函数改到里面,再继续玩你的SD卡。
有几点注意:
1.扇区 不等于 簇,在FAT系统中记录的是簇号。 一个簇由多个扇区组成。在调试FAT16文件系统,时你最好在网上下一个关于 磁盘文件系统 的资料放在一边参考。
2.在FAT系统读写文件总是有问题时,记得对SD卡做一下格式化,但一定要选择FAT16类型,通常默认的是FAT32的。
[img]../images/fileType/rar.gif[/img]此主题相关文件 [url=../../upload/software/FAT16.rar]FAT16.rar[/url]
11楼
太感谢了,debug。文件系统程序写的好清楚!佩服佩服啊 Orz

我刚才试了一下,就是RAM小了点
那个全局变量BUFFER占用了512字节
看来得换一个1610了,149是不行了

电脑版 Page created in 0.0781 seconds width 2 queries.