Lib. for Atmel 1Mbits Serial EEPROM, AT24C1024B
Dependents: LPC1114_data_logger dmx_to_stepper BSM02 LPC1114_barometer_with_data_logging
AT24C1024.cpp
00001 /* 00002 * mbed library program 00003 * Control AT24C1024 EEPROM 00004 * 00005 * Copyright (c) 2014,'15,'17 Kenji Arai / JH1PJL 00006 * http://www.page.sannet.ne.jp/kenjia/index.html 00007 * http://mbed.org/users/kenjiArai/ 00008 * Created: June 17th, 2014 00009 * Revised: August 23rd, 2017 00010 */ 00011 00012 #include "mbed.h" 00013 #include "AT24C1024.h" 00014 00015 AT24C1024::AT24C1024 (PinName p_sda, PinName p_scl) 00016 : _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p) 00017 { 00018 AT24C1024_addr = AT24C1024ADDR; 00019 } 00020 00021 AT24C1024::AT24C1024 (I2C& p_i2c) 00022 : _i2c(p_i2c) 00023 { 00024 AT24C1024_addr = AT24C1024ADDR; 00025 } 00026 00027 uint8_t AT24C1024::read(uint32_t addr) 00028 { 00029 uint8_t eep_dt[2]; 00030 uint8_t tmp_addr; 00031 00032 tmp_addr = AT24C1024_addr; 00033 if ( addr & 0x10000 ) { // addr > 0xffff then P0 sets 1 00034 tmp_addr += 0x02; // P0=1 00035 } 00036 eep_dt[0] = ( uint8_t )( (addr & 0xff00) >> 8 ); 00037 eep_dt[1] = ( uint8_t )( (addr & 0xff) ); 00038 _i2c.write((uint8_t)tmp_addr, (char *)eep_dt, 2); 00039 _i2c.read((uint8_t)tmp_addr, (char *)eep_dt, 1); 00040 return eep_dt[0]; 00041 } 00042 00043 void AT24C1024::write(uint32_t addr, uint8_t dt) 00044 { 00045 uint8_t eep_dt[3]; 00046 uint8_t tmp_addr; 00047 00048 tmp_addr = AT24C1024_addr; 00049 if ( addr & 0x10000 ) { // addr > 0xffff then P0 sets 1 00050 tmp_addr += 0x02; // P0=1 00051 } 00052 eep_dt[0] = ( uint8_t )( (addr & 0xff00) >> 8 ); 00053 eep_dt[1] = ( uint8_t )( (addr & 0xff) ); 00054 eep_dt[2] = dt; 00055 _i2c.write((uint8_t)tmp_addr, (char *)eep_dt, 3); 00056 } 00057 00058 AT24C_STATUS AT24C1024::read_page(uint32_t addr_page_top, uint8_t *dt, int size) 00059 { 00060 uint8_t eep_dt[2]; 00061 uint8_t tmp_addr; 00062 00063 if (size >= 256 + 2) { 00064 if ((addr_page_top & 0xff) == 0) { 00065 tmp_addr = AT24C1024_addr; 00066 if ( addr_page_top & 0x10000 ) { // addr > 0xffff then P0 sets 1 00067 tmp_addr += 0x02; // P0=1 00068 } 00069 eep_dt[0] = ( uint8_t )( (addr_page_top & 0xff00) >> 8 ); 00070 eep_dt[1] = 0; 00071 _i2c.write((uint8_t)tmp_addr, (char *)eep_dt, 2); 00072 _i2c.read((uint8_t)tmp_addr, (char *)dt, 256); 00073 return AT24C_OK; 00074 } else { 00075 return AT24C_WRONG_TOP_ADDR; 00076 } 00077 } else { 00078 return AT24C_WRONG_BF_SIZE; 00079 } 00080 } 00081 00082 AT24C_STATUS AT24C1024::write_page(uint32_t addr_page_top, uint8_t *dt, int size) 00083 { 00084 uint8_t tmp_addr; 00085 int i; 00086 00087 if (size >= 256 + 2) { 00088 if ((addr_page_top & 0xff) == 0) { 00089 for (i = 255 + 2; i > 1; i--) { // shift data 00090 dt[i] = dt[i-2]; 00091 } 00092 tmp_addr = AT24C1024_addr; 00093 if ( addr_page_top & 0x10000 ) { // addr > 0xffff then P0 sets 1 00094 tmp_addr += 0x02; // P0=1 00095 } 00096 dt[0] = ( uint8_t )( (addr_page_top & 0xff00) >> 8 ); 00097 dt[1] = 0; 00098 _i2c.write((uint8_t)tmp_addr, (char *)dt, 256 + 2); 00099 return AT24C_OK; 00100 } else { 00101 return AT24C_WRONG_TOP_ADDR; 00102 } 00103 } else { 00104 return AT24C_WRONG_BF_SIZE; 00105 } 00106 } 00107 00108 void AT24C1024::frequency(int hz) 00109 { 00110 _i2c.frequency(hz); 00111 } 00112 00113
Generated on Fri Jul 15 2022 21:20:42 by 1.7.2