#include "i2c.h" #include "AT24CXX.h" void AT24CXX_Init(void) { gd32_i2c_init(0, 100*1000);//here, need 120K min speed, may be the GD lib is something wrong!!!! } void AT24CXX_DeInit(void){ gd32_i2c_deinit(0); } uint8_t AT24CXX_ReadOneByte(uint16_t ReadAddr) { uint8_t value = 0; uint8_t device_addr = 0xA0 | ((ReadAddr >>8) << 1); int try_count = 100; while(0 >= gd32_i2c_read_byte(0, device_addr, (uint8_t)(ReadAddr&0xFF), (uint8_t *)&value)){ if (try_count-- <= 0){ break; } }; return value; } void AT24CXX_WriteOneByte(uint16_t WriteAddr,uint8_t DataToWrite) { uint8_t device_addr = 0xA0 | ((WriteAddr >>8) << 1); int try_count = 100; while(0 >= gd32_i2c_write_byte(0, device_addr, (uint8_t)(WriteAddr & 0xFF), (uint8_t)DataToWrite)){ if (try_count-- <= 0){ break; } }; } int AT24CXX_Read(uint16_t ReadAddr,uint8_t *pBuffer,uint16_t NumToRead) { uint8_t device_addr = 0xA0 | ((ReadAddr >>8) << 1); int try_count = 100; while(0 >= gd32_i2c_read_nbytes(0, device_addr, (uint8_t)(ReadAddr&0xFF), pBuffer, NumToRead)){ if (try_count-- <= 0){ return -1; } }; return NumToRead; } /* use page write to improve write time */ static int AT24CXX_Write_Pages(uint16_t WriteAddr,uint8_t *pBuffer,uint16_t NumToWrite){ uint8_t device_addr = 0xA0 | ((WriteAddr >>8) << 1); int try_count = 100; while(0 >= gd32_i2c_write_nbytes(0, device_addr, (uint8_t)(WriteAddr&0xFF), pBuffer, NumToWrite)){ if (try_count-- <= 0){ return -1; } }; return 0; } int AT24CXX_Write(uint16_t WriteAddr,uint8_t *pBuffer,uint16_t NumToWrite){ uint16_t remain_len = NumToWrite; while(remain_len > 0){ uint16_t w_len = (remain_len > PAGE_SIZE)?PAGE_SIZE:remain_len; if (AT24CXX_Write_Pages(WriteAddr, pBuffer, w_len) < 0){ return -1; } WriteAddr += w_len; pBuffer += w_len; remain_len -= w_len; } return NumToWrite; } #if 0 #define ADDR_START (0) static uint8_t buffr[128]; static int index = 0; static int _AT24CXX_test(void) { int i=0; char wdata = 0x5A; if (index % 2 == 1){ wdata = 0xA5; } for(i=0;i<128;i++) { buffr[i] = wdata; } AT24CXX_Write(ADDR_START,buffr,128); memset(buffr,0,128); AT24CXX_Read(ADDR_START,buffr,128); for(i=0;i<128;i++) { if (buffr[i] != wdata){ return -1; } } return 0; } void AT24CXX_test(void){ while(_AT24CXX_test() == 0){ index++; }; } #endif