|
eeprom.c
//EEPROM-24c02底層驅(qū)動(dòng)文件
#include <msp430f249.h>
#include "delay.h"
#include "iic.h"
#include "eeprom.h"
//EEPROM容量
//- 24C02, 256 X 8 (2K bits)
//- 24C04, 512 X 8 (4K bits)
//- 24C08, 1024 X 8 (8K bits)
//- 24C16, 2048 X 8 (16K bits)
//- 24C32, 4096 X 8 (32K bits)
//- 24C64, 8192 X 8 (64K bits)
//在EEPROM-24c02指定地址寫入一個(gè)數(shù)據(jù)
//Addr:寫入數(shù)據(jù)的目的地址 0~255 for AT24C02
//Data:要寫入的數(shù)據(jù)
void Write_Eeprom_OneData(u8 Addr,u8 Data)
{
IIC_Start();
Write_IIC_byte(WriteCom); //寫命令
IIC_Ack();
Write_IIC_byte(Addr);
IIC_Ack();
Write_IIC_byte(Data);
IIC_Ack();
IIC_Stop();
Delay_ms(10);//等待EEPROM寫入數(shù)據(jù)完成
}
//在EEPROM-24c02指定地址讀出一個(gè)數(shù)據(jù)
//Addr:開始讀數(shù)的目的地址 0~255 for AT24C02
//Data:讀到的數(shù)據(jù)
u8 Read_Eeprom_OneData(u8 Addr)
{
u8 Data;
IIC_Start();
Write_IIC_byte(WriteCom); //寫命令
IIC_Ack();
Write_IIC_byte(Addr);
IIC_Ack();
IIC_Start();
Write_IIC_byte(ReadCom); //讀命令
IIC_Ack();
Data = Read_IIC_byte();
IIC_NoAck();
IIC_Stop();
return Data;
}
//檢查EEPROM-24c02是否正常
//返回1:檢測(cè)成功,返回0:檢測(cè)失敗
//EEPROM-24c02的最后一個(gè)地址(255)來存儲(chǔ)標(biāo)志字
u8 EEPROM_24C02_Check(void)
{
u8 temp;
IIC_Init();//初始化IIC總線
temp = Read_Eeprom_OneData(255);//先讀取數(shù)據(jù)
if(temp == 8) return 1;
else
{
Write_Eeprom_OneData(255,8);//24C02的255位置第一次寫入數(shù)據(jù)
temp = Read_Eeprom_OneData(255);
if(temp == 8) return 1;//讀取數(shù)據(jù)成功
}
return 0;
}
//在EEPROM-24c02里面的指定地址開始寫入0~4294967295的數(shù)據(jù)
//Addr:開始寫入的地址;Data:數(shù)據(jù)
//一個(gè)數(shù)據(jù)占用EEPROM-24c02四個(gè)地址
void Write_Eeprom_LenData(u16 Addr,u32 Data)
{
u8 t;
for(t=0; t<4; t++)
{
Write_Eeprom_OneData(Addr+t,(Data>>(8*t))&0xFF);
}
}
//在EEPROM-24c02里面的指定地址開始讀出0~4294967295的數(shù)據(jù)
//Addr:開始讀出的地址 Data:數(shù)據(jù)
//該函數(shù)用于讀出32bit的數(shù)據(jù)
u32 Read_Eeprom_LenData(u16 Addr)
{
u8 t;
u32 Data;
for(t=0; t<4; t++)
{
Data <<= 8;
Data += Read_Eeprom_OneData(Addr+4-t-1);
}
return Data;
}
//在EEPROM-24c02里面的指定地址開始寫入指定個(gè)數(shù)的字符串
//Addr:開始寫入的地址 對(duì)24c02為0~255;Buf:數(shù)據(jù)數(shù)組首地址;Num:要寫入數(shù)據(jù)的個(gè)數(shù)
void Write_Eeprom_NubStr(u16 Addr,u8 *Buf,u16 Num)
{
while(Num --)
{
Write_Eeprom_OneData(Addr,*Buf);
Addr ++;
Buf ++;
}
}
//在EEPROM-24c02里面的指定地址開始讀出指定個(gè)數(shù)的字符串
//Addr:開始讀出的地址 對(duì)24c02為0~255;Buf:數(shù)據(jù)數(shù)組首地址;Num:要讀出數(shù)據(jù)的個(gè)數(shù)
void Read_Eeprom_NubStr(u16 Addr,u8 *Buf,u16 Num)
{
while(Num)
{
*Buf ++= Read_Eeprom_OneData(Addr ++);
Num --;
}
}
|
|