二、代码
编写驱动文件:
24CXX.c文件代码如下:
#include "24cxx.h"
#include "myiic.h"
#include "i2c.h"
//初始化IIC接口
#define AT24CXX_HANDLE (&hi2c1) //IIC接口
#define AT24C_DEV_ADDR (0XA0) //设备地址
void AT24CXX_Init(void)
{
//IIC_Init();//IIC初始化
AT24CXX_Check();
}
/*****************************************
函数名:void AT24CXX_Write(uint16_t WriteAddr,uint8_t *pBuffer,uint16_t NumToWrite)
参数:WriteAddr :要写入数据的地址 pBuffer:要写入的数据的首地址 NumToWrite:要写入数据的长度
功能描述:从指定地址开始写入多个字节数据
返回值:无
*****************************************/
void AT24CXX_Write(uint16_t WriteAddr,uint8_t *pBuffer,uint16_t NumToWrite)
{
if(EE_TYPE < AT24C16)
HAL_I2C_Mem_Write(AT24CXX_HANDLE,AT24C_DEV_ADDR,WriteAddr,I2C_MEMADD_SIZE_8BIT,pBuffer,NumToWrite,HAL_MAX_DELAY);
else
HAL_I2C_Mem_Write(AT24CXX_HANDLE,AT24C_DEV_ADDR,WriteAddr,I2C_MEMADD_SIZE_16BIT,pBuffer,NumToWrite,HAL_MAX_DELAY);
}
/*****************************************
函数名:AT24CXX_Read(uint16_t ReadAddr,uint8_t *pBuffer,uint16_t NumToRead)
参数: ReadAddr:要读取数据的地址 pBuffer:回填数据首地址 NumToRead:数据长度
功能描述:从指定地址开始读取多个个字节数据
返回值:无
*****************************************/
void AT24CXX_Read(uint16_t ReadAddr,uint8_t *pBuffer,uint16_t NumToRead)
{
if(EE_TYPE < AT24C16)
HAL_I2C_Mem_Read(AT24CXX_HANDLE,AT24C_DEV_ADDR,ReadAddr,I2C_MEMADD_SIZE_8BIT,pBuffer,NumToRead,HAL_MAX_DELAY);
else
HAL_I2C_Mem_Read(AT24CXX_HANDLE,AT24C_DEV_ADDR,ReadAddr,I2C_MEMADD_SIZE_16BIT,pBuffer,NumToRead,HAL_MAX_DELAY);
}
/*****************************************
函数名:uint8_t AT24CXX_Check(void)
参数:无
功能描述:检查AT24CXX是否正常,这里用了24XX的最后一个地址(255)来存储标志字.如果用其他24C系列,这个地址要修改
返回值:检测成功返回0 失败返回1
*****************************************/
uint8_t AT24CXX_Check(void)
{
uint8_t temp;
uint8_t data = 0XAB;
AT24CXX_Read(EE_TYPE,&temp,1);//避免每次开机都写AT24CXX
if(temp != 0XAB)
return 1;
else//排除第一次初始化的情况
{
AT24CXX_Write(EE_TYPE,&data,1);
AT24CXX_Read(EE_TYPE,&temp,1);;
if(temp != 0XAB)
return 1;
}
return 0;
}
|