📄 at93c46.c
字号:
/****************************************
*PROJECT CORD:AT93C46操作函数,ORG接地 *
*USE LANGUAGE:C51 *
*CREATED BY :沙漠里的鱼 *
*CREATE DATE:2006.6.7 *
*MCU :AT89C51 *
****************************************/
/************EEPROM AT93C46介绍*******************/
/******************管脚图(8-lead PDIP)及功能介绍*********************************
* *
* *
* *
* ==== ==== *
* CS—* 1 * * 8 *—VCC *
* * * *
* SK—* 2 7 *—DC *
* * * *
* DI—* 3 6 *—ORG *
* * * *
* DO—* 4 5 *—GND *
* =========== *
* *
*管脚功能如下: *
* *
*VCC GND :电源 接地端,电压范围 2.7~5.5V *
*CS :片选信号,高电平有效 *
*SK :串行时钟信号,SK上升沿进行芯片读写 *
*DI :串行数据输入端 *
*DO :串行数据输出端,地址檫/写周期或芯片檫/写周期时,该端提供忙/闲信息 *
*ORG :存储器构造配置端,该端接高电平时,输出为16位;接低电平时,输出为8位 *
*DC :空脚,无连接 *
* *
**********************************************************************************/
/*****************AT93C46控制命令*******************************************************************
* ********命令格式******** *
* ===================================== *
* * 起始位 * 操作码 * 地址段 * 数据段 * *
* ===================================== *
* * 1位 * 2位 * A6~A0 * D15~D0 * *
* ===================================== *
* *
* *
* **************控制命令***************** *
* *======*====*====*=============================*============================*==================* *
* * 操作 * 起 * 操 * 地址段 * 数据段 * 功能 * *
* * * 始 * 作 *==============*==============*==============*=============* * *
* * 命令 * 位 * 码 * 8位 * 16位 * 8位 * 16位 * * *
* *======*====*====*==============*==============*==============*=============*==================* *
* *READ * 1 * 10 * A6~A0 * A5~A0 * 空 * 从指定单元读数据 * *
* *======*====*====*==============*==============*============================*==================* *
* *EWEN * 1 * 00 * 11XXXXX * 11XXXX * 空 * 允许写指令 * *
* *======*====*====*==============*==============*============================*==================* *
* *ERASE * 1 * 11 * A6~A0 * A5~A0 * 空 * 檫除指定单元 * *
* *======*====*====*==============*==============*============================*==================* *
* *WRITE * 1 * 01 * A6~A0 * A5~A0 * D7~D0 * D15~D0 * 写入指定单元 * *
* *======*====*====*==============*==============*============================*==================* *
* *ERAL * 1 * 00 * 10XXXXX * 10XXXX * 空 * 檫除所有存储单元 * *
* *======*====*====*==============*==============*============================*==================* *
* *WRAL * 1 * 00 * 01XXXXX * 01XXXX * D7~D0 * D15~D0 * 写入所有存储单元 * *
* *======*====*====*==============*==============*==============*=============*==================* *
* *EWDS * 1 * 00 * 00XXXXX * 00XXXX * 空 * 禁止写指令 * *
* *======*====*====*==============*==============*============================*==================* *
* *
***************************************************************************************************/
#include<at89x51.h>
#define uchar unsigned char
sbit CS=P1^0;
sbit SK=P1^1;
sbit DI=P1^2;
sbit DO=P1^3;
void at93c46_ewen(void); //写使能
void at93c46_ewds(void); //写禁止
uchar at93c46_read(uchar addr); //读指定地址字节
void at93c46_write(uchar addr,uchar mybyte); //将指定字节写入指定存储单元
void at93c46_erase(uchar addr); //檫除指定单元
void at93c46_wral(uchar mybyte); //将指定字节写入所有存储单元
void at93c46_eral(void); //檫除所有存储单元
/********写使能函数,使EEPROM处于可写状态************/
void at93c46_ewen(void)
{
uchar i,tmp;
CS=0;SK=0;CS=1; //时序同步
DI=1;SK=1;SK=0; //送起始位
tmp=0x30;
for(i=0;i<8;i++) //送命令字
{
DI=tmp&0x80;
SK=1;SK=0;
tmp<<=1;
}
CS=0;
}
/*********写禁止函数,禁止写入EEPROM******************/
void at93c46_ewds(void)
{
uchar i,tmp;
CS=0;SK=0;CS=1; //时序同步
DI=1;SK=1;SK=0; //送起始位
tmp=0x00;
for(i=0;i<8;i++) //送命令字
{
DI=tmp&0x80;
SK=1;SK=0;
tmp<<=1;
}
CS=0;
}
/***************读指定地址字节,参数addr为内存地址**********/
uchar at93c46_read(uchar addr)
{
uchar i,result;
at93c46_ewen(); //写使能
CS=0;SK=0;CS=1; //时序同步
DI=1;SK=1;SK=0; //送起始位
DI=1;SK=1;SK=0; //送操作码
DI=0;SK=1;SK=0;
for(i=0;i<8;i++) //送地址
{
DI=addr&0x80;
SK=1;SK=0;
addr<<=1;
}
CS=0;DO=1;CS=1; //置接收端为1
SK=0;
while(!DO) //检查DO是否为0,DO为0表示芯片开始传送数据
{
SK=1;SK=0;
}
SK=1;SK=0; //空过第一个标志位
result=0;
for(i=0;i<8;i++)
{
result<<=1;
result=result|DO;
SK=1;SK=0;
}
CS=0;
return(result);
}
/**********将指定字节写入指定存储单元,参数addr为内存地址,参数mybyte为写入数据**********/
void at93c46_write(uchar addr,uchar mybyte)
{
uchar i;
at93c46_ewen(); //写使能
CS=0;SK=0;CS=1; //时序同步
DI=1;SK=1;SK=0; //送起始位
DI=0;SK=1;SK=0; //送操作码
DI=1;SK=1;SK=0;
for(i=0;i<8;i++) //送地址
{
DI=addr&0x80;
SK=1;SK=0;
addr<<=1;
}
for(i=0;i<8;i++) //送数据
{
DI=mybyte&0x80;
SK=1;SK=0;
mybyte<<=1;
}
CS=0;DO=1;CS=1; //置接收端为1
SK=0;
while(DO) //DO为0表示芯片忙
{
SK=1;SK=0;
}
SK=0;CS=0;
at93c46_ewds(); //写禁止
}
/*************檫除指定单元,addr为内存地址*************/
void at93c46_erase(uchar addr)
{
uchar i;
at93c46_ewen(); //写使能
CS=0;SK=0;CS=1; //时序同步
DI=1;SK=1;SK=0; //送起始位
DI=1;SK=1;SK=0; //送操作码
DI=1;SK=1;SK=0;
for(i=0;i<8;i++) //送地址
{
DI=addr&0x80;
SK=1;SK=0;
addr<<=1;
}
CS=0;DO=1;CS=1; //置接收端为1
SK=0;
while(DO) //DO为0表示芯片忙
{
SK=1;SK=0;
}
SK=0;CS=0;
at93c46_ewds(); //写禁止
}
/*************将指定字节写入所有存储单元,参数mybyte为写入数据************/
void at93c46_wral(uchar mybyte)
{
uchar i,tmp;
at93c46_ewen(); //写使能
CS=0;SK=0;CS=1; //时序同步
DI=1;SK=1;SK=0; //送起始位
tmp=0x10;
for(i=0;i<8;i++) //送命令字
{
DI=tmp&0x80;
SK=1;SK=0;
tmp<<=1;
}
for(i=0;i<8;i++) //送数据
{
DI=mybyte&0x80;
SK=1;SK=0;
mybyte<<=1;
}
CS=0;DO=1;CS=1; //置接收端为1
SK=0;
while(DO) //DO为0表示芯片忙
{
SK=1;SK=0;
}
SK=0;CS=0;
at93c46_ewds(); //写禁止
}
/*************檫除所有存储单元***********************/
void at93c46_eral(void)
{
uchar i,tmp;
at93c46_ewen(); //写使能
CS=0;SK=0;CS=1; //时序同步
DI=1;SK=1;SK=0; //送起始位
tmp=0;
for(i=0;i<8;i++) //送命令字
{
DI=tmp&0x80;
SK=1;SK=0;
tmp<<=1;
}
CS=0;DO=1;CS=1; //置接收端为1
SK=0;
while(DO) //DO为0表示芯片忙
{
SK=1;SK=0;
}
SK=0;CS=0;
at93c46_ewds(); //写禁止
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -