?? 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) //確認(rèn)為第2頁
{
EEPROM_ERR=1;
goto EndOfWrite;
}
if(WriteOneByte((unsigned char)(addrCounter-256))==0xEE) //偽寫指令,確認(rèn)地址
{
EEPROM_ERR=1;
goto EndOfWrite;
}
}
else
{
Stop();
Delay_ms(1);
Start();
if(WriteOneByte(CTRL_BYTE_EEPROM1)==0xEE) //確認(rèn)為第1頁
{
EEPROM_ERR=1;
goto EndOfWrite;
}
if(WriteOneByte((unsigned char)addrCounter)==0xEE) //偽寫指令,確認(rèn)地址
{
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);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -