📄 eeprom_24c02.c
字号:
/**************************************************************************
24c02 Serial EEPROM
File Name: EEPROM_24c02.c
Author: Lin Qian
Created: 2008/04/24
Modified: NO
Revision: 1.0
***************************************************************************/
#define __EEPROM_24C02
#include "INC\\main.h"
#undef __EEPROM_24C02
#if EEPROM_24c02_Internal_Func_en
//********** 内部函数声明 **********
void hold_24c02();
void start_24c02();
void stop_24c02();
void WriteOneByte(uchar j);
uchar ReadOneByte();
void clock_24c02();
//******************************
// 电平维持 ******************************
void hold_24c02()
{
_nop_();
}
// 起始命令时序 ******************************
void start_24c02()
{
SDA = 1; hold_24c02();
SCL = 1; hold_24c02();
SDA = 0; hold_24c02();
SCL = 0; hold_24c02();
}
// 停止命令时序 ******************************
void stop_24c02()
{
SDA = 0; hold_24c02();
SCL = 1; hold_24c02();
SDA = 1; hold_24c02();
}
// 写单字节 ******************************
void WriteOneByte(uchar info)
// info: 需要写入的字节.
{
uchar i;
for( i=0; i<8; i++ )
{
info = info << 1;
SCL = 0; hold_24c02();
SDA = CY; hold_24c02(); // 从进位从进位取出当前写入位
SCL = 1; hold_24c02();
}
SCL = 0; hold_24c02();
SDA = 1; hold_24c02();
}
// 读单字节 ******************************
uchar ReadOneByte(void)
// 返回: 读出的字节.
{
uchar i, tmp, info;
SCL = 0; hold_24c02();
SDA = 1;
for( i=0, info=0; i<8; i++ )
{
hold_24c02();
SCL = 1; hold_24c02();
if( SDA == 1 )
tmp = 1;
else
tmp = 0;
info = (info << 1) | tmp;
SCL = 0;
}
hold_24c02();
return info;
}
// 时钟时序 ******************************
void clock_24c02()
{
uchar i=0;
SCL = 1; hold_24c02();
while( (SDA == 1) && (i < 255) )
i++;
SCL = 0; hold_24c02();
}
#endif
// 24c02初始化 ******************************
#if x24c02_Init_en
void x24c02_Init()
{
SCL = 1; hold_24c02();
SDA = 1; hold_24c02();
}
#endif
// 读24c02 ******************************
#if x24c02_Read_en
uchar x24c02_Read(uchar ChipAddr, uchar addr)
// 功能: 向24c02写入一字节数据.
// ChipAddr: 器件片选地址. 由引脚A0~A2确定.
// addr: 24c02内部寻址地址.
// 返回: 读出的字节.
{
uchar info;
// bit tmpEA;
ChipAddr = (0x07 & ChipAddr) << 1; // 调整片选地址至1~3位
// tmpEA = EA; // 缓存当前总中断状态
// EA = 0; // 关闭总中断
start_24c02(); // 起始命令
WriteOneByte(0xa0 | ChipAddr); // 发送片选地址, R/W=0
clock_24c02();
WriteOneByte(addr); // 发送片内寻址地址
clock_24c02();
start_24c02(); // 起始命令
WriteOneByte(0xa1 | ChipAddr); // 发送片选地址, R/W=1
clock_24c02();
info = ReadOneByte(); // 读取字节
stop_24c02(); // 停止命令
// EA = tmpEA; // 恢复总中断状态
return info;
}
#endif
// 写24c02 ******************************
#if x24c02_Write_en
void x24c02_Write(uchar ChipAddr, uchar addr, uchar info)
// 功能: 从24c02中读取一个字节数据.
// ChipAddr: 器件片选地址. 由引脚A0~A2确定.
// addr: 24c02内部寻址地址.
// info: 待写入字节
{
// bit tmpEA;
ChipAddr = (0x07 & ChipAddr) << 1; // 调整片选地址至1~3位
// tmpEA = EA; // 缓存当前总中断状态
// EA = 0; // 关闭总中断
start_24c02(); // 起始命令
WriteOneByte(0xa0 | ChipAddr); // 发送片选地址, R/W=0
clock_24c02();
WriteOneByte(addr); // 发送片内寻址地址
clock_24c02();
WriteOneByte(info); // 数据写入
clock_24c02();
stop_24c02(); // 停止命令
// EA = tmpEA; // 恢复总中断状态
}
#endif
// 擦除24c02 ******************************
#if x24c02_Erase_en
void x24c02_Erase (uchar ChipAddr)
// 功能: 擦除选定的24c02的全部内容.
// ChipAddr: 器件片选地址. 由引脚A0~A2确定.
{
uint i;
for( i=0; i<EEPROM_SIZE; i++ );
{
x24c02_Write(ChipAddr, i, 0xff);
DelayXms(5);
}
}
#endif
//************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -