GNS3中华为a1路由器测评c7200已添加pa-a1模块,为什么没有atm接口?

Windows7读取SD卡时导致数据损坏的修复
Windows7读取SD卡时导致数据损坏的修复
  据国外媒体报道,日前,微软针对最新一代客户端操作系统Windows7发布了一个更新,用于解决运行在Windows 7上的安全数字卡(SD)中的数据损坏问题。  目前,所有使用Windows 7的消费者都能够通过微软下载中心下载这个更新,适用于所有Windows 7版本的用户。  据微软表示,一般来讲,只有使用NTFS格式SD卡的用户,才会受到数据损坏问题的影响。  至于导致这个问题的原因,微软解释道,当用户使用高级直接闪存(ADMA)访问去实现SD卡和Windows7之间的数据传输的时候,数据损坏问题就会出现。  微软发言人指出,在ADMA传输过程中,安全数字总线驱动器(Sdbus.sys)会将操作系统的DMA数据结构转换成SD卡的ADMA数据结构。DMA和ADMA数据结构也被称为描述符表,描述符表包含一个数据长度值和缓冲区的地址。  一般来讲,数据长度字段是16位,最大大小是64K(字节)。然而,在数据转换过程中,Sdbus.sys驱动程序不检查在系统的描述符表缓冲区的大小。因此,Sdbus.sys驱动程序可能会将SD描述符表的数据长度设置错误。例如,Sdbus.sys驱动程序可能会将数据长度的值设置成大于0xFFFF,紧接着就会损坏的I/O,这也就会导致数据损坏。
&&&主编推荐
H3C认证Java认证Oracle认证
基础英语软考英语项目管理英语职场英语
.NETPowerBuilderWeb开发游戏开发Perl
二级模拟试题一级模拟试题一级考试经验四级考试资料
软件测试软件外包系统分析与建模敏捷开发
法律法规历年试题软考英语网络管理员系统架构设计师信息系统监理师
高级通信工程师考试大纲设备环境综合能力
路由技术网络存储无线网络网络设备
CPMP考试prince2认证项目范围管理项目配置管理项目管理案例项目经理项目干系人管理
职称考试题目
招生信息考研政治
网络安全安全设置工具使用手机安全
生物识别传感器物联网传输层物联网前沿技术物联网案例分析
Java核心技术J2ME教程
Linux系统管理Linux编程Linux安全AIX教程
Windows系统管理Windows教程Windows网络管理Windows故障
数据库开发Sybase数据库Informix数据库
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&查看: 4536|回复: 9
终于实现51单片机读SD卡的逻辑0扇区高兴
呵呵!今天晚上真是走运啊,我12月8日开始的做SD读实验,到今天晚上11:00才做出来啊,其中写片115次,变过四次程序,连着三晚上没睡好觉,两天偷偷的没去上班在宿舍做实验,终于搞定读逻辑0扇区了!我算是受够了,但是这几天每天晚上都在找资料,请老师,可是真是那句话,靠谁也不如靠自己,别人是不了解你的实际情况的,在这里我真的很感谢网络,有了它,我在千千万万的资料中找到了最有用的几分,然我得意找到钥匙。
接下来说下SD卡(microsd)读DBR:
SD卡作为一种存储设备早在应用了,但是关于SD卡我还是在做完12864显示以后才发现,光显示图片有啥意思?不如来点动画,呵呵殊不知存储空间收到限制了,一幅BMP图片要1KB的存储空间,我的存储容量是8K,呵呵,很显然是不行的,有没有一种大容量小体积便携,便于PC操作的存储设备那?指向了SD卡,一代的可以最大存储4GB,这是相当海量的,也是很理想的,决定后看了关于FAT32的文件系统,感觉真是很难,不过,也大抵能找到根目录,FAT表和数据区,接下来是做实验搭模块,开始看了关于SD卡的资料,网上资料很多,我看了大多泛泛而谈,没做过的,即使看了还是无处下手,我经验如下:1.首先要了解SPI通信,因为他是基础,要靠他来完成数据交换,其实SPI也没什么,个人感觉比异步简单老鼻子了,关键是SD卡中数据发送时上升沿,数据接收是下降沿,记好了,期间一定要保证数据的稳定,且在写时MISO线要保持高电平,读时MOSI要保持高电平,2,写命令是公六字节,最先发送的是指令代码(高位先发)然后是参数,对于参数是地址的则按地址字节最高字节在前,以此类推,例如:ADD=0x,那么先要发送01,在发02,在发03在发04;最后发CRC效验,当然这里默认为FF,不用管它;3,先调复位SD卡,然后再调初始化,在调读,这里注意,当你初始化复位时,时钟一定要慢,当要读扇区是一定要提高时钟频率,要不非得操蛋不可,当调好复位初始化后,先做个试验,读取0扇区的值,当然这里指的是读物理扇区,如果读到扇区的最后两个字节是55AA,那恭喜你,你的程序没问题了,但是FAT文件系统要的是逻辑0扇区的BPB(系统引导记录),所以你要用软件打开磁盘找到PHYSICALL SECTOR NO:和LOGICAL SECTOR NO:即物理扇区和逻辑扇区,例如我的是253&&0:表示什么呢?表示逻辑扇区0在物理253扇区,所以找到253扇区就找到逻辑0扇区了,那怎样找?又要注意了,SD卡的读操作的寻址是按字节一扇区来的,所以要吧扇区转换成字节,一扇区是512字节,那么逻辑0扇区的物理地址为253*512=129536;吧这个值写入SD卡然后读出来就是逻辑0扇区的值;一个也不搭茬;找到了逻辑0扇区就找到了进入FAT32文件系统的第一步,也是一把非常重要的钥匙,但是离最终的文件寻址还差的远,要是没这一步,文件寻址是不可能的!还证明了,WINheBUbub不能显示物理0扇区,只能显示逻辑0扇区,嘻嘻!
下面是源码、、、我用的是手机内存卡1GB
#include &reg52.h&
#define uchar unsigned char
#define uint unsigned int
sbit p1_7=P1^7;
sbit CS=P2^0; //片选信号(低电平有效)
sbit DATEIN =P2^1;//主-从数据输入
sbit SCLK=P2^2;//时钟信号
sbit DATEOUT=P2^3;//从-主数据输出
sbit led4=P1^0;
sbit led3=P1^1;& & //日与天津开发区
sbit led2=P1^2;
sbit led1=P1^3;
uchar g=0,s=0,bw=0,q=0; //显示单元 个位、十位、百位、千位
uchar code tab1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//不带小数点显示0~9
uns
sbit dat_0=dat^0;
sbit dat_1=dat^1;
sbit dat_2=dat^2;
sbit dat_3=dat^3;
sbit dat_4=dat^4;
sbit dat_5=dat^5;
sbit dat_6=dat^6;
sbit dat_7=dat^7;
bit is_//决定是否延时;
&&
//返回值
uchar fhz_ //读返回值中间量
unsigned char xdata tab[512];
void delay(uint time)
{&&while(time)
&&time--;
}
//**********************************************
/*读sd卡子程序,无返回值,有参函数,参数为要写入DATEIN数据线的字节*/
void write(unsigned char wr_)// 写入一个字节SD卡
{
& && && &&&dat=wr_;
& && &&&DATEIN=dat_7;
& &
& && &SCLK=0;
& &if(is_init)delay(200);
& &&&if(!is_init)delay(2);
& && &SCLK=1;
& && &if(is_init) delay(200);
& && & if(!is_init)delay(2);
&&
& && &DATEIN=dat_6;
& &
& && &SCLK=0;
& &&&if(!is_init)delay(2);
& & if(is_init)delay(200);
& && &SCLK=1;
& && &if(is_init) delay(200);
& &&&if(!is_init)delay(2);
& && &DATEIN=dat_5;
& &
& && &SCLK=0;
& & if(is_init)delay(200);
& &&&if(!is_init)delay(2);
& && &SCLK=1;
& && &if(is_init) delay(200);
& & if(!is_init)delay(2);
& && &DATEIN=dat_4;
& &
& && &SCLK=0;
& & if(is_init)delay(200);
& && &if(!is_init)delay(2);
& && &SCLK=1;
& && &if(is_init) delay(200);
& &&&if(!is_init)delay(2);
& &&&DATEIN=dat_3;
& &
& && &SCLK=0;
& & if(is_init)delay(200);
& && &if(!is_init)delay(2);
& && &SCLK=1;
& && &if(is_init) delay(200);
& & if(!is_init)delay(2);
& &&&DATEIN=dat_2;
& &
& && &SCLK=0;
& & if(is_init)delay(200);
& && &if(!is_init)delay(2);
& && &SCLK=1;
& && &if(is_init) delay(200);
& && &if(!is_init)delay(2);
& & DATEIN=dat_1;
& &
& && &SCLK=0;
& & if(is_init)delay(200);
& &&&if(!is_init)delay(2);
& && &SCLK=1;
& && &if(is_init) delay(200);
& &&&if(!is_init)delay(2);
& & DATEIN=dat_0;
& &
& && &SCLK=0;
& & if(is_init)delay(200);
& && &if(!is_init)delay(2);
& && &SCLK=1;
& && &if(is_init) delay(200);
& &&&if(!is_init)delay(2);
}
unsigned char read()// 读取一个字节SD卡
{
& && && & DATEOUT=1;
& && && &SCLK=1;
& &if(is_init)delay(200);
& &&&if(!is_init)delay(2);
& &SCLK=0;
& & if(is_init)delay(200);
& &if(!is_init)delay(2);
& & dat_7=DATEOUT;
& &&&SCLK=1;
& &if(is_init)delay(200);
& &if(!is_init)delay(2);
& &SCLK=0;
& & if(is_init)delay(200);
& &&&if(!is_init)delay(2);
& & dat_6=DATEOUT;
& & SCLK=1;
& &if(is_init)delay(200);
& & if(!is_init)delay(2);
& &SCLK=0;
& & if(is_init)delay(200);
& & if(!is_init)delay(2);
& & dat_5=DATEOUT;
& & SCLK=1;
& &if(is_init)delay(200);
& &&&if(!is_init)delay(2);
& &SCLK=0;
& & if(is_init)delay(200);
& &if(!is_init)delay(2);
& & dat_4=DATEOUT;
& &&&SCLK=1;
& &if(is_init)delay(200);
& & if(!is_init)delay(2);
& &SCLK=0;
& & if(is_init)delay(200);
& &&&if(!is_init)delay(2);
& & dat_3=DATEOUT;
& & SCLK=1;
& &if(is_init)delay(200);
& && & if(!is_init)delay(2);
& &SCLK=0;
& & if(is_init)delay(200);
& && & if(!is_init)delay(2);
& & dat_2=DATEOUT;
& &&&SCLK=1;
& &if(is_init)delay(200);
& && &&&if(!is_init)delay(2);
& &SCLK=0;
& & if(is_init)delay(200);
& && & if(!is_init)delay(2);
& & dat_1=DATEOUT;
& &&&SCLK=1;
& &if(is_init)delay(200);
& && && &if(!is_init)delay(2);
& &SCLK=0;
& & if(is_init)delay(200);
& && && & if(!is_init)delay(2);
& & dat_0=DATEOUT;
& &return (dat);
void restsd()//复位SD卡
{&&
uchar pcmd[6]={0x40,0x00,0x00,0x00,0x00,0x95};
is_init=1;
for(i=0;i&15;i++)
{
& && & //120时钟
& &write(0xff);
&&
&&
& && &CS=1;
& &write(0xff);//据说是提高兼容性
& &CS=0;//片选开
& &write( pcmd[0]);
& &write( pcmd[1]);
& &write( pcmd[2]);
& &write( pcmd[3]);
& &write( pcmd[4]);
& &write( pcmd[5]);
& &fhz=read();
{
& &fhz=read();
& &if(fhz==0x01)
&&
&&CS=1;
&&write(0xff);
void initsd()//初始化
{
//
& &uchar pcmd[6]={0x41,0x00,0x00,0x00,0x00,0xff};//
& && &CS=1;
& &write(0xff);//据说是提高兼容性
& &CS=0;//片选开
& &write( pcmd[0]);
& &write( pcmd[1]);
& &write( pcmd[2]);
& &write( pcmd[3]);
& &write( pcmd[4]);
& &write( pcmd[5]);
&&
& &fhz=read();
{
& &fhz=read();
& &if(fhz==0x00)
&&
&&CS=1;
&&write(0xff);
void readsd()//读SD卡物理扇区
& &uchar pcmd[6]={0x51,0x00,0x01,0xfa,0x00,0xff};//原来这里是高地址字节在前地地址在后啊日
& &uint j,n;
& &CS=1;
& &write(0xff);//据说是提高兼容性
& &CS=0;//片选开
& &write( pcmd[0]);
& &write( pcmd[1]);
& &write( pcmd[2]);
& &write( pcmd[3]);
& &write( pcmd[4]);
& &write( pcmd[5]);
& &DATEOUT=1;
&&
{
& &fhz=read();
& &if(fhz==0x00)
DATEOUT=1;
& &for(;;)
{
& &fhz=read();
& &if(fhz==0xfe)
&&DATEOUT=1;
for(j=512;j;j--)
{&&
& &tab[n]=read();
& & n++;
}
fhz=read();
fhz=read();
write(0xff);
}
/*void writesd()
& &uchar pcmd[6]={0x58,0x00,0x00,0x00,0x00,0xff};
& &uint j,k;
& &CS=1;
& &write(0xff);//据说是提高兼容性
& &CS=0;//片选开
& &write( pcmd[0]);
& &write( pcmd[1]);
& &write( pcmd[2]);
& &write( pcmd[3]);
& &write( pcmd[4]);
& &write( pcmd[5]);
& &DATEOUT=1;
{
& &fhz=read();
& &if(fhz==0x00)
DATEOUT=1;
& &for(j=20;j;j--)
{
&&write(0xff);
write(0xfe);
for(j=512;j;j--)
{ k=tab[j];
& &write(k);
}
write(0xff);
write(0xff);
DATEOUT=1;
for(;;)
{
fhz=read();
if((fhz&0x0f)==0x05)
}
&&if(!DATEOUT);
{
& &write(0xff);
write(0xff);
}
*/
void delay1(uint z) //延时程序
{
uint x,a,b;
& && && &for (x=0;x&z;x++)
&&
& && & {
& && & for(b=120;b&0;b--)
& & {
& && &&&for(a=3;a&0;a--);
& &
& && && && & }
& & }
void display(uchar sd) //显示程序
& && && && & c=
& && && &&&g=(sd&0x0f);
& &
& &c=(c&&4);
& &s=(c&0x0f);
& & led1=0;
& & P0=tab1[g]; //个
& & delay1(2);
& & led1=1;
& &&&led2=0;
& & P0=tab1[s];//十
& & delay1(2);
& & led2=1;
& & led3=0;
& & P0=tab1[0];& &//百
& & delay1(2);
& & led3=1;
& && && && && &&&led4=0;
& & P0=tab1[0];& & //千
& & delay1(2);
& & led4=1;
}
void delay2(void)& &//误差 -0.us
{
& & unsigned char a,b,c,n;
& & for(c=217;c&0;c--)
& && &&&for(b=225;b&0;b--)
& && && && &for(a=225;a&0;a--);
& & for(n=10;n&0;n--);
}
void main()
{
is_init=1;
restsd();
initsd();
is_init=0;//提高始终频率
p1_7=0;
//writesd();
readsd();//读物理扇区
p1_7=1;
& &btime=65536;
while(1)
{& &btime=300;
& &delay2();
{
v=tab[ad];
display(v);
btime--;
if(btime==0)
&&}
&&ad++;
&&if(ad==512)ad=0;
}复制代码以上程序仅在本人试验模块中通过,不知兼容咋样!用LED显示512字节的码形!
<font color="#ff年12月14日-12月8日历时一星期终于读出BPB,加油啊,离文件系统还差的远啊!
 感受到楼主的喜悦了,接连发了那么多帖子,祝早日成功
 感受到楼主的喜悦了,接连发了那么多帖子,祝早日成功
时空穿越了啊!现在就15年12月了,幸会,幸会!
有电路吗 求
楼主精神实在可嘉,加油!!
多谢!!!!
&所以你要用软件打开磁盘找到PHYSICALL SECTOR NO:和LOGICAL SECTOR NO:即物理扇区和逻辑扇区&,请教一下楼主:你是怎么查看物理扇区和逻辑扇区的?用的是什么软件。
一遍一遍的看
Powered by&#xe621; 上传我的文档
&#xe602; 下载
&#xe60c; 收藏
希望能对大家的学习和工作有所帮助,如果还有其他的疑问或需要了解更多的内容可以给我QQ或邮箱留言或发站内信,我会尽力为大家解决。
&#xe602; 下载此文档
正在努力加载中...
sd卡的读写时序
下载积分:210
内容提示:sd卡的读写时序
文档格式:DOC|
浏览次数:109|
上传日期: 22:18:42|
文档星级:&#xe60b;&#xe60b;&#xe612;&#xe612;&#xe612;
该用户还上传了这些文档
sd卡的读写时序
官方公共微信

我要回帖

更多关于 路由器pa与lna有用吗 的文章

 

随机推荐