这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 我的X5045总也读不出呀(附程序,大家帮忙看看是不是时序不对呀)

共4条 1/1 1 跳转至

我的X5045总也读不出呀(附程序,大家帮忙看看是不是时序不对呀)

菜鸟
2007-06-10 00:52:05     打赏

我没有用看门狗功能,只做存储器用。读出的数总是不对,看看是不是我时序不对呢。

#include <AT89X051.H>
#include<stdio.h>
#include<intrins.h>
#include<math.h>
#include<absacc.h>

#define uint unsigned int
#define uchar unsigned char

//X5045
sbit CS1 = P1^7;
sbit SCK = P1^6;
sbit SO = P1^5;
sbit SI = P1^4;
#define WREN 0x06
#define WRDI 0x04
#define RDSR 0x05
#define WRSR 0x01
#define READ0 0x03
#define READ1 0x0b
#define WRITE0 0x02
#define WRITE1 0x0a

void RESWDI(void)
{
CS1=0;
CS1=1;
}

//Write Byte to spi/X5045
void write_byte(uchar edata)
{
uchar i;
SCK=0;
_nop_();
_nop_();
_nop_();
for(i=0;i<8;i++)
{
if(edata & 0x80==0)SI=0;
else SI=1;
SCK=1;
_nop_();
_nop_();
_nop_();
edata=edata<<1;
SCK=0;
_nop_();
_nop_();
_nop_();
}
}

//Read Byte from Spi/X5045
uchar read_byte(void)
{
uchar i,result;
result=0;
for(i=0;i<8;i++)
{
SCK=1;
_nop_();
_nop_();
_nop_();
result=result<<1;
if(SO==1) result|=0x01;
SCK=0;
_nop_();
_nop_();
_nop_();
}
return(result);
}

//Write enable
void WriteEN(void)
{
SCK=0;
CS1=0;
write_byte(WREN);
SCK=0;
CS1=1;
}

//reset Write enable (Disable write operations)
void WriteDI(void)
{
SCK=0;
CS1=0;
write_byte(WRDI);
SCK=0;
CS1=1;
}

//READ status register
uchar ReadSR(void)
{
uchar Temp;
WriteEN();
CS1=1;
SCK=0;
CS1=0;
write_byte(RDSR);
Temp=read_byte();
SCK=0;
CS1=1;
return Temp;
}

//check WIP 判断是否写入完成
void WIPCHK(void)
{
uchar Temp,i;
for(i=0;i<50;i++)
{
Temp=ReadSR();
if(Temp&0x01==0)
i=50;
}
}

//write status register
void WriteSR(uchar cData)
{
WriteEN();
CS1=1;
SCK=0;
CS1=0;
write_byte(WRSR);
write_byte(cData);//0x02//发送寄存器值BL0,BL1为0没写保护,WD0=0 WD1=1看门狗复位时间为200ms
SCK=0;
CS1=1;
WIPCHK();
}

//Read byte from x5045读地址中的数据,address 为读入地址//0x00-0xff
uchar R5045(uint address)
{
uchar result;
CS1=1;
SCK=0;
CS1=0;
write_byte((char)(address>255?READ1:READ0));
write_byte((char)(address&0x0ff));
result=read_byte();
SCK=0;
CS1=1;
return(result);

}

//write byte to 5045 向地址中写入数据,只能写00-FFH
void w5045(uint address,uchar udata)
{
CS1=0;
write_byte(WREN);
CS1=1;
SCK=0;
CS1=0;
write_byte((char)(address>255?WRITE1:WRITE0));
write_byte((char)(address&0x0ff));
write_byte(udata);
SCK=0;
CS1=1;
WIPCHK();
}


void main()
{
uchar s=0;
WriteEN();
_nop_();
_nop_();

WriteSR(0x30);
w5045(0x10,0x08);

// WriteDI();
ReadSR();

s=R5045(0x10);
}




关键词: 我的     X5045     不出     程序     大家     帮忙     看看         

菜鸟
2007-06-10 00:55:00     打赏
2楼

还是我主函数调用的不对呀。


菜鸟
2007-06-10 00:56:00     打赏
3楼
X5045和89C2051单片机接口
Author:胡正勇,QQ:19297445
关键词: X5045 看门狗 自动复位 子程序 状态寄存器
X25045是带有串行E2PROM的CPU监控器,型号改为X5045,性能相同.
引脚图:

