STM32G070用HAL库与AT24C08通讯

一、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++;
    }
}
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值