24c02读写(iic总线)

24C02简介
24c02地址介绍

24C02得工作原理。
1、24C02是2Kbits 意思是有2048bit,换算成字节是256Byte,也就是说最多可以存储255个字节的数据;
2、ATMEl24C02(应该其他厂家的24C02也是这样子吧。。。)有32页,每页可以存放8个字节;
3、24C02有两种工作模式:
(1)、字节写入模式:结合技术文档我认为该模式是这样工作的:首先是可以再任意的地址(0x00~0xFF)写入一个字节,也可以在某一地址连续的写入N字节,而且不需要翻页,从技术手册得知,答题时说字节写入模式下,页指针根写入数据的多少来自动增加实现翻页功能,不用自己在程序里边实现;
(2)、页写入模式:页写入模式下,手册上写着,一页可以存8字节,当存储的数据大于8时,则会覆盖先前保存的数据,例如,有16个数据 uchar data[16]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15},从24C02的0x00地址开始存放,当存完一页(8个)时,第9个数据会保存在0x00,覆盖掉开始保存的1,后边的数据一次类推,这样的现象叫做“翻转”,如果想写完一页后将剩余的数据保存在下一页,页指针需要自己来设定。
我觉着,字节写入模式相对更简单些。
(转自)

24C02是一个2K位串行CMOS 的EEPROM,内部含有256个8位字节。
与 400KHz I2C 总线兼容 
1.8 到 6.0 伏工作电压范围 
低功耗 CMOS 技术 
写保护功能 当 WP 为高电平时进入写保护状态 
页写缓冲器 
自定时擦写周期 
1,000,000 编程/擦除周期 
可保存数据 100 年 
8 脚 DIP SOIC 或 TSSOP 封装 

24c02读写(iic总线)_第1张图片

const u8 TEXT_Buffer[]={
     "Elite STM32 IIC TEST"};
	u8 datatemp[SIZE];
AT24CXX_Write(0,(u8*)TEXT_Buffer,SIZE);//将数据数组写入24c02

AT24CXX_Read(0,datatemp,SIZE);//读24c02存入datatemp
//在AT24CXX里面的指定地址开始写入指定个数的数据
//WriteAddr :开始写入的地址 对24c02为0~255
//pBuffer   :数据数组首地址
//NumToWrite:要写入数据的个数
void AT24CXX_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)
{
     
	while(NumToWrite--)
	{
     
		AT24CXX_WriteOneByte(WriteAddr,*pBuffer);//将pBuffer的一个字节写进入WriteAddr
		WriteAddr++;
		pBuffer++;
	}
}



写入过程

发送器件地址(0XA0)
发送要写入24C02的内存地址
发送要写入的数据
发送器件地址的格式

在这里插入图片描述
高四位1010是24Cxx系列的固定器件地址
接下来是A2、A1、A0是根据器件连接来决定(AT24c02对应的为E2,E1,E0)
我们的原理图都接地所以是000。
R/W为是选择读还是写,1的时候是读,0的时候是写。所以写的地址为0xA0。

iic读写时序
该链接有详细讲解时序,结合如下代码


//在AT24CXX指定地址写入一个数据
//WriteAddr  :写入数据的目的地址    
//DataToWrite:要写入的数据
void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{
     				   	  	    																 
    IIC_Start();  
	if(EE_TYPE>AT24C16)
	{
     
		IIC_Send_Byte(0XA0);	    //发送写命令
		IIC_Wait_Ack();
		IIC_Send_Byte(WriteAddr>>8);//发送高地址
 	}else
	{
     
		IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));   //发送器件地址0XA0,写数据 
	}	 
	IIC_Wait_Ack();	   
    IIC_Send_Byte(WriteAddr%256);   //发送低地址
	IIC_Wait_Ack(); 	 										  		   
	IIC_Send_Byte(DataToWrite);     //发送字节							   
	IIC_Wait_Ack();  		    	   
    IIC_Stop();//产生一个停止条件 
	delay_ms(10);	 
}

你可能感兴趣的:(stm32学习总结)