📄 at24c._c
字号:
#include"include.h"
#define AT24CWAIT 1
#define AT24_DEVICEADDR 0xA0
#define SCL_HI() PORTB |= (1<<1)
#define SCL_LO() PORTB &= ~(1<<1)
#define SDA_HI() PORTB |= (1<<0)
#define SDA_LO() PORTB &= ~(1<<0)
#define SDA_OUTPUT() DDRB |= (1<<0)
#define SDA_INPUT() DDRB &= ~(1<<0)
#define SDAIN() (PINB&(1<<0))
void AT24C_delay(unsigned char us)
{
do{
asm("nop");
asm("nop");
}while(us--);
}
//打开I2C
void I2C_Initial(void)
{
DDRD |= (1<<1);//
DDRD |= (1<<0); //
SCL_HI();//SCL
SDA_HI();//SDA
}
//关闭I2C
void I2C_Close(void)
{
SCL_HI();//SCL
SDA_HI();//SDA
DDRD |= (1<<1);//
DDRD |= (1<<0); //
}
/*发送起动信号*/
void I2C_SendStart(void)
{
SCL_HI();
SDA_HI();
AT24C_delay(AT24CWAIT);
SDA_LO();
AT24C_delay(AT24CWAIT);
SCL_LO();
}
/*发送停止信号*/
void I2C_SendStop(void)
{
SDA_LO();
SCL_HI();
AT24C_delay(AT24CWAIT);
SDA_HI();
}
/*发送一字节数据*/
unsigned char I2C_SendByte(unsigned char c)
{
unsigned char i;
for(i=0;i<8;i++)
{
if((c<<i)&0x80) SDA_HI();
else SDA_LO();
AT24C_delay(AT24CWAIT);
SCL_HI();
AT24C_delay(AT24CWAIT);
SCL_LO();
}
SDA_INPUT();;
AT24C_delay(AT24CWAIT);
SCL_HI();
AT24C_delay(AT24CWAIT);
if(SDAIN()) i=0;
else i=1;
SCL_LO();
SDA_OUTPUT();
return i;
}
/*接收一字节数据*/
unsigned char I2C_ReceiveByte(void)
{
unsigned char i;
unsigned char retc;
retc=0;
SDA_INPUT();
for(i=0;i<8;i++)
{
retc <<= 1;
SCL_LO();
AT24C_delay(AT24CWAIT);
SCL_HI();
AT24C_delay(AT24CWAIT);
if(SDAIN()) retc |= 1;
AT24C_delay(AT24CWAIT);
}
SCL_LO();
AT24C_delay(AT24CWAIT);
SDA_HI();
SDA_OUTPUT();
SCL_HI();
AT24C_delay(AT24CWAIT);
SCL_LO();
return(retc);
}
/*EEPROM数据读出*/
unsigned char AT24_Read(unsigned char * buffer,unsigned int addr,unsigned char num)
{
unsigned char i,ret;
for(i=0;i<num;i++)
{
I2C_SendStart();
ret = I2C_SendByte(AT24_DEVICEADDR);
if(ret != 1)
return 0;
ret = I2C_SendByte(addr>>8);
if(ret != 1)
return 0;
ret = I2C_SendByte(addr);
if(ret != 1)
return 0;
I2C_SendStart();
ret = I2C_SendByte(AT24_DEVICEADDR|0x01);
if(ret != 1)
return 0;
buffer[i] = I2C_ReceiveByte();
I2C_SendStop();
addr ++;
AT24C_delay(10);
}
return 1;
}
unsigned char AT24_Write(unsigned char * buffer,unsigned int addr,unsigned char num)
{
unsigned char i,ct,ret;
ct = 0;
nextpage:
I2C_SendStart();
ret = I2C_SendByte(AT24_DEVICEADDR);
if(ret != 1)
return 0;
ret = I2C_SendByte(addr>>8);
if(ret != 1)
return 0;
ret = I2C_SendByte(addr);
if(ret != 1)
return 0;
for(i=0;i<num;i++)
{
ret = I2C_SendByte(buffer[ct++]);
if(ret != 1)
return 0;
addr ++;
if((((unsigned char)addr)&0x7F) == 0)
{
I2C_SendStop();
AT24C_delay(20);
num -= i+1;
goto nextpage;
}
}
I2C_SendStop();
AT24C_delay(15);
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -