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