AT24C02写数据介绍

EEPROM的写数据分为:

  1. 字节写数据模式

  2. 页写数据模式;

字节写就是一个地址一个数据的写,页写是连续写数据,一个地址多个数据的写,但是页写不能自动跨页,如果超出一页长度,超出的数据会覆盖原先写入的数据。

跨页写数据实现原理:

通过IIC读写AT24C02,百度上面有一大堆例程。但向AT24C02写一个字符串时,例程上基本上都是以页写的形式呈现。

页写入的方式只能写满一页,不能跨页继续写。

在此补充一个实现跨页写的函数,希望可以帮助到大家:

跨页写数据代码实现

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189


#define Page_Byte 8 //页字节8个





#define Max_Addr 0xff   //最大可访问地址





unsigned char AT24C02_Write(unsigned char WriteAddr,unsigned char* buffer)





{





  unsigned short int BufSize = strlen(buffer); //获取要写入的字符串长度





  if((Max_Addr-WriteAddr) < BufSize) //空间不足返回0





  return 0;





  I2C_Start(); //发I2C起始信号





  I2C_Send_Byte(0XA0); //写器件地址





  I2C_Wait_Ack(); //等待应答信号





  I2C_Send_Byte(WriteAddr); //发送地址





  I2C_Wait_Ack(); //等待应答信号





  while(*buffer++ != 0)





  {





    I2C_Send_Byte(*buffer); //发送数据





    I2C_Wait_Ack(); //等待应答信号





    WriteAddr++; //写入地址加1





    if(WriteAddr % Page_Byte == 0) //新的一页





    {





      I2C_Stop();





      delay_24c02();// AT24C02的写入周期是5ms,延时一定要大于或者等于5ms





      I2C_Start();





      I2C_Send_Byte(0XA0);





      I2C_Wait_Ack(); //等待应答信号





      I2C_Send_Byte(WriteAddr); //发送地址





      I2C_Wait_Ack(); //等待应答信号





    }





  }





    I2C_Stop();





    delay_24c02();





    return 1;





}

代码说明

在上面的代码中,有两个宏定义,第一个是一页可以写入的字节。在进行页写入的时候,比如写到了地址0x08,那么我们就要对这个地址进行判断,因为0x08已经是新的一页,所以 我们就要给一个停止信号,重新开始一次IIC通信,如何判断一个地址是否是新的一页,就是通过if(WriteAddr % Page_Byte == 0)这条语句实现的。

第二个宏定义是最大可写入地址,当写入的字节数大于剩余的可写入空间时,就可以通过if((Max_Addr-WriteAddr) < BufSize)这条语句实现,这样的代码更加规范、安全。

注意事项

由于E2PROM的半导体工艺特性,对E2PROM的写入时间需要5~10ms,但AT24Cxx系列串行E2PROM芯片内部设置了一个具有SRAM性质的输入缓冲器,称为页写缓冲器。

CPU对该芯片写操作时,AT24Cxx系列芯片先将CPU输入的数据暂存在页写缓冲器内,然后,慢慢写入E2PROM中。

因此,CPU对AT24Cxx系列E2PROM一次写入的字节数,受到该芯片页写缓冲器容量的限制。

页写缓冲器的容量为16B,若CPU写入字节数超过芯片页写缓冲器容量,应在一页写完后,隔5~10ms重新启动一次写操作。

而且,若不是从页写缓冲器页内零地址0000写起,一次写入地址超出页内最大地址1111时,也将出错。

例如,若从页内地址0000写起,一次最多可写16字节;

若从页内地址0010写起,一次最多只能写14字节,若要写16字节,超出页内地址1111,将会引起地址翻卷,导致出错。