- 20
- 0
- 约7.55千字
- 约 9页
- 2017-09-02 发布于湖北
- 举报
基于IIC 总线的E2PROM
――AT24C02
一、AT24C02 引脚分布
WP 写保护
如果WP 管脚连接到 Vcc ,所有的内容都被写保护,只能读。当 WP 管脚连接到Vss
或悬空,允许器件进行正常的读/写操作。
二、AT24C02 读写时间周期
三、I2C 总线协议
1、只有在总线空闲时才允许启动数据传送;
2、在数据传送过程中,当SCL=1 时,数据线SDA 必须保持稳定状态,不
允许有跳变;SCL=1 时,数据线SDA 的任何电平变化将被看作总线的起始
或停止信号;
AT24C02 程序设计
1.开始信号:
时钟线SCL 保持高电平期间,数据线SDA 电平从高到低的跳变作为I2C 总
线的起始信号。
void IIC_Start(void)
{
SDA_OUT(); //sda 线输出
IIC_SDA=1;
IIC_SCL=1;
delay_us(5);
IIC_SDA=0;
delay_us(5);
IIC_SCL=0; //钳住I2C 总线,准备发送或接收数据
}
2.停止信号:
时钟线SCL 保持高电平期间,数据线SDA 电平从低到高的跳变作为I2C 总
线的停止信号 。
void IIC_Stop(void)
{
SDA_OUT(); //sda 线输出 注意:SCL=1 时,
IIC_SCL=0; SDA 线不能有变化,
IIC_SDA=0; 有变化被视为开始或停止
delay_us(4);
IIC_SCL=1; //
IIC_SDA=1; //发送I2C 总线结束信号
delay_us(4);
}
3.应答信号:
I2C 总线数据传送时,每成功地传送一个字节数据后,接收器都必须产
生一个应答信号,应答的器件在第9 个时钟周期时,将 SDA 线拉低,表示
其已收到一个8 位数据。
void IIC_Ack(void)
{
IIC_SCL=0; //拉低时钟切换数据
SDA_OUT();
IIC_SDA=0;
delay_us(2);
IIC_SCL=1;
delay_us(4);
IIC_SCL=0;
}
4.非应答信号:
void IIC_NAck(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=1;
delay_us(2);
IIC_SCL=1;
delay_us(4);
IIC_SCL=0;
}
5. 单片机等待来自24C02 的应答信号
SCL 在高电平期间,SDA 被从设备拉为低电平表示应答
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN(); //SDA 设置为输入
IIC_SDA=1;delay_us(1); //释放总线
IIC_SCL=1;delay_us(1); //拉高SCL 等待
while(READ_SDA) //等待SDA 被拉低
{
ucErrTime++;
if(ucErrTime250)
{
IIC_Stop(); return 1;
}
}
原创力文档

文档评论(0)