介绍
24C02存储器容量为258个字节,也就是258×8个位 = 2K个位(2KB),2000个bit
24C04对应4KB, 24C08对应8KB
24C02的芯片地址为1010(A) (Read=1,Write=0) 0xA1读 0xA0写
因为A2 A1 A0分别对应下图中的E3 E2 E1而他们都接地对应为1010 000,最后一位由读或写决定
所以24C02的地址只能为1010 0000(0xA0) 或1010 0001(0xA1)
写操作时序
写字节时序
开始态——>器件地址——>首字节地址(从256个字节的哪一个开始写)——>要写入的数据——>停止态
写页面时序
AT24C02写
void i2c_write(unsigned char *pucBuf, unsigned char ucAddr, unsigned char ucNum)
/* *pucBuf: 写的内容,从数组里取
ucAddr: 要写的那个字节的地址
ucNum: 从写的内容往后推要写多少个数据
*/
{
I2CStart();
I2CSendByte(0xa0); //发送器件地址,以写的方式访问
I2CWaitAck(); //等待应答
I2CSendByte(ucADDr); //发送字节地址
I2CWaitAck();
while (ucNum--) //循环ucNum次
{
I2CSendByte(*pucBuf++); //发送数据
I2CWaitAck();
}
I2CStop();
delay(500);
}
//如果*pucBuf等于一个数组S,ucAddr等于8,ucNum等于10,
则EEPROM会把数组里从S[0]开始到S[9]这几个数据写入从8开始到17这几个字节地址里
i2c_write(s, 8, 10);
读操作时序
void i2c_read(unsigned char* pucBuf, unsigned char ucAddr, unsigned char ucNum)
/*pucBuf:把读到的数据放入pucBuf这个数组里
ucAddr: 读24C02里哪个地址的内容
ucNum : 从这个地址开始我们要读几个内容 */
{
I2Cstart();
I2CSendByte(0xa0); //0:先写器件地址
I2CWaitAck();
I2CSendByte(ucAddr); //再写进去我要读的位置 ,接下来读的时候直接读器件地址它就会自动去看写的字节地址
I2CWaitAck();
I2Cstart();
I2CSendByte(0xa1); //1:读这个器件地址
I2CWaitAck();
while(ucNum--)
{
*pucBuf++ = I2CReceiveByte(); //根据上一个阶段写的字节地址开始读并返回到数组里,读几个就控制几次循环
if(ucNum)
I2CSendAck(); //每读完一个字节都要发送一次ACk应答信号
else
I2CSendNotAck(); //直到最后一次就不发ACK信号
}
I2CStop();
}
笔记来自蚂蚁工厂科技教程