| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- #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;
- }
- };
-
- }
- void 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){
- break;
- }
- };
- }
- /* 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;
- }
- void 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;
- }
- WriteAddr += w_len;
- pBuffer += w_len;
- remain_len -= w_len;
- }
- }
- #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
|