📄 93c46.h
字号:
//用C51软件包对CAT93C46器件进行读写操作
/*=========================================================*/
/* CSI93C46操作子程序 */
/* 注意:这里使用的CSI93C46为16位结构的EEROM */
/*=========================================================*/
#include <Reg764.h>
/*87LPC764的头文件*/
sbit CS_93C46=P1^6;
sbit SK_93C46=P1^4;
sbit DI_93C46=P1^2;
sbit DO_93C46=P1^3;
void delay1(unsigned int num)
{
while(num!=0){num=num-1;}
}
/***********************************************************************/
/*名称: START_93C46() */
/*说明: 用于93C46的启动,防止由于CS_93C46的改动而引起数据时序混乱 */
/***********************************************************************/
void START_93C46()
{
DO_93C46=1; /*防止DO由于是低电平而无法输入*/
CS_93C46=1; /*开启93C46*/
CS_93C46=0;
DI_93C46=0;
SK_93C46=0;
CS_93C46=1;
delay1(1000);
}
/***************************************************************************/
/*名称:END_93C46() */
/*说明:用于93C46的结束,防止由于CS_93C46的改动而引起数据线为0而无法输入*/
/***************************************************************************/
void END_93C46()
{
CS_93C46=0;
DI_93C46=1;
SK_93C46=1;
}
/***********************************************************************/
/*名称:SEND_DATA_93C46() */
/*说明:在93C46启动下,送入指定位数的数据 */
/*输入: op_data 要输入的数据 */
/* num 输入的位数 */
/**********************************************************************/
void SEND_DATA_93C46(unsigned int op_data,unsigned char num)
{
data unsigned char temp1;
op_data=op_data<<(16-num); /*左移去掉无用位*/
for(temp1=0;temp1<num;temp1++)
{
if( (op_data&0X8000)==00 )
{
DI_93C46=0;
}
else
{
DI_93C46=1;
}
SK_93C46=1;
SK_93C46=1;
SK_93C46=1;
SK_93C46=1;
SK_93C46=0;
op_data=op_data<<1;
}
}
/***********************************************************************/
/*名称: EWEN_93C46() */
/*说明: 93C46的编程启动.操作码(100 11XXXX) */
/***********************************************************************/
void EWEN_93C46()
{
START_93C46();
SEND_DATA_93C46(0X04,0X03); /*送入3位操作码*/
SEND_DATA_93C46(0X30,0X06); /*送入6位地址*/
END_93C46();
}
/***********************************************************************/
/*名称: EWDS_93C46() */
/*说明: 93C46的编程关闭.操作码(100 00XXXX) */
/**********************************************************************/
void EWDS_93C46()
{
START_93C46();
SEND_DATA_93C46(0X04,0X03);
SEND_DATA_93C46(0X00,0X06);
END_93C46();
}
/***********************************************************************/
/*说明:93C46的字读取程序 */
/*输入:要读取的字地址(6位) */
/*输出:读取的字数值 */
/**********************************************************************/
unsigned int READ(unsigned char address)
{
data unsigned char temp1;
data unsigned int temp2;
START_93C46();
SEND_DATA_93C46(0X06,0X03);
SEND_DATA_93C46(address,0X06);
temp2=0; /*存放返回数据的缓冲先清零*/
for(temp1=0;temp1<16;temp1++) /*循环读出16个数据*/
{
temp2=temp2<<1;
SK_93C46=1;
SK_93C46=0;
if(DO_93C46==1){
temp2=temp2|0X01;
}
}
END_93C46();
return temp2;
}
/**********************************************************************/
/*名称:WRITE() */
/*说明:93C46的字写入程序 */
/*输入: address 要写入的字地址(6位) */
/* op_data 要写入的数据(16位) */
/*输出: 读取的字数值 */
/**********************************************************************/
unsigned char WRITE(unsigned char address,unsigned int op_data)
{
data unsigned char temp1;
data unsigned int temp2;
EWEN_93C46();
START_93C46();
SEND_DATA_93C46(0X05,0X03);
SEND_DATA_93C46(address,0X06);
SEND_DATA_93C46(op_data,0X10);
CS_93C46=0;
CS_93C46=1;
temp1=1;
temp2=50000; /*设置一个最大延时等待数值.注意在不同的晶振下延时是不同的*/
while(!DO_93C46)
{
temp2=temp2-1;
if(temp2==0)
{
temp1=0;
break; /*最大等待延时后说明擦除失败*/
}
}
END_93C46();
EWDS_93C46();
return temp1;
}
/***********************************************************************/
/*名称:ERASE() */
/*说明:93C46的字擦除程序 */
/*输入: address 要擦除的字地址(6位) */
/**********************************************************************/
unsigned char ERASE(unsigned char address)
{
data unsigned char temp1;
data unsigned int temp2;
EWEN_93C46();
START_93C46();
SEND_DATA_93C46(0X07,0X03);
SEND_DATA_93C46(address,0X06);
CS_93C46=0;
CS_93C46=1;
temp1=1;
temp2=50000;
while(!DO_93C46)
{
temp2=temp2-1;
if(temp2==0)
{
temp1=0;
break;
}
}
END_93C46();
EWDS_93C46(); /*返回表示擦除状态的特征*/
return temp1;
}
/**********************************************************************/
/*名称:ERAL() */
/*说明:93C46的全部擦除程序 */
/**********************************************************************/
unsigned char ERAL()
{
data unsigned char temp1;
data unsigned int temp2;
EWEN_93C46();
START_93C46();
SEND_DATA_93C46(0X04,0X03);
SEND_DATA_93C46(0X20,0X06);
CS_93C46=0;
CS_93C46=1;
temp1=1;
temp2=50000;
while(!DO_93C46)
{
temp2=temp2-1;
if(temp2==0)
{
temp1=0;
break;
}
}
END_93C46();
EWDS_93C46(); /*返回表示擦除状态的特征*/
return temp1;
}
/***********************************************************************/
/*名称:WRAL() */
/*说明:93C46的写全部程序 */
/*输入: op_data 要写入的数据(16位) */
/*输出: 读取的字数值 */
/***********************************************************************/
unsigned char WRAL(unsigned int op_data)
{
data unsigned char temp1;
data unsigned int temp2;
EWEN_93C46();
START_93C46();
SEND_DATA_93C46(0X04,0X03);
SEND_DATA_93C46(0X10,0X06);
SEND_DATA_93C46(op_data,0X10);
CS_93C46=0;
CS_93C46=1;
temp1=1;
temp2=50000; /*设置一个最大延时等待数值.注意在不同的晶振下延时是不同的*/
while(!DO_93C46)
{temp2=temp2-1;
if(temp2==0)
{
temp1=0;
break;
}
}
END_93C46();
EWDS_93C46();
return op_data;
}
//软件包为C51嵌入汇编的一个子程序。主要包括以下几个函数:
//读函数:
//unsigned int read(unsigned char address);
//写函数:
//void write(unsigned char address,unsigned int dat);
//写全部函数:
//void wral(unsigned int dat);
//擦除函数:
//void erase(unsigned char address);
//擦全部函数:
//void eral();
//其中写允许和写禁止指令都已经包括在需要写入的函数里面了。
//下面是用C51编写的CAT93C46的各个函数操作的程序:
#include <reg764.h> /*加载P87LPC764的头文件*/
#define uchar unsigned char
#define uint unsigned int
uint read(uchar a); /*定义读操作函数*/
void write(uchar b,uint c); /*定义写操作函数*/
void eral(); /*定义擦全部操作函数*/
void wral(uint d); /*定义写全部操作函数*/
void erase(uchar e); /*定义擦除操作函数*/
main()
{
uchar address;
uint dat;
eral(); /*擦除芯片全部内容*/
address=2;
dat=0;
dat=read(address); /*把地址为address的内容读出并存放在dat中*/
address=2;
dat=0X1234;
write(address,dat); /*把dat写到地址为address的单元上*/
address=2;
dat=0;
dat=read(address); /*把地址为address的内容读出并存放在dat中*/
address=2;
erase(address); /*擦除地址为address的内容*/
address=2;
dat=0;
dat=read(address); /*把地址为address的内容读出并存放在dat中*/
dat=0x5678;
wral(dat); /*把dat的内容写满e2prom*/
address=8;
dat=0;
dat=read(address); /*把地址为address的内容读出进行比较*/
address=0;
}
//上面的C51程序可把变量dat插入到观察窗口中,在适当的地方设置断点来观察。
//操作举例:
//例1,把1234H写到CAT93C46的所有存储器当中
//dat=0x1234;
//wral(dat);
//例2,把CAT93C46的10H单元的内容擦除
//address=0x10;
//erase(address);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -