一、AT24C08的通讯方式
AT24C08采用IIC通讯协议,本次例程是普通IO口模拟IIC端口
IIC的配置可以参考下面链接
https://blog.youkuaiyun.com/zhai17863966493/article/details/116565365
二、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++;
}
}