/******************************************************************************/
// 包含头文件
/******************************************************************************/
#include "config.h"
#include "eeprom.h"
#include "delay.h"
/******************************************************************************/
// 函数名称:EEPROM_Software_Reset
// 输入参数:无
// 输出参数:无
// 函数功能:EEPROM软件复位
/******************************************************************************/
void EEPROM_Software_Reset(void){
uint8 i;
IIC_Start();
//9 clock
scl = 0;
sda = 1;
for(i=0;i<9;i++){
scl = 0;
_nop_();//delay
_nop_();
scl = 1;
_nop_();//delay
scl = 0;
_nop_();//delay
_nop_();
}
IIC_Start();
IIC_Stop();
}
/******************************************************************************/
// 函数名称:IIC_Start
// 输入参数:无
// 输出参数:无
// 函数功能:IIC发送开始信号
/******************************************************************************/
void IIC_Start(void){
scl = 0;
sda = 1;
scl = 1;
_nop_();
sda = 0;
_nop_();
}
/******************************************************************************/
// 函数名称:IIC_Stop
// 输入参数:无
// 输出参数:无
// 函数功能:IIC发送停止信号
/******************************************************************************/
void IIC_Stop(void){
scl = 0;
sda = 0;
scl = 1;
_nop_();
sda = 1;
}
/******************************************************************************/
// 函数名称:IIC_Write_Byte
// 输入参数:dataSend-发送字节数据
// 输出参数:无
// 函数功能:IIC发送一个字节
/******************************************************************************/
void IIC_Write_Byte(uint8 dataSend){
uint8 i;
for(i=0;i<8;i++){
scl = 0;
if(dataSend&0x80)sda=1; //从最高位开始写
else sda = 0;
_nop_();
scl = 1;
_nop_();
scl = 0;
_nop_();
dataSend <<= 1;
}
}
/******************************************************************************/
// 函数名称:IIC_Ack
// 输入参数:无
// 输出参数:返回flag=0表示写入成功
// 函数功能:IIC应答信号
/******************************************************************************/
bit IIC_Ack(void){
bit flag;
scl = 0;
sda = 1;
_nop_();
_nop_();
scl = 1;
_nop_();
flag = sda;//读SDA
_nop_();
scl = 0;
_nop_();
_nop_();
return flag;
}
/******************************************************************************/
// 函数名称:IIC_NoAck
// 输入参数:无
// 输出参数:无
// 函数功能:IIC无应答信号
/******************************************************************************/
void IIC_NoAck(void){
scl = 0;
sda = 1;
_nop_();
_nop_();
scl = 1;
_nop_();
_nop_();
scl = 0;
_nop_();
_nop_();
}
/******************************************************************************/
// 函数名称:IIC_Read_Byte
// 输入参数:无
// 输出参数:返回读到的字节数据
// 函数功能:读一个字节
/******************************************************************************/
uint8 IIC_Read_Byte(void){
uint8 dataRead,i;
for(i=0;i<8;i++){
dataRead <<= 1;
scl = 0;
sda = 1;
_nop_();
_nop_();
scl = 1;
_nop_();
// flag = sda;//读SDA
if(sda)dataRead |= 0x01;
_nop_();
scl = 0;
_nop_();
_nop_();
}
return dataRead;
}
/******************************************************************************/
// 函数名称:EEPROM_CurrentAddr_Read
// 输入参数:devAddr-设备地址
// 输出参数:返回读到的字节数据
// 函数功能:currentAddress Read方式读取一个字节
/******************************************************************************/
uint8 EEPROM_CurrentAddr_Read(uint8 devAddr){
uint8 dataRead;
IIC_Start();
IIC_Write_Byte(devAddr);
IIC_Ack();
dataRead = IIC_Read_Byte();
IIC_NoAck();
IIC_Stop();
return dataRead;
}
/******************************************************************************/
// 函数名称:EEPROM_Byte_Write
// 输入参数:devAddr-设备地址 wordAddr-字节地址 dataSend-数据
// 输出参数:无
// 函数功能:在指定设备的字节地址写一个字节的数据
/******************************************************************************/
void EEPROM_Byte_Write(uint8 devAddr,uint8 wordAddr,uint8 dataSend){
IIC_Start();
IIC_Write_Byte(devAddr);
IIC_Ack();
IIC_Write_Byte(wordAddr);
IIC_Ack();
IIC_Write_Byte(dataSend);
IIC_Ack();
IIC_Stop();
Delay5ms();//EEPROM发送停止信号之后需要延时5ms(EEPROM internal write/clear cycle)
}