查看: 2414|回复: 8
FLASH写入和读出的数据不一样,求助
用51模拟SPI写FLASH,数据读出和写入不同。附上代码:
#include ®52.h&
#include &intrins.h&
#include &stdio.h&
#define uchar unsigned char
unsigned char ID1,ID2;
unsigned char& & BUSY;& & //判忙碌
unsigned long Addre24;& & //24位的Flash地址
//& &----W25X系统Flash读写---SUNYA注----
sbit CS& && && & = P3^7; //选通&&
sbit DIO& && && &= P3^6;&&//单片机输出
sbit DO& && && & = P3^5; //FLASH输出
sbit SCLK& && &&&= P3^4; //时钟
#define W25X_ReadStatus& && & 0x05&&//读状态寄存器
#define W25X_WriteStatus& && &0x01&&//写状态寄存器
#define W25X_ReadDATA8& && &&&0x03&&//普读_数据
#define W25X_FastRead& && && &0x0B&&//快读_数据
#define W25X_Write& && && && &0x02&&//写_数据_0~255个字节
#define W25X_S_Erase& && && & 0x20&&//扇区擦除4KB
#define W25X_B_Erase& && && & 0xD8&&//块区擦除64KB
#define W25X_C_Erase& && && & 0xC7&&//整片格式化
#define W25X_PowerDown& && &&&0xB9&&//待机
#define W25X_PowerON_ID& && & 0xAB&&//开机或是读ID
#define W25X_READ_ID& & 0x90&&//读ID
#define W25X_JEDEC_ID& && && &0x9F&&//十六位的JEDEC_ID
#define W25X_WriteEnable& && &0x06&&//写充许
#define W25X_WriteDisable& &&&0x04&&//写禁止
#define W25X_BUSY& && && && & 0x01&&//FLASH忙
#define W25X_NotBUSY& && && & 0x00&&//FLASH闲 这是自定义的
//*********************************************** OK
void Send_OneByte(unsigned char DATA8) //从SPI发8位数
{& && && && && &&&//上升沿写入
& & SCLK=0;
& &for (x=0;x&8;x++)
//&&DATA8=DATA8&&1;
&&_nop_();&&
&&if(DATA8&0x80)
&&DATA8=DATA8&&1;
&&_nop_();
//***********************************************&&OK
unsigned char Read_OneByte(void)& &&&//从SPI收8位数
& &{& && && && && &//下降沿输出
& &unsigned char DATA8;
//& &DATA8=0;
//& &DO=0;
& &SCLK=1;
& &for (x=0;x&8;x++)
&&_nop_();
&&_nop_();
&&_nop_();
&&_nop_();
&&_nop_();
&&_nop_();
&&_nop_();
&&SCLK=0;&&
&&DATA8=(DATA8&&1)|DO;&&
& &return (DATA8);
//*************** 写允许 ****************************&&OK
void WriteEnable&&(void)
& &Send_OneByte(W25X_WriteEnable);&&
//*************** 写禁止 **************************** OK
void WriteDisable (void)
& &Send_OneByte(W25X_WriteDisable);&&
//***************判BUSY********************************
unsigned char W25X_BUSY_OrNot (void) //在读和写之前得先判断FLASH是否BUSY
& &{& && && && & //BUSY的原因是擦除,或是连续读写
& && && && & //如果没有以上方式,不必判定可以写读&&
//& &PCA0CPH2 = 0x00;
& &SCLK=1;
& &_nop_();
& &Send_OneByte(W25X_ReadStatus);&&//读状态寄存器
& &k=Read_OneByte();&&//读一个字节
& &k=k&0x01;
& &CS=1;_nop_();
& &SCLK=1;
& &if(k)return (W25X_BUSY);
& &else return (W25X_NotBUSY);
& &} //end of check BUSY
//***********************************************
void W25X_Flash_Byte_Write(unsigned long Addre24,unsigned char dat)
& &{& && &
uchar addr1,addr2,addr3;
addr3=Addre24&&16;
addr2=Addre24&&8;
addr1=Addre24;& &&&
& &while(W25X_BUSY_OrNot ()&&);&&//判BUSY 等到Flash闲才能操作
& &WriteEnable();& &//写允许
& && &//把地址拆开来
& &Send_OneByte(W25X_Write);&&//命令
& &Send_OneByte(addr3);
& &Send_OneByte(addr2);
& &Send_OneByte(addr1);
& &Send_OneByte(dat);
& &CS=1;& &
& &WriteDisable ();
& &}&&//写FLASH结束
//***********************************************
unsigned char W25X_Flash_Byte_Read (unsigned long Addre24)&&//从Flash里读出小于256字节数
& &uchar addr1,addr2,addr3;
addr3=Addre24&&16;
addr2=Addre24&&8;
addr1=Addre24;
//& &while(W25X_BUSY_OrNot ());&&//判BUSY
& &WriteEnable();
& &Send_OneByte(W25X_ReadDATA8);//命令读
& &Send_OneByte(addr3);
& &Send_OneByte(addr2);
& &Send_OneByte(addr1);
temp=Read_OneByte();
& &WriteDisable ();&&
//**************片擦除 (MAX_80S)****************** OK
void W25X_ChipErase(void)
&&WriteEnable();& &//写允许
&&Send_OneByte(W25X_C_Erase);//整片擦除命令
&&CS=1;& &//从CS=1时开始执行擦除&&
//*************** 4K扇擦除************************ OK
void W25X_SectorErase(unsigned long Addre24) //擦除资料图示的4KB空间
& &unsigned char Addre3;
& &unsigned char Addre2;
& &unsigned char Addre1;
& &WriteEnable();& &//写允许
& &Addre1=Addre24;
& &Addre24=Addre24&&8;
& &Addre2=Addre24;
& &Addre24=Addre24&&8;
& &Addre3=Addre24;& &//把地址拆开来
& &SCLK=1;
& &Send_OneByte(W25X_S_Erase);//整扇擦除命令
& &Send_OneByte(Addre3);
& &Send_OneByte(Addre2);
& &Send_OneByte(Addre1);
//*************** 64K页/块擦除************************* OK
void W25X_BlockErase(unsigned long Addre24) //擦除资料图示的64KB空间
& &unsigned char Addre3;
& &unsigned char Addre2;
& &unsigned char Addre1;
& &WriteEnable();& &//写允许
& &Addre1=Addre24;
& &Addre24=Addre24&&8;
& &Addre2=Addre24;
& &Addre24=Addre24&&8;
& &Addre3=Addre24;& &//把地址拆开来
& &SCLK=1;
& &Send_OneByte(W25X_B_Erase);//整扇擦除命令
& &Send_OneByte(Addre3);
& &Send_OneByte(Addre2);
& &Send_OneByte(Addre1);
//******************************************************** OK
void Delay_ms(unsigned int ms) //ms级延时
&&while(ms--)
& &for(i=0;i&110;i++);
void&&W25X_Flash_ID_Read ()
& &while(W25X_BUSY_OrNot ());&&//判BUSY
& &Send_OneByte(W25X_READ_ID);
& &Send_OneByte(0x00);
& &Send_OneByte(0x00);
& &Send_OneByte(0x00);
& &ID1=Read_OneByte();&&
& &ID2=Read_OneByte();
& &CS=1;& &
unsigned char W25X_Status ()
{& && && && &
& && && && &&&
& &SCLK=1;
& &_nop_();
& &Send_OneByte(W25X_ReadStatus);&&//读状态寄存器
& &k=Read_OneByte();&&//读一个字节
void W25X_Flash_Status_Write()
& &while(W25X_BUSY_OrNot ()&&);&&//判BUSY 等到Flash闲才能操作
& &WriteEnable();& &//写允许
& &SCLK=1;& &&&
& &Send_OneByte(W25X_WriteStatus);&&//命令
& &Send_OneByte(0x80);
void main()&&
&&TMOD=0X20;
&&TH1=0XFD;
& && &&&TL1=0XFD;
& && &&&TR1=1;
& && &&&REN=1;
& && &&&SM0=0;
& && &&&SM1=1;
//& &&&W25X_ChipErase();& && && &&&//片擦除
& &W25X_SectorErase(0);& &//4K擦除& && && &
////& &W25X_BlockErase (Addre24);& &//64K块擦除
& &&&W25X_Flash_Byte_Write(0,0xaa);&&//存储数据
//&&while(W25X_BUSY_OrNot ());
while(1)& && &
//&&W25X_Flash_Byte_Write(0xaaaaaa,0xaa);
&&Delay_ms(100);
//&&Send_OneByte(0xaa);
//&&while(!RI);
&&SBUF=W25X_Flash_Byte_Read (0);
&&while(!TI);
主要是什么不一样,说的详细点
我做了一部分测试,
输入& && &&&输出
0xa0& && &&&0x81
0xb0& && &&&0xa1
0xc0& && &&&0xc0
0xd0& && &&&0xc1
0x20& && &&&0x01
0x0a& && &&&0x03
0x0b& && &&&0x07
0x0c& && &&&0x09
0x0d& && &&&0x0b
0x0e& && &&&0x0d
还有就是输入0xf0~0xf9 ,0xfb~0xff,0x0f~0x09,0x0b~0x0f,,,输出都对
现象就是这样
楼主,你的问题解决了没,我也遇到了和你一样的问题
我没细看你的程序,自己查查。stc的片内eeprom写之前,必须要擦除以后再写,不然就是乱的,
看看地址有没有对应上
STC的 我遇到的好像是先清零 在写1再清然后写入新的数据 不然多出来乱码 不是每次都乱码 偶尔会的那种
你的问题解决了没,我也遇到了和你一样的问题
解决步骤:
1.你使用的mCU是51系列的吧,看这些管脚和别的是否用冲突,
2. W25Xxx系列的FLASH是片擦除,扇区擦除,
3.写完之后要稍等几个ms然后回读比较
4.参考FLASH的手册检查你的驱动程序流程是否正确,
5.驱动程序中的延时是否合理,要和FLASH的手册想比对
Powered by[多图]Xbox One多任务和快读加载功能的视频展示_Microsoft XBOX_cnBeta.COM
尽管微软没有透露太多有关Xbox One多任务的镜头,但是YouTube上已经有用户上传了一则展示Xbox One多任务和性能改进的视频。该视频的上传者名叫Jackson Carter,其展示了一个测试版本的Xbox One、以及Crytek的第三人称视角动作游戏&Ryse&----该游戏将在11月22号与Xbox One一同推出。得益于微软吹捧的下一代主机架构,该游戏几乎&瞬间&就完成了加载。而一按下Xbox logo按键,该主机就返回到了Dashboard页面。
访问:Carter表示,游戏其实还一直在运行,并没有退出。只不过,鉴于软件仍处于beta阶段,因此bug也还非常多。除了多任务,Carter还向大家展示了 One的Dashboard----这也是微软在(Gamescom)上秀过的。其设计大量借鉴了Windows 8和Windows Phone上的Metro风格。与Xbox 360相比,Xbox One的Dashboard更为简化,仅使用了3个窗格----固定区、常用任务区、以及商店区----而当前的Xbox 360上总共有8个窗格区域。(遗憾的是,在发稿前,源视频就已经被上传者自行删除了)[编译自: , 来源:]
对文章打分
[多图]Xbox One多任务和快读加载功能的视频展示
阅读 (38619) 评论 (5)
阅读 (27242) 评论 (7)
阅读 (23356) 评论 (3)
阅读 (51775) 评论 (13)
阅读 (38655) 评论 (5)
阅读 (31970) 评论 (3)
Advertisment ad adsense googles cpro.baidu.com已被0人收藏
&数据大转移完成! 累死了,光驱都快读坏了
来自:保密
200多张dvd光盘数据。通过2台光驱转移到新买的1T台式硬盘
其中2张光盘无法读取
-------------------------------------------------------------------------------------------
渺渺紫金阕,太微玉清宫
...楼主...
来自:保密
发帖:1+73
嘎许多动作片啊
-------------------------------------------------------------------------------------------
来自:保密
剩余空间不到100G
-------------------------------------------------------------------------------------------
渺渺紫金阕,太微玉清宫
来自:保密
嘎许多动作片啊
不是,全部是APE
-------------------------------------------------------------------------------------------
渺渺紫金阕,太微玉清宫
首先,请你以一种,团成一个团的姿势,然后,慢慢地比较圆润的方式,离开这座让你讨厌的城市,或者讨厌的人的周围首先,请你以一种,团成一个团的姿势,然后,慢慢地比较圆润的方式,离开这座让你讨厌的城市,或者讨厌的人的周围
数据大转移完成! 累死了,光驱都快读坏了
扫描关注官方微信
扫描下载客户端
你可以发私信给一个或多个听众。默认不能发给非听众,除非对方设置了允许。
奖励分值:您今日还有 3 点分值可以奖励 [ 20 点奖分可自动换取 1 点PP]
请输入4位有相同表情的数字
&违反国家法律&&&&&&&&&含有***内容
&对他人进行恶意攻击
&散布广告以及其它商业化的宣传
&干扰或混乱kds宽带山网络服务
&发布任何包含种族、 性别、宗教歧视性和猥亵性的信息内容
&恶意刷屏&&&&&&&&&&&&&&&内容重复&&&&&&&&&&&&&&&攻击管理员
&本人要求删除&&&&&&&&当事人要求删除
&与主题无关&&&&&&&&&&&水贴软文&&&&&&&&&&&涉及敏感政治内容
&被要求删除,你懂的&&&&&&&&&&&盗号并发布违规或广告内容
扣除hp值:
宽带山警务室
&恶意刷屏&&&&&&&&&水贴软文
&违反国家法律
&含有***内容
&对他人进行恶意攻击
&散布广告以及其它商业化的宣传
&干扰或混乱kds宽带山网络服务
&发布任何包含种族、 性别、宗教歧视性和猥亵性的信息内容
&网页不能打开
&图片不能显示
已报名参加的人员: