130 lines
3.7 KiB
C
130 lines
3.7 KiB
C
#include "24cxx.h"
|
||
#include "i2c.h"
|
||
//初始化IIC接口
|
||
|
||
#define AT24CXX_HANDLE (&hi2c4) //IIC接口
|
||
#define AT24C_DEV_ADDR (0XA0) //设备地址
|
||
#define AT24CXX_PAGE_SIZE 64 //设备地址
|
||
|
||
void at24cxx_init(void)
|
||
{
|
||
at24cxx_check();
|
||
}
|
||
|
||
|
||
//从指定地址开始写入多个字节数据
|
||
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);
|
||
int selectPage_idx = WriteAddr % AT24CXX_PAGE_SIZE;
|
||
int selectPage_rest = AT24CXX_PAGE_SIZE - selectPage_idx;
|
||
|
||
if (NumToWrite <= selectPage_rest)
|
||
{
|
||
HAL_I2C_Mem_Write(AT24CXX_HANDLE,AT24C_DEV_ADDR,WriteAddr,I2C_MEMADD_SIZE_16BIT,pBuffer,NumToWrite,HAL_MAX_DELAY);
|
||
delay_ms(5);
|
||
|
||
}
|
||
else
|
||
{
|
||
/*! 1 write selectPage rest*/
|
||
HAL_I2C_Mem_Write(AT24CXX_HANDLE,AT24C_DEV_ADDR,WriteAddr,I2C_MEMADD_SIZE_16BIT,pBuffer,selectPage_rest,HAL_MAX_DELAY);
|
||
delay_ms(5);
|
||
|
||
WriteAddr += selectPage_rest;
|
||
NumToWrite -= selectPage_rest;
|
||
pBuffer += selectPage_rest;
|
||
|
||
/*! 2 write nextPage full */
|
||
int fullPage = NumToWrite/AT24CXX_PAGE_SIZE;
|
||
for (int iPage = 0; iPage < fullPage; ++iPage)
|
||
{
|
||
HAL_I2C_Mem_Write(AT24CXX_HANDLE,AT24C_DEV_ADDR,WriteAddr,I2C_MEMADD_SIZE_16BIT,pBuffer,AT24CXX_PAGE_SIZE,HAL_MAX_DELAY);
|
||
delay_ms(5);
|
||
|
||
WriteAddr += AT24CXX_PAGE_SIZE;
|
||
NumToWrite -= AT24CXX_PAGE_SIZE;
|
||
pBuffer += AT24CXX_PAGE_SIZE;
|
||
}
|
||
}
|
||
|
||
/*! 3 write rest */
|
||
if (0 != NumToWrite)
|
||
{
|
||
HAL_I2C_Mem_Write(AT24CXX_HANDLE, AT24C_DEV_ADDR,WriteAddr,I2C_MEMADD_SIZE_16BIT,pBuffer,NumToWrite,HAL_MAX_DELAY);
|
||
delay_ms(5);
|
||
}
|
||
}
|
||
|
||
|
||
//从指定地址开始读取多个个字节数据
|
||
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);
|
||
int selectPage_idx = ReadAddr % AT24CXX_PAGE_SIZE;
|
||
int selectPage_rest = AT24CXX_PAGE_SIZE - selectPage_idx;
|
||
|
||
if (NumToRead <= selectPage_rest)
|
||
{
|
||
HAL_I2C_Mem_Read(AT24CXX_HANDLE,AT24C_DEV_ADDR,ReadAddr,I2C_MEMADD_SIZE_16BIT,pBuffer,NumToRead,HAL_MAX_DELAY);
|
||
delay_ms(5);
|
||
|
||
}
|
||
else
|
||
{
|
||
/*! 1 write selectPage rest*/
|
||
HAL_I2C_Mem_Read(AT24CXX_HANDLE,AT24C_DEV_ADDR,ReadAddr,I2C_MEMADD_SIZE_16BIT,pBuffer,selectPage_rest,HAL_MAX_DELAY);
|
||
delay_ms(5);
|
||
|
||
ReadAddr += selectPage_rest;
|
||
NumToRead -= selectPage_rest;
|
||
pBuffer += selectPage_rest;
|
||
|
||
/*! 2 write nextPage full */
|
||
int fullPage = NumToRead/AT24CXX_PAGE_SIZE;
|
||
for (int iPage = 0; iPage < fullPage; ++iPage)
|
||
{
|
||
HAL_I2C_Mem_Read(AT24CXX_HANDLE,AT24C_DEV_ADDR,ReadAddr,I2C_MEMADD_SIZE_16BIT,pBuffer,AT24CXX_PAGE_SIZE,HAL_MAX_DELAY);
|
||
delay_ms(5);
|
||
|
||
ReadAddr += AT24CXX_PAGE_SIZE;
|
||
NumToRead -= AT24CXX_PAGE_SIZE;
|
||
pBuffer += AT24CXX_PAGE_SIZE;
|
||
}
|
||
}
|
||
|
||
/*! 3 write rest */
|
||
if (0 != NumToRead)
|
||
{
|
||
HAL_I2C_Mem_Read(AT24CXX_HANDLE, AT24C_DEV_ADDR,ReadAddr,I2C_MEMADD_SIZE_16BIT,pBuffer,NumToRead,HAL_MAX_DELAY);
|
||
delay_ms(5);
|
||
}
|
||
}
|
||
|
||
|
||
//检查AT24CXX是否正常,这里用了24XX的最后一个地址(255)来存储标志字.如果用其他24C系列,这个地址要修改
|
||
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;
|
||
}
|
||
|
||
|