CS/WDI:片选输入/看门狗复位输入;
SO:串行输出;
WP:写保护输入;
Vss:地;
Vcc:电源;
RESET:复位输出;
SCK:同步时钟输入;
SI:串行输入。
X25045的状态寄存器描述器件的当前状态,各位意义如下表所列。
7 6 5 4 3 2 1 0
0 0 WD1 WD0 BL1 BL0 WEL WIP
其中,WD1、WD0是看门狗定时时间设置位;BL1、BL0是存储单元写保护区设置位;WEL是只读标志,1表明写使能开关打开;WIP也是只读标志,1代表芯片内部正处于写周期。电复位时,各位都被清零。
X25045芯片功能包括以下4种:
(1)上电复位控制。在对X25045通电时,ERSET引脚输出有效的复位信号,并保持至少200ms,使CPU有效复位。
(2)电源电压监控。当检测到电源电压低于内部门槛电压VTRIP时,RESET输出复位信号,直至电源电压高于VTRIP并保持至少200ms,复位信号才被撤消。VTRIP的出厂值根据芯片型号不同共有5个级别的电压范围。对于需要电源电压精确监控的应用,用户可以搭建编程电路,对芯片内VTRIP电压进行微调。
(3)看门狗定时器。芯片内部状态寄存器的WD1、WD0是看门狗定时设置位,通过状态寄存器写指令WRSR修改这2个标志位,就能在3种定时间隔中进行选择或关闭定时器。对看门狗的复位由CS输入电平的下降沿完成。下表是WD1、WD0组合的含义。
WD1 WD0 看门狗定时值
0 0 1.4s
0 1 600ms
1 0 200ms
1 1 禁止看门狗工作
(4)串行E2PROM。芯片内含512字节存储单元,10万次可靠写,数据保持时间100年。XICOR设计了3种保护方式防止误写。包括:WP写保护引脚,当引脚被拉低时,内部存储单元状态寄存器都禁止写入;存储区域写保护模式,通过对状态寄存器的BL1、BL0位的设置,可以选择对不同的存储区域进行写保护;在进行任何写操作前都必须打开写使能开关,而且在上电初始化写操作完成时,写使能开关自动关闭。显然,在几方面的保护之下,产生误写的可能性极小,下表是BL1、BL0组合的含义。
BL1 BL0 写保护的单元地址
0 0 没有保护
0 1 180H~1FFH
1 0 100H~1FFH
1 1 000H~1FFH
对X25045的操作是通过4根口线CS、SCK、SI和SO进行同步串行通信来完成的。SCK是外部输入的同步时钟信号。在对芯片定改指令或数据时,时钟前沿将SI引脚信号输入;在读取数据时,时钟后沿将数据位输出到SO引脚上。数据的输入/输出都是高位在先。
芯片内部共有6条指令,如下表所列。
命令名称 命令格式 内 容
WREN 0000 0110(06) 打开写使能开关
WRDI 0000 0100(04) 关闭写使能开关
RDSR 0000 0101(05) 读状态寄存器
WRSR 0000 0001(01) 写状态寄存器
READ 0000 A8011 读存储单元
WRITE 0000 A8010 写存储单元
(1)WREN和WRDI是写使能开关的开/关指令。它们都是单字节指令。(2)RDSR和WRSR是状态寄存器的读/写指令。在从SI输入指令后,RDSR的执行结果,即状态寄存器内容须从SO读出;而WRSR需要紧接着输入修改数据。(3)READ和WEITE是存储单元的读/写指令。输入指令后(指令码第三代表存储单元地址的最高位),接着输入低八位地址,最后就可以连续读出或写入数据。其中,读指针和写指针的工作方式完全不同,读指针的全部8位用来计数,0FFH溢出后变成00H;写指针只用最低两位计数,XXXXXX11B溢出后变成XXXX XX00B,所以连续写的实际结果是在4个单元中反复写入。另外,由于E2PROM的写入时间长,所以在连续两条写指令之间应读取WIP状态,只有内部写周期结束时才可输入下一条写指令。


菜鸟
2007-06-12 16:56:00     打赏
4楼

急死人了,怎么也不好用呀。高手帮忙呀,指点指点小女子


共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]