📄 iic.c
字号:
#include "NEC78F0451.h"
unsigned char Write_EEPROM(unsigned int Addr,unsigned char L,unsigned char *RAM) //写EEPROM,型号为at24c04
{
unsigned char unc,temp;
unsigned int addrCounter;
WDTE=0xAC;
VCA=1;
WP=1;
Stop();
Delay_ms(1);
EEPROM_ERR=0;
if(L==0) goto EndOfWrite;
WP=0;
WDTE=0xAC;
Start();
if(Addr<256)
{
temp=CTRL_BYTE_EEPROM1;
unc=(unsigned char)Addr;
}
else
{
temp=CTRL_BYTE_EEPROM2;
unc=(unsigned char)(Addr-256);
}
if(WriteOneByte(temp)==0xEE)
{
EEPROM_ERR=1;
goto EndOfWrite;
}
if(WriteOneByte(unc)==0xEE)
{
EEPROM_ERR=1;
goto EndOfWrite;
}
addrCounter=Addr-1;
WriteNextOneByte:
WDTE=0xAC;
addrCounter++;
if((addrCounter!=Addr)&&((addrCounter%16)==0))
{
if(addrCounter>=256)
{
Stop();
Delay_ms(1);
Start();
if(WriteOneByte(CTRL_BYTE_EEPROM2)==0xEE) //确认为第2页
{
EEPROM_ERR=1;
goto EndOfWrite;
}
if(WriteOneByte((unsigned char)(addrCounter-256))==0xEE) //伪写指令,确认地址
{
EEPROM_ERR=1;
goto EndOfWrite;
}
}
else
{
Stop();
Delay_ms(1);
Start();
if(WriteOneByte(CTRL_BYTE_EEPROM1)==0xEE) //确认为第1页
{
EEPROM_ERR=1;
goto EndOfWrite;
}
if(WriteOneByte((unsigned char)addrCounter)==0xEE) //伪写指令,确认地址
{
EEPROM_ERR=1;
goto EndOfWrite;
}
}
}
if(WriteOneByte(*RAM++)==0xEE)
{
EEPROM_ERR=1;
goto EndOfWrite;
}
L--;
if(L==0x00)
{
goto EndOfWrite;
}
else
{
goto WriteNextOneByte;
}
EndOfWrite:
WDTE=0XAC;
Stop();
Delay_ms(1);
WP=1;
VCA=0;
return EEPROM_ERR;
}
unsigned char Read_EEPROM(unsigned int Addr,unsigned char L,unsigned char *RAM) //读EEPROM
{
unsigned char unc,temp;
WDTE=0xAC;
VCA=1;
WP=1;
Stop();
Delay_ms(1);
EEPROM_ERR=0;
if(L==0) goto EndOfRead;
Start();
if(Addr<256)
{
temp=CTRL_BYTE_EEPROM1;
unc=(unsigned char)Addr;
}
else
{
temp=CTRL_BYTE_EEPROM2;
unc=(unsigned char)(Addr-256);
}
if(WriteOneByte(temp)==0xEE) //器件及页地址
{
EEPROM_ERR=1;
goto EndOfRead;
}
if(WriteOneByte(unc)==0xEE) //写具体地址(伪写)
{
EEPROM_ERR=1;
goto EndOfRead;
}
Start();
if(WriteOneByte(temp+1)==0xEE) //读命令
{
EEPROM_ERR=1;
goto EndOfRead;
}
for(;L>0;L--)
{
WDTE=0xAC;
*RAM++=ReadOneByte(L);
}
EndOfRead:
WDTE=0XAC;
Stop();
VCA=0;
return EEPROM_ERR;
}
void Start(void)
{
unsigned char unc;
SCL0_DIR=0;
SDA0_DIR=0;
SCL0=0;
for(unc=1;unc>0;unc--);
SDA0=1;
for(unc=1;unc>0;unc--);
SCL0=1;
for(unc=1;unc>0;unc--);
SDA0=0;
for(unc=1;unc>0;unc--);
SCL0=0;
for(unc=1;unc>0;unc--);
}
void Stop(void)
{
unsigned char unc;
SCL0_DIR=0;
SDA0_DIR=0;
SCL0=0;
for(unc=1;unc>0;unc--);
SDA0=0;
for(unc=1;unc>0;unc--);
SCL0=1;
for(unc=1;unc>0;unc--);
SDA0=1;
for(unc=1;unc>0;unc--);
SCL0=0;
for(unc=1;unc>0;unc--);
}
unsigned char WriteOneByte(unsigned char BYTE)
{
unsigned char unc,ctrl;
unsigned char i;
SCL0_DIR=0;
SDA0_DIR=0;
ctrl=0x80;
for(i=0;i<8;i++)
{
if((BYTE&ctrl)==ctrl)
{
SDA0=1;
}
else
{
SDA0=0;
}
SCL0=1;
for(unc=1;unc>0;unc--);
SCL0=0;
for(unc=1;unc>0;unc--);
ctrl>>=1;
}
SCL0_DIR=0;
SDA0_DIR=1;
SCL0=1;
for(unc=1;unc>0;unc--);
if(SDA0)
{
ctrl=0xEE;
}
else
{
ctrl=0x00;
}
SCL0=0; // ACK falling edge
for(unc=1;unc>0;unc--);
SCL0_DIR=0;
SDA0_DIR=0;
return(ctrl);
}
unsigned char ReadOneByte(unsigned char ackctrl)
{
unsigned char unc,data;
unsigned char i;
SCL0_DIR=0;
SDA0_DIR=1;
data=0;
for(i=0;i<8;i++)
{
SCL0=1;
for(unc=1;unc>0;unc--);
data<<=1;
if(SDA0)
{
data|=0x01;
}
else
{
data|=0x00;
}
SCL0=0;
for(unc=4;unc>0;unc--);
}
SCL0_DIR=0;
SDA0_DIR=0;
if(ackctrl!=0x01)
{
SDA0=0;
SCL0=1;
for(unc=1;unc>0;unc--);
SCL0=0;
for(unc=1;unc>0;unc--);
}
return(data);
}
unsigned char ReadLastOneByte(void)
{
unsigned char unc,data;
unsigned char i;
SCL0_DIR=0;
SDA0_DIR=1;
data=0;
for(i=0;i<8;i++)
{
SCL0=1;
for(unc=1;unc>0;unc--);
data<<=1;
if(SDA0)
{
data|=0x01;
}
else
{
data|=0x00;
}
SCL0=0;
for(unc=1;unc>0;unc--);
}
SCL0_DIR=0;
SDA0_DIR=0;
SDA0=1;
SCL0=1;
for(unc=1;unc>0;unc--);
SCL0=0;
for(unc=1;unc>0;unc--);
return(data);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -