📄 e25045.c
字号:
#include <reg52.h>
#include "e25045.h"
sbit CS = P1^0; //EEPROM及看门狗片选
sbit SI = P1^6; //串行数据输入
sbit SCK = P1^5; //串行时钟
sbit SO = P1^1; //串行数据输出
/***********************************************************************
* I2c BUS Related sbit SCL= P1^0; sbit SDA = P1^1; *
***********************************************************************/
void Delay5(void) // 5 us
{ unsigned char idata i; for(i=0;i<100;i++);
}
//******************************************************
void Watch_dog(void)
{
CS=1;
CS=0;
Delay5();
CS=1;
}
//初始化X25043/25045
/********************************************************************************
_______________________________
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | BL1 BL0 WD1 WD0
-------------------------------- 0 0 None 0 0 1.4Seconds
| x | x |WD1|WD0|BL1|BL0|WEL|WIP| 0 1 180--1FF 0 1 600Milliseconds
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1 0 100--1FF 1 0 200Milliseconds
1 1 000--1FF 1 1 Disabled
*********************************************************************************/
void Init_X25045(unsigned char STATUS)
{
CS=0;
SO=1;
SCK=0;
SI=0;
Wrsr_Cmd(STATUS);
}
//设置写使能锁
void Wren_Cmd(void)
{
SCK=0;
CS=0;
OutByte(WREN_INST);
SCK=0;
CS = 1;
}
//读状态寄存器
unsigned char Rdsr_Cmd(void)
{
unsigned char RetCode;
SCK = 0;
CS = 0;
OutByte(RDSR_INST);
RetCode = InByte();
SCK = 0;
CS = 1;
return RetCode;
}
//写状态寄存器
/*******************************************
___________________________________________
| X | X | WD1 | WD0 | BL1 | BL0 | WEL | WIP |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0 0(1400) 0 0(None)
0 1(600) 0 1($180-$1FF)
1 0(200) 1 0($100-$1FF)
1 1 Disa 1 1($000-$1FF)
********************************************/
void Wrsr_Cmd(unsigned char STATUS)
{
if((Rdsr_Cmd()&0x01)==1) return;
CS = 0;
Wren_Cmd();
SCK = 0;
CS = 1;
CS = 0;
OutByte(WRSR_INST);
OutByte(STATUS);
SCK = 0;
CS = 1;
//Wip_Poll();
}
//写一个字节
void Byte_Write(unsigned int Addr,unsigned char wbyte)
{
unsigned char data HAddr,LAddr,Temp;
while((Rdsr_Cmd()&0x01)==1);
CS = 0;
Wren_Cmd();
SCK = 0;
CS = 1;
CS = 0;
LAddr = (unsigned char)Addr;
HAddr = Addr>>8;
Temp = (WRITE_INST&0xF7)|((HAddr<<3)&0x08);
OutByte(Temp);
OutByte(LAddr);
OutByte(wbyte);
SCK = 0;
CS = 1;
//Wip_Poll();
}
//读一个字节
unsigned char Byte_read(unsigned int Addr)
{
unsigned char data HAddr,LAddr,Temp;
while((Rdsr_Cmd()&0x01)==1);
SCK = 0;
CS = 0;
LAddr = (unsigned char)Addr;
HAddr = Addr>>8;
Temp = (READ_INST&0xF7)|((HAddr<<3)&0x08);
OutByte(Temp);
OutByte(LAddr);
Temp = InByte();
SCK= 0;
CS = 1;
//Wip_Poll();
return Temp;
}
/*****************************************************************/
//对串行FLASH进行读校验
/*******************************************************************/
unsigned char ByteRead_Check (unsigned int addrR)
{
unsigned char TempVar,TempVar1,TempVar2;
TempVar2=0;
TempVar=Byte_read(addrR);
do
{
TempVar1=Byte_read(addrR);
if(TempVar==TempVar1)
{
TempVar2++;
}
else
{
TempVar2=0;
TempVar=TempVar1;
}
}
while(TempVar2<=3);
return(TempVar);
}
/************************************************/
//对串行FLASH进行写校验
/*************************************************************/
void ByteWrite_Check (unsigned int addrW ,unsigned char VarTemp)
{
Byte_Write(addrW,VarTemp);
while(VarTemp!=Byte_read(addrW))
Byte_Write(addrW,VarTemp);
}
//送一个字节到EEPROM
void OutByte(unsigned char b)
{
unsigned char i;
unsigned char bb=0x80;
for(i=0;i<8;i++)
{
//SCK=0;
SI=b&bb;
bb>>=1;
SCK=0;
Delay5();
SCK=1;
Delay5();
}
}
//从EEPROM接收一个字节
unsigned char InByte(void)
{
unsigned char i;
unsigned char b=0;
for(i=0;i<8;i++)
{
Delay5();
SCK=1;
SCK=0;
Delay5();
b=2*b+(unsigned char)SO;
}
return b;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -