SD卡是怎么储存数据的?

SD卡是怎么储存数据的?,第1张

SD 卡读写数据是以块为单位进行的
对卡读一个或多个块通过发送CMD17/CMD18命令来实现;
对卡写一个或多个块通过发送CMD24/CMD25命令来实现
这些数据在末尾附有CRC校验码,如果校验码失败,则所传输的数据都会被丢掉,数据的读/
写 *** 作也会被中止

Cache层
Cache原理: 使用较快的存储装置保留一份从较慢速存储装置中所读数据, 使读/写动作
先在较快速的装置上完成,这样可以提升系统的响应速度 Cache越大,响应速度越快
决定处理器成本的最主要的因素就是处理器芯片的面积

缓存的主要结构如下:
typedef struct _Disk_Cache {
U8 Drive; //表示Cache数组中某个元素的存储状态
U8 Flag; //表示某个元素可以被某种方式访问: 只读/只写/读||写
U8 RW_ID; //计数器,表示元素有多久没被访问了
U32 SecIndex; //记录被缓存的扇区的逻辑扇区索引
U8 buf[DISK_CACHE_SIZE]; //存放被缓存的扇区的具体内容
} Disk_cache;
当有读/写的需求时, 从SD卡读取的数据copy一份放到Cache数组的空闲扇区中;
如果系统继续要求读取/写入同一份数据或同一扇区时, 系统就可以直接从Cache中进行
读/写, 从而大大提高系统存取速度
每次访问Cache时, Cache数组中所有元素的RW_ID值会被加1,直至最大值;
当某个元素被访问时, 这个元素的RW_ID值被清零;
当cache数组的所有元素都已分配又有新的扇区被访问时, 找出Cache模块中RW_ID值最大
的元素分配给新的扇区作为缓存(需要回写的内容进行回写后再分配给新的扇区)
需要注意的是: 这种技术如果仅用于读数据是没问题的 但用于写数据, 即如果写入cac
he的数据不能立即写回SD卡的物理内存中, 则一旦断电会丢失数据; 若每次都将数据回
写到SD上, 则影响写速度
基于这种情况,将Cache写入的方式分为直写式和回写式
a) 直写式: 每次写入cache的同时, 把数据回写到SD卡物理内存中, 以保证cache的内容
和SD卡物理内存中相应单元的数据保持一致
b) 回写式: 只把数据写入cache(这样有可能出现cache中数据得到更新但物理内存中
数据陈旧的情况), 并在cache中通过设置Flag标明该缓冲区的数据是否需要回写; 等
系统空闲或进行cache替换时,再将数据回写到SD卡上
更多内容 >

发送单片机数据到PC,首先要编写单片机程序,再编写PC端程序接收数据保存就可以了。

下面只列出单片机发送数据到串口的程序,PC端可以用串口调试软件测试,数据格式是ASCII码格式。

已经ISIS 77sp2 Professional和虚拟串口软件仿真测试通过了。

重新优化了代码:

/单片机发送P1端口值到串口/

/数据格式为:Now P1 Status:[00000000]/

#include <reg51h>

#define uchar unsigned char

#define uint unsigned int

char str[] = "Now P1 Status:[00000000]\r";

sbit P10=P1^0;

sbit P11=P1^1;

sbit P12=P1^2;

sbit P13=P1^3;

sbit P14=P1^4;

sbit P15=P1^5;

sbit P16=P1^6;

sbit P17=P1^7;

main()

{

uint j;

//char k;

uchar i;

TMOD=0x20;     //定时器1方式2

TH1=0xfd;     //波特率9600 晶振110592MHz

TL1=0xfd;

SCON=0x50;

PCON &= 0xef;

TR1=1;

IE=0x00;

while(1)

{

//k=~P1 & 0xF0 ;  //替换P1高位显示

//k=k>>4;

//if (k < 10)

//k=k+48;

//else

//k=k+55;

//str[17]=k;

//k=~P1 & 0x0F ;    //替换P1低位显示

//if (k < 10)

//k=k+48;

//else

//k=k+55;

//str[18]=k;

str[15]=P17|48;

str[16]=P16|48;

str[17]=P15|48;

str[18]=P14|48;

str[19]=P13|48;

str[20]=P12|48;

str[21]=P11|48;

str[22]=P10|48;

i=0;

while(str[i]!='\0')//发送字符串

{

SBUF=str[i];

while(!TI);

TI=0;

i++;

}

for(j=0;j<50000;j++);

}

}

仿真图见>

从单片机上引出来三根io线,模拟spi,一根入一根出,一根sclk时钟,具体 *** 作是,sclk根据sd卡要求给出一个上升或下降沿,然后另外两根入或者出线读入或者传给sd卡输出的数据,十分简单,和读取其他spi接口的片子如某些ad转换的片子数据一样的。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13361287.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-21
下一篇 2023-07-21

发表评论

登录后才能评论

评论列表(0条)

保存