"); //-->
一般说明X5043/45把四种常用的能:上电复位、看门狗定时器、电源电压监控和块锁(Block LockM)保护串行EEPROM存储器组成在一个封装之内。这种组合降低了系统成本、减少了电路板空间和增加了可靠性。向器件加电时激活了上电复位电路,它保持RESET/RESET有效一段时间。这可使电源和振荡器稳定,然后微处理器再执行代码。看门狗定时器对微控制器提供了一个独立的保护机制。当系统故障时,在可选的超时时间(time-outinterval)之后,器件将激活RESET/RESET信号,用户可以从三个预置的值中选择一个超时时间。一旦选定,即使在断电后重启电源时也不会改变。器件的低VCC检测电路,可以保护系统免受低电压之影响,当VCC降到最小VCC转换点以下时,系统复位。复位一直持续到VCC回到正常工作电平并且稳定为止。有5个工业标准的转换电压门限Vtrip可以选用,并且Xicor独特的电路允许对门限编程以满足用户的需要或者对高精度应用的精细调整的需要。X5043/45的存储器部份是具有Xicor块锁保护的CMOS 4Kb串行EEPROM。该阵列内部的组织是×8。器件具有SPI接口的特性,其软件协议允许工作在一个简单四线总线上。器件利用了Xicor公司专有的Direct WriteTM晶片,提供最小为1000000次擦写和最少为100年的数据保存期。
下面代码使用KEIL C编译,在51上调试通过。
/*****************************************************************************/
#define XCMD_WREN 0x06 // Set the write enable latch
#define XCMD_WRDI 0x04 // Reset the write enable latch
#define XCMD_RDSR 0x05 // Read status register
#define XCMD_WRSR 0x01 // Write status register
#define XCMD_READ 0x03 // Read data beginned at selected address
#define XCMD_WRITE 0x02 // Write data beginned at selected address
/*****************************************************************************/
//通过X5045_SI输出一个字节,返回时保证X5045_SI=1;X5045_SCK=0
static void X_ABYTE(INT8U ch)
{
INT8U i;
for(i=0;i<8;i++)
{
X5045_SI = (ch&0x80) ? 1:0; //MSB First
X5045_SCK = 1;
ch <<= 1;
X5045_SCK = 0;
}
X5045_SI = 1;
}
/*****************************************************************************/
//通过X5045_SO输入一个字节,返回时保证X5045_SO=1(内部);X5045_SCK=0
static INT8U X_IBYTE(void)
{
INT8U i,j;
X5045_SO = 1;
for(i=0;i<8;i++)
{
X5045_SCK = 1;
j <<= 1; //MSB First
if(X5045_SO) j += 1;
X5045_SCK = 0;
}
return j;
}
/*****************************************************************************/
//刷新X5045的WATCHDOG
void X_WATCHDOG(void)
{
X5045_CS = 0;
X5045_CS = 0;
X5045_CS = 0;
X5045_CS = 0;
X5045_CS = 0;
X5045_CS = 1;
}
/*****************************************************************************/
//从X5045读一个状态字
INT8U X_READS(void)
{
INT8U ch;
X5045_SO = 1;
X5045_SCK = 0;
EA = 0;
X5045_SO = 1;
X5045_SI = 1;
X5045_CS = 0;
X_ABYTE(XCMD_RDSR);
ch = X_IBYTE();
X5045_CS = 1;
EA = 1;
return ch;
}
/*****************************************************************************/
//从X5045指定地址读一个字0-255
INT16U X_READ(INT8U add)
{
INT8U ch;
X5045_SO = 1;
X5045_SCK = 0;
EA = 0;
X5045_SO = 1;
X5045_SI = 1;
X5045_CS = 0;
ch = add&0x80 ? 8:0;//Addr bit 8
X_ABYTE(XCMD_READ|ch);
X_ABYTE(add<<1); //Low Addr
add = X_IBYTE();
ch = X_IBYTE();
X5045_CS = 1;
EA = 1;
return (((INT16U)ch)<<8) + add;
}
/*****************************************************************************/
//写一个状态字到X5045
void X_WRITES(INT8U ch)
{
X5045_SO = 1;
X5045_SCK = 0;
EA = 0;
X5045_SO = 1;
X5045_SI = 1;
X5045_CS = 0;
X_ABYTE(XCMD_WREN);
X5045_CS = 1;
ch &= 0x3C;
X5045_CS = 0;
X_ABYTE(XCMD_WRSR);
X_ABYTE(ch);
X5045_CS = 1;
EA = 1;
ch = 0;
while((--ch)&&(X_READS()&1)); //等待写入完成:WIP=0
}
/*****************************************************************************/
//向X5045指定地址写一个字(10ms一次)
void X_WRITE(INT8U add,INT16U dat)
{
INT8U ch;
X5045_SO = 1;
X5045_SCK = 0;
EA = 0;
X5045_SO = 1;
X5045_SI = 1;
X5045_CS = 0;
X_ABYTE(XCMD_WREN);
X5045_CS = 1;
ch = add&0x80 ? 8:0;//Addr bit 8
X5045_CS = 0;
X_ABYTE(XCMD_WRITE|ch);
X_ABYTE(add<<1); //Low Addr
X_ABYTE(dat); //Low Data
X_ABYTE(dat>>8); //High Data
X5045_CS = 1;
EA = 1;
ch = 0;
while((--ch)&&(X_READS()&1)); //等待写入完成:WIP=0
}
/*****************************************************************************/
全文完(原创)!
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。