msg_pt100/board/24cxx.c

130 lines
3.7 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
}