前言
在实际的应用中,我们需要一些存储介质帮助我们来存储一些东西,如保存一些参数和配置数据等。比较常用的有AT24Cxx系列。AT24C02芯片是以IIC接口的EEPROM器件。所谓EEPROM即电可擦除可编程只读存储器,是ROM的一种。它是只读存储器,即掉电可继续存储数据,而同时又可以在高于普通电压的作用下擦除和重写。
AT24C02
其中A0、A1、A2用于定义芯片地址,VCC和GND是供电正负接口,SCL和SDA是IIC的数据总线,WP是写保护(若接VCC则该芯片所有内容都被保护,只能读不能写,一般我们直接接地)。单片机入门绘制电路板,需要正品元器件可去唯样商城,原厂真货。
AT24C02的从机地址前四位1010为固定值,A0,A1,A2正好与芯片的1,2,3引角对应,最末一位表示读(1)或写(0)。
AT24C02的内存有2Kbit(256byte),分为32页,对其的写操作包括字节写和页写。
写操作
字节写
字节写就是对指定地址的字节进行写入操作,时序是:
①发送start信号
②发送从器件地址+写标志“0”,并等待应答信号
③发送要写入的地址,并等待应答信号
④发送要写入的数据,并等应答信号
⑤发送stop信号。
页写
页写则是在字节写的基础上,在第⑤步之前多次使用第④步,即最后先不要发送stop信号,而是继续发送数据,这时AT24C02就会自动将地址加一,待所有数据发送完毕再发送stop信号。
读操作
随机读
随机读可以指定要读取数据的地址,具体时序:
①发送start信号
②发送从器件地址+写标志“0”,并等待应答
③发送要读数据的地址,并等待应答
④重新发送一个start信号(也可称为restart信号)
⑤发送从器件地址+读标志“1”,并等待应答
⑥接收传来的数据,收到数据后要发送非应答信号
⑦发送stop信号。
当前地址读
当前地址读则是只能读取芯片内部最近一次操作的地址加一处的数据(主要在已知上次操作地址时使用),具体时序:
①发送start信号
②发送从器件地址+读标志“1”,并等待应答
③接收传来的数据,然后发送非应答信号
④发送stop信号。
顺序读
顺序读则是在前两种读操作的基础上,在接收到数据后发送应答信号,然后就可以继续读上次操作地址加一处的数据了(这是在芯片内部实现的),当读够数据后,要发送非应答信号,最后发送stop信号。
代码
void write_AT24C02(uchar unit_addr, uchar dat)
{
start();
write_byte(AT24C02_ADDR + 0);
ack();
write_byte(unit_addr);
ack();
write_byte(dat);
ack();
end();
}
uchar read_AT24C02(uchar unit_addr)
{
uchar dat;
start();
write_byte(AT24C02_ADDR + 0);
ack();
write_byte(unit_addr);
ack();
start();
write_byte(AT24C02_ADDR + 1);
ack();
dat = read_byte();
end();
return dat;
}
void main()
{
write_AT24C02(0xf0, 0xae);
delay_10ms();
P1 = read_AT24C02(0xf0);
while(1);
}
e); delay_10ms(); //写完后,必须延时一定的时间才可以读取 P1 = read_AT24C02(0xf0); while(1); }
|