一共255个,可写入的地址为从0x00到0xff.
IIC总线驱动代码
/*
程序说明: IIC总线驱动程序
软件环境: Keil uVision 4.10
硬件环境: CT107单片机综合实训平台 8051,12MHz
日 期: 2011-8-9
*/
#include "reg52.h"
#include "intrins.h"
#define DELAY_TIME 5
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
//总线引脚定义
sbit SDA = P2^1; /* 数据线 */
sbit SCL = P2^0; /* 时钟线 */
void IIC_Delay(unsigned char i)
{
do{_nop_();}
while(i--);
}
//总线启动条件
void IIC_Start(void)
{
SDA = 1;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 0;
}
//总线停止条件
void IIC_Stop(void)
{
SDA = 0;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 1;
IIC_Delay(DELAY_TIME);
}
//发送应答
void IIC_SendAck(bit ackbit)
{
SCL = 0;
SDA = ackbit; // 0:应答,1:非应答
IIC_Delay(DELAY_TIME);
SCL = 1;
IIC_Delay(DELAY_TIME);
SCL = 0;
SDA = 1;
IIC_Delay(DELAY_TIME);
}
//等待应答
bit IIC_WaitAck(void)
{
bit ackbit;
SCL = 1;
IIC_Delay(DELAY_TIME);
ackbit = SDA;
SCL = 0;
IIC_Delay(DELAY_TIME);
return ackbit;
}
//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{
unsigned char i;
for(i=0; i<8; i++)
{
SCL = 0;
IIC_Delay(DELAY_TIME);
if(byt & 0x80) SDA = 1;
else SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 1;
byt <<= 1;
IIC_Delay(DELAY_TIME);
}
SCL = 0;
}
//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{
unsigned char i, da;
for(i=0; i<8; i++)
{
SCL = 1;
IIC_Delay(DELAY_TIME);
da <<= 1;
if(SDA) da |= 1;
SCL = 0;
IIC_Delay(DELAY_TIME);
}
return da;
}
使用IIC总线对EEPROM(AT24C02)写字节。
void vWrite_EEPROM(u8 address, u8 data)
{
IIC_Start(void);
IIC_SendByte(0xa0);
IIC_WaitAck(void);
IIC_SendByte(address);
IIC_WaitAck(void);
IIC_SendByte(data);
IIC_WaitAck(void);
IIC_Stop(void);
vDelay_Ms(5); //最后记得延时5ms,因为写入周期是5ms
}
通过IIC总线对EEPROM芯片进行任意地址的读取。
unsigned char fRead_EEPROM(unsigned char address)
{
unsigned char Read_Data;
IIC_Start(void);
IIC_SendByte(0xa0);
IIC_WaitAck(void);
IIC_SendByte(address); //这个是EEPROM所存储数据的对应的字节地址,这里假定存储在0x21
IIC_WaitAck(void);
IIC_Start(void);
IIC_SendByte(0xa1);
IIC_WaitAck(void);
Read_Data = IIC_RecByte(void);
IIC_SendAck(1);
IIC_Stop(void);
return Read_Data;
}
两个字节最多存储65535,0xffff,16位。