对卡读一个或多个块通过发送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转换的片子数据一样的。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)