一、AT24C08的通讯方式
AT24C08采用IIC通讯协议,本次例程是普通IO口模拟IIC端口
二、AT24C08的存储方式
AT24C08有8K位存储空间,可以存储8K/8=1K字节的空间,
1K存储空间,是由外部的A2决定如何分配的,例如你的A2引脚固定接地,那么这1K的存储空间
就分成了4块,每块都有256字节存储空间,每个字节是8位
器件写地址分别是0xA0,0xA2,0xA4,0xA6
器件读地址分别是0xA1,0xA3,0xA5,0xA7
- /*
- *描述: 在eeprom指定地址写入一个数据
- *参数: WriteAddr :写入数据的目的地址
- * DataToWrite:要写入的数据
- *返回值:读到的数据
- */
- void Eeprom_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
- {
- IIC_Start();
- 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();//产生一个停止条件
- HAL_Delay(10);
- }
- /*
- *描述: 在eeprom指定地址读出一个数据
- *参数: ReadAddr:开始读数的地址
- *返回值:读到的数据
- */
- u8 Eeprom_ReadOneByte(u16 ReadAddr)
- {
- u8 temp=0;
- IIC_Start();
-
- IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //发送器件地址0XA0,写数据
- IIC_Wait_Ack();
- IIC_Send_Byte(ReadAddr%256); //发送低地址
- IIC_Wait_Ack();
- IIC_Start();
- IIC_Send_Byte(0XA1+((ReadAddr/256)<<1)); //进入接收模式
-
- IIC_Wait_Ack();
- temp=IIC_Read_Byte(0);
-
- IIC_Stop();//产生一个停止条件
-
- return temp;
- }
- /*
- *描述: 检查EEPROM是否正常
- *参数: 无
- *返回值:外接EEPROM是否存在
- */
- u8 Eeprom_Check(void)
- {
- u8 temp;
- temp=Eeprom_ReadOneByte(1023);//避免每次开机都写EEPROM
- if(temp==0X55)return 0;
- else//排除第一次初始化的情况
- {
- Eeprom_WriteOneByte(1023,0X55);
- temp=Eeprom_ReadOneByte(1023);
- if(temp==0X55)return 0;
- }
- return 1;
- }
- /*
- *描述: 在EEPROM里面的指定地址开始读出指定个数的数据
- *参数: ReadAddr: 开始读出的地址
- * pBuffer: 数据数组首地址
- * NumToRead:要读出数据的个数
- *返回值:读到的数据
- */
- void Eeprom_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)
- {
- while(NumToRead)
- {
- CLRWDG();
- *pBuffer++=Eeprom_ReadOneByte(ReadAddr++);
- NumToRead--;
- }
- }
- /*
- *描述: 在EEPROM里面的指定地址开始写入指定个数的数据
- *参数: WriteAddr: 开始写入的地址
- * pBuffer: 数据数组首地址
- * NumToWrite: 要写入数据的个数
- *返回值:读到的数据
- */
- void Eeprom_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)
- {
- while(NumToWrite--)
- {
- CLRWDG();
- Eeprom_WriteOneByte(WriteAddr,*pBuffer);
- WriteAddr++;
- pBuffer++;
- }
- }
复制代码
|