1.字节写 写操作要求在接收器件地址和 ACK应答后,接收8位的字地址。接收到这个地址后 EEPROM应答"0",然后是一个8位数据。在接收8位数据后,EEPROM应答"0",接着必须由主器件发送停止条件来终止写序列。此时 EEPROM进入内部写周期 twR,数据写入非易失性存储器中,在此期间所有输入都无效。直到写周期完成,EEPROM才会有应答。2.随机读 随机读需先写一个目标字地址,一旦 EEPROM接收器件地址和字地址并应答了ACK,主器件就产生一个重复的起始条件。然后,主器件发送器件地址(读/写选择位为"1"),EEPROM 应答 ACK,并随时钟送出数据。主器件无需应答"0",但需发送停止条件。将上面的话改编成完整的话语,意思不变
时间: 2023-06-14 15:04:03 浏览: 86
1. 当进行写操作时,需要先发送接收器件地址,并在接收到 ACK 应答后发送8位的字地址。一旦 EEPROM 接收到这个地址并应答"0"后,主器件需发送8位数据。在接收到8位数据后,EEPROM 再次应答"0",此时主器件需发送停止条件来终止写序列。此时 EEPROM 进入内部写周期 twR,数据写入非易失性存储器中,此期间所有输入都将无效。直到写周期完成,EEPROM 才会应答。
2. 进行随机读操作时,首先需要发送目标字地址。一旦 EEPROM 接收到器件地址和字地址并应答了 ACK,主器件就需要产生一个重复的起始条件。然后,主器件需发送器件地址(读/写选择位为"1"),EEPROM 应答 ACK,并随时钟送出数据。主器件无需应答"0",但需发送停止条件。以上是进行随机读操作时的操作流程。
相关问题
51单片机eeprom读写程序
以下是51单片机EEPROM读写程序的基本框架:
```c
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SDA=P2^0; //定义SDA引脚
sbit SCL=P2^1; //定义SCL引脚
void delay_5us() //延时函数
{
_nop_();
}
void start() //I2C起始信号
{
SDA=1;
SCL=1;
delay_5us();
SDA=0;
delay_5us();
SCL=0;
delay_5us();
}
void stop() //I2C停止信号
{
SDA=0;
SCL=1;
delay_5us();
SDA=1;
delay_5us();
}
void ack() //I2C应答信号
{
SDA=0;
SCL=1;
delay_5us();
SCL=0;
delay_5us();
}
void no_ack() //I2C非应答信号
{
SDA=1;
SCL=1;
delay_5us();
SCL=0;
delay_5us();
}
uchar read_byte() //I2C读取一个字节
{
uchar i,data;
SDA=1;
for(i=0;i<8;i++)
{
SCL=1;
delay_5us();
data<<=1;
data|=SDA;
SCL=0;
delay_5us();
}
return data;
}
void write_byte(uchar data) //I2C写入一个字节
{
uchar i;
for(i=0;i<8;i++)
{
SDA=data&0x80;
SCL=1;
delay_5us();
SCL=0;
delay_5us();
data<<=1;
}
}
void write_eeprom(uchar addr,uchar data) //写入EEPROM
{
start(); //起始信号
write_byte(0xa0); //写入器件地址,0xa0代表写入模式
ack(); //等待应答
write_byte(addr); //写入存储地址
ack(); //等待应答
write_byte(data); //写入数据
ack(); //等待应答
stop(); //停止信号
}
uchar read_eeprom(uchar addr) //读取EEPROM
{
uchar data;
start(); //起始信号
write_byte(0xa0); //写入器件地址,0xa0代表写入模式
ack(); //等待应答
write_byte(addr); //写入存储地址
ack(); //等待应答
start(); //起始信号
write_byte(0xa1); //写入器件地址,0xa1代表读取模式
ack(); //等待应答
data=read_byte(); //读取数据
no_ack(); //发送非应答信号
stop(); //停止信号
return data;
}
void main()
{
uchar addr=0x01; //定义存储地址
uchar data=0x55; //定义写入数据
uchar read_data; //定义读取数据
write_eeprom(addr,data); //写入EEPROM
read_data=read_eeprom(addr); //读取EEPROM
while(1);
}
```
以上程序通过I2C总线实现了对51单片机的EEPROM进行读写操作。程序中的read_eeprom和write_eeprom函数分别对EEPROM进行读取和写入操作,其中的0xa0和0xa1是器件地址,表示写入和读取模式,具体的地址需要根据实际情况进行修改。
阅读全文