📄 at93c46.c
字号:
/**********************************************
*工程名称:eeprom AT93C46 读写
*工作模式:8位字节模式(ORG=GND),IO口模拟时序,mega16使用内部 8Mhz RC
*作 者:朱海峰
*邮 箱:ntzhf@163.com QQ:543376422
*创建日期:2007.10.26
*修改日期:2007.10.30
************************************************/
#include <iom16v.h>
#include <macros.h>
#define uint8_t unsigned char
#define uint16_t unsigned int
#define nop NOP()
//op code
#define READ 0X80 //只包括前3个控制BIT--下同
#define EWEN 0X00
#define ERASE 0Xc0
#define WRITE 0X40
#define ERAL 0X00
#define WRAL 0X00
#define EWDS 0X00
#define DI 5
#define DO 6
#define CS 4
#define SK 7
#define ORG 0 //0=接地(8位模式);1=接VCC(16位模式)
#define DDR_DI DDRB
#define DDR_DO DDRB
#define DDR_CS DDRB
#define DDR_SK DDRB
#define PORT_DI PORTB
#define PORT_DO PORTB
#define PORT_CS PORTB
#define PORT_SK PORTB
#define PIN_DI PINB
#define PIN_DO PINB
#define PIN_CS PINB
#define PIN_SK PINB
#define set_di() PORT_DI |= (1<<DI)
#define clr_di() PORT_DI &= ~(1<<DI)
#define set_cs() PORT_CS |= (1<<CS)
#define clr_cs() PORT_CS &= ~(1<<CS)
#define set_sk() PORT_SK |= (1<<SK)
#define clr_sk() PORT_SK &= ~(1<<SK)
#define buzzer_on() DDRD |= (1<<2);PORTD |= (1<<2)
#define buzzer_off() DDRD |= (1<<2);PORTD &= ~(1<<2)
#define Green_off() DDRB |= (1<<0);PORTB |= (1<<0)
#define Green_on() DDRB |= (1<<0);PORTB &= ~(1<<0)
#define Red_off() DDRB |= (1<<1);PORTB |= (1<<1)
#define Red_on() DDRB |= (1<<1);PORTB &= ~(1<<1)
uint8_t Read(uint8_t add);
void EW_enable(void);
void EW_disable(void);
void Erase(uint8_t add);
void Erase_all(void);
void Write(uint8_t add,uint8_t w_data);
void IO_init(void);
void Delay_ms(uint16_t ms);
void Send_str_op(uint8_t op);
void Send_bits(uint8_t s_data);
void delay_us(void);
/*********************************************/
void main(void)
{
uint8_t temp_1 = 0x00;
nop;
IO_init();
while (2)
{
EW_enable(); //读写使能
//Erase(0x03);
Write(0x01,0x28); //在地址为0X01的EEPROM中写入数据0x28
nop;
nop;
//EW_disable();
//Delay_ms(100);
//EW_enable();
temp_1 = Read(0x01); //读取地址为0X01的EEPROM中的数据
nop;
nop;
EW_disable();
if (temp_1 == 0x28) //校验读取的数据是写入的
{
Green_on(); //校验正确,绿色LED亮
Red_off();
}
else
{
Green_off(); //校验不正确,红色LED亮
Red_on();
}
for(;;)
nop;
}
}
/*********************************************/
void IO_init(void)
{
DDR_DI |= (1<<DI);
PORT_DI &= ~(1<<DI);
DDR_CS |= (1<<CS);
PORT_CS &= ~(1<<CS);
DDR_SK |= (1<<SK);
PORT_SK &= ~(1<<SK);
}
/*********************************************/
void delay_us(void)
{
nop;
nop;
nop;
nop;
}
/*********************************************/
/*********************************************
函数功能:发送起始位和操作码
描 述:一个BIT的起始位+两个BIT的操作码
入口参数:OP
出口参数:无
*********************************************/
void Send_str_op(uint8_t op)
{
uint8_t i;
//===========start bit=================//
set_di();
delay_us();
set_sk();
delay_us();
clr_sk();
delay_us();
//===========send op code================//
for (i=0;i<2;i++,op <<=1)
{
if (op & 0x80)
{
set_di();
}
else
{
clr_di();
}
delay_us();
set_sk();
delay_us();
clr_sk();
delay_us();
clr_di();
}
}
/*********************************************
函数功能:发送7个BIT
描 述:地址或其他
入口参数:s_data
出口参数:无
*********************************************/
void Send_bits(uint8_t s_data)
{
uint8_t i,temp_data = 0;
for (i=0;i<7;i++,s_data <<=1)
{
temp_data = s_data;
if (temp_data & 0x40) // xxxx'xxxx
{ // &0100'0000
set_di();
}
else
{
clr_di();
}
delay_us();
set_sk();
delay_us();
clr_sk();
delay_us();
clr_di();
}
}
/*********************************************
函数功能:从指定地址读出一个字节的数据
描 述:从已add为地址的eeprom中读数据
入口参数:add
出口参数:read_data
*********************************************/
uint8_t Read(uint8_t add)
{
uint8_t i,buffer = 0,read_data = 0;
set_cs();
delay_us();
Send_str_op(READ);
Send_bits(add);
for (i=0;i<8;i++)
{
set_sk();
delay_us();
buffer |= (PIN_DO & 0X40); //读取引脚电平
buffer >>= DO;
read_data <<=1;
read_data |= buffer;
delay_us();
clr_sk();
}
delay_us();
clr_cs();
return read_data;
}
/*********************************************
函数功能:延时函数
描 述:延时
入口参数:ms
出口参数:void
*********************************************/
void Delay_ms(uint16_t ms)
{
uint8_t i;
for (;ms>0;ms--)
for(i = 0;i<100;i++)
;
}
/*********************************************
函数功能:读写禁止
描 述:禁止读写功能
入口参数:void
出口参数:void
*********************************************/
void EW_disable(void)
{
set_cs();
delay_us();
Send_str_op(EWDS);
Send_bits(0x00);
delay_us();
clr_cs();
}
/*********************************************
函数功能:读写使能
描 述:使能读写功能
入口参数:void
出口参数:void
*********************************************/
void EW_enable(void)
{
set_cs();
delay_us();
Send_str_op(EWEN);
Send_bits(0x60);
delay_us();
clr_cs();
}
/*********************************************
函数功能:擦出指定地址的内容
描 述:将指定地址的内容全部擦除
入口参数:add
出口参数:void
*********************************************/
void Erase(uint8_t add)
{
clr_cs();
clr_sk();
set_cs();
delay_us();
Send_str_op(ERASE);
Send_bits(add);
delay_us();
clr_cs();
delay_us();
delay_us();
set_cs();
while (!(PIN_DO & (1<<DO))); //check busy
delay_us();
clr_cs();
}
/*********************************************
函数功能:在指定的地址写一个字节的数据
描 述:将一个字节的数据写入指定地址
入口参数:add,w_data
出口参数:void
*********************************************/
void Write(uint8_t add,uint8_t w_data)
{
uint8_t i;
set_cs();
delay_us();
Send_str_op(WRITE);
Send_bits(add);
for (i=0;i<8;i++,w_data <<=1)
{
delay_us();
if (w_data & 0x80)
{
set_di();
}
else
{
clr_di();
}
delay_us();
set_sk();
delay_us();
clr_sk();
delay_us();
clr_di();
}
delay_us();
clr_cs();
delay_us();
delay_us();
set_cs();
while (!(PIN_DO & (1<<DO))); //check busy
delay_us();
clr_cs();
}
/*********************************************/
/*********************************************/
/*********************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -