中级会员
- 积分
- 322
- 威望
- 238
- 贡献
- 62
- 兑换币
- 40
- 注册时间
- 2009-3-10
- 在线时间
- 11 小时
|
4#
楼主 |
发表于 2009-5-20 20:24:11
|
只看该作者
本帖最后由 cfanfrank 于 2009-5-20 20:30 编辑
5.读数据。Cmd17是读单块命令,一次读512字节(默认是512,如果你调了块大小,这里就可能不止512了)。
sd_send_cmd(17, 0x00, 0)就是说,命令sd卡读从地址0x00开始的512字节,第二个参数是地址,需要512字节对齐(如果你的是sdhc卡,传进去的是块的编号,编号1代表地址512,编号4代表地址2048。。。)。
接下来的sd_recv_data(buf, 512);就是说,接受字节流,把它们放到buf里。
还有一个命令是多块一起读的,有需要的话,查下手册自己写吧。
一块被格式化好的sd卡,上面一般是fat文件系统,所以buf[510],buf[511]里的值是0x55, 0xaa。这个是拿来测试的。
-
- byte sd_recv_data(byte *data, word len)
- {
- static word retry;
- static byte r1;
-
- // 启动一次传输
- SD_CS = 0;
- //等待SD卡发回数据起始令牌xFE
- retry = 0;
- do
- {
- spi_read(r1);
- retry++;
- if(retry>2000) //2000次等待后没有应答,退出报错
- {
- SD_CS = 1;
- return 1;
- }
- } while (r1 != 0xFE);
-
- //开始接收数据
- while (len--) {
- spi_read(*data);
- data++;
- }
- //下面是个伪CRC(dummy CRC)
- spi_read(r1);
- spi_read(r1);
-
- //传输结束
- SD_CS = 1;
- spi_write(0xFF);
-
- return 0;
- }
-
- // 测试读
- r1 = sd_send_cmd(17, 0x00, 0);//读命令
- if (r1 != 0x00) {
- uart_printf("cmd17 failed %x\n\r", r1);
- return;
- }
- r1 = sd_recv_data(buf, 512);
- if(r1 != 0) {
- uart_printf("recv data failed %x\n\r", r1);
- return;
- }
- uart_printf("%x %x\n\r", buf[510], buf[511]);
复制代码 |
|