Lib. for Atmel 1Mbits Serial EEPROM, AT24C1024B

Dependents:   LPC1114_data_logger dmx_to_stepper BSM02 LPC1114_barometer_with_data_logging

Committer:
kenjiArai
Date:
Sun Feb 22 01:24:19 2015 +0000
Revision:
2:36339fd174d0
Parent:
1:05012e75c050
Child:
3:e2268ee1cb0a
added change function for I2C frequency

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:b9f5cf0309af 1 /*
kenjiArai 2:36339fd174d0 2 * mbed library program
kenjiArai 0:b9f5cf0309af 3 * Control AT24C1024 EEPROM
kenjiArai 0:b9f5cf0309af 4 *
kenjiArai 2:36339fd174d0 5 * Copyright (c) 2014,'15 Kenji Arai / JH1PJL
kenjiArai 0:b9f5cf0309af 6 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 0:b9f5cf0309af 7 * http://mbed.org/users/kenjiArai/
kenjiArai 0:b9f5cf0309af 8 * Created: June 17th, 2014
kenjiArai 2:36339fd174d0 9 * Revised: Feburary 21st, 2015
kenjiArai 0:b9f5cf0309af 10 *
kenjiArai 0:b9f5cf0309af 11 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
kenjiArai 0:b9f5cf0309af 12 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
kenjiArai 0:b9f5cf0309af 13 * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
kenjiArai 0:b9f5cf0309af 14 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kenjiArai 0:b9f5cf0309af 15 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
kenjiArai 0:b9f5cf0309af 16 */
kenjiArai 0:b9f5cf0309af 17
kenjiArai 0:b9f5cf0309af 18 #include "mbed.h"
kenjiArai 0:b9f5cf0309af 19 #include "AT24C1024.h"
kenjiArai 0:b9f5cf0309af 20
kenjiArai 2:36339fd174d0 21 AT24C1024::AT24C1024 (PinName p_sda, PinName p_scl) : _i2c(p_sda, p_scl)
kenjiArai 2:36339fd174d0 22 {
kenjiArai 0:b9f5cf0309af 23 AT24C1024_addr = AT24C1024ADDR;
kenjiArai 0:b9f5cf0309af 24 }
kenjiArai 0:b9f5cf0309af 25
kenjiArai 2:36339fd174d0 26 AT24C1024::AT24C1024 (I2C& p_i2c) : _i2c(p_i2c)
kenjiArai 2:36339fd174d0 27 {
kenjiArai 0:b9f5cf0309af 28 AT24C1024_addr = AT24C1024ADDR;
kenjiArai 0:b9f5cf0309af 29 }
kenjiArai 0:b9f5cf0309af 30
kenjiArai 2:36339fd174d0 31 uint8_t AT24C1024::read(int addr)
kenjiArai 2:36339fd174d0 32 {
kenjiArai 2:36339fd174d0 33 uint8_t eep_dt[2];
kenjiArai 2:36339fd174d0 34 uint8_t tmp_addr;
kenjiArai 0:b9f5cf0309af 35
kenjiArai 0:b9f5cf0309af 36 tmp_addr = AT24C1024_addr;
kenjiArai 2:36339fd174d0 37 if ( addr & 0x10000 ) { // addr > 0xffff then P0 sets 1
kenjiArai 0:b9f5cf0309af 38 tmp_addr += 0x02; // P0=1
kenjiArai 0:b9f5cf0309af 39 }
kenjiArai 0:b9f5cf0309af 40 eep_dt[0] = ( uint8_t )( (addr & 0xff00) >> 8 );
kenjiArai 0:b9f5cf0309af 41 eep_dt[1] = ( uint8_t )( (addr & 0xff) );
kenjiArai 2:36339fd174d0 42 _i2c.write((int)tmp_addr, (char *)eep_dt, 2);
kenjiArai 2:36339fd174d0 43 _i2c.read((int)tmp_addr, (char *)eep_dt, 1);
kenjiArai 0:b9f5cf0309af 44 return eep_dt[0];
kenjiArai 0:b9f5cf0309af 45 }
kenjiArai 0:b9f5cf0309af 46
kenjiArai 2:36339fd174d0 47 void AT24C1024::write(int addr, uint8_t dt)
kenjiArai 2:36339fd174d0 48 {
kenjiArai 2:36339fd174d0 49 uint8_t eep_dt[3];
kenjiArai 2:36339fd174d0 50 uint8_t tmp_addr;
kenjiArai 0:b9f5cf0309af 51
kenjiArai 0:b9f5cf0309af 52 tmp_addr = AT24C1024_addr;
kenjiArai 2:36339fd174d0 53 if ( addr & 0x10000 ) { // addr > 0xffff then P0 sets 1
kenjiArai 0:b9f5cf0309af 54 tmp_addr += 0x02; // P0=1
kenjiArai 0:b9f5cf0309af 55 }
kenjiArai 0:b9f5cf0309af 56 eep_dt[0] = ( uint8_t )( (addr & 0xff00) >> 8 );
kenjiArai 0:b9f5cf0309af 57 eep_dt[1] = ( uint8_t )( (addr & 0xff) );
kenjiArai 0:b9f5cf0309af 58 eep_dt[2] = dt;
kenjiArai 2:36339fd174d0 59 _i2c.write((int)tmp_addr, (char *)eep_dt, 3);
kenjiArai 0:b9f5cf0309af 60 }
kenjiArai 0:b9f5cf0309af 61
kenjiArai 2:36339fd174d0 62 AT24C_STATUS AT24C1024::read_page(uint32_t addr_page_top, uint8_t *dt, int size)
kenjiArai 2:36339fd174d0 63 {
kenjiArai 2:36339fd174d0 64 uint8_t eep_dt[2];
kenjiArai 2:36339fd174d0 65 uint8_t tmp_addr;
kenjiArai 0:b9f5cf0309af 66
kenjiArai 2:36339fd174d0 67 if (size >= 256 + 2) {
kenjiArai 2:36339fd174d0 68 if ((addr_page_top & 0xff) == 0) {
kenjiArai 0:b9f5cf0309af 69 tmp_addr = AT24C1024_addr;
kenjiArai 2:36339fd174d0 70 if ( addr_page_top & 0x10000 ) { // addr > 0xffff then P0 sets 1
kenjiArai 0:b9f5cf0309af 71 tmp_addr += 0x02; // P0=1
kenjiArai 0:b9f5cf0309af 72 }
kenjiArai 0:b9f5cf0309af 73 eep_dt[0] = ( uint8_t )( (addr_page_top & 0xff00) >> 8 );
kenjiArai 0:b9f5cf0309af 74 eep_dt[1] = 0;
kenjiArai 2:36339fd174d0 75 _i2c.write((int)tmp_addr, (char *)eep_dt, 2);
kenjiArai 2:36339fd174d0 76 _i2c.read((int)tmp_addr, (char *)dt, 256);
kenjiArai 0:b9f5cf0309af 77 return AT24C_OK;
kenjiArai 0:b9f5cf0309af 78 } else {
kenjiArai 0:b9f5cf0309af 79 return AT24C_WRONG_TOP_ADDR;
kenjiArai 0:b9f5cf0309af 80 }
kenjiArai 0:b9f5cf0309af 81 } else {
kenjiArai 0:b9f5cf0309af 82 return AT24C_WRONG_BF_SIZE;
kenjiArai 0:b9f5cf0309af 83 }
kenjiArai 0:b9f5cf0309af 84 }
kenjiArai 0:b9f5cf0309af 85
kenjiArai 2:36339fd174d0 86 AT24C_STATUS AT24C1024::write_page(uint32_t addr_page_top, uint8_t *dt, int size)
kenjiArai 2:36339fd174d0 87 {
kenjiArai 2:36339fd174d0 88 uint8_t tmp_addr;
kenjiArai 2:36339fd174d0 89 int i;
kenjiArai 0:b9f5cf0309af 90
kenjiArai 2:36339fd174d0 91 if (size >= 256 + 2) {
kenjiArai 2:36339fd174d0 92 if ((addr_page_top & 0xff) == 0) {
kenjiArai 2:36339fd174d0 93 for (i = 255 + 2; i > 1; i--) { // shift data
kenjiArai 0:b9f5cf0309af 94 dt[i] = dt[i-2];
kenjiArai 0:b9f5cf0309af 95 }
kenjiArai 0:b9f5cf0309af 96 tmp_addr = AT24C1024_addr;
kenjiArai 2:36339fd174d0 97 if ( addr_page_top & 0x10000 ) { // addr > 0xffff then P0 sets 1
kenjiArai 0:b9f5cf0309af 98 tmp_addr += 0x02; // P0=1
kenjiArai 0:b9f5cf0309af 99 }
kenjiArai 0:b9f5cf0309af 100 dt[0] = ( uint8_t )( (addr_page_top & 0xff00) >> 8 );
kenjiArai 0:b9f5cf0309af 101 dt[1] = 0;
kenjiArai 2:36339fd174d0 102 _i2c.write((int)tmp_addr, (char *)dt, 256 + 2);
kenjiArai 0:b9f5cf0309af 103 return AT24C_OK;
kenjiArai 0:b9f5cf0309af 104 } else {
kenjiArai 0:b9f5cf0309af 105 return AT24C_WRONG_TOP_ADDR;
kenjiArai 0:b9f5cf0309af 106 }
kenjiArai 0:b9f5cf0309af 107 } else {
kenjiArai 0:b9f5cf0309af 108 return AT24C_WRONG_BF_SIZE;
kenjiArai 0:b9f5cf0309af 109 }
kenjiArai 0:b9f5cf0309af 110 }
kenjiArai 0:b9f5cf0309af 111
kenjiArai 2:36339fd174d0 112 void AT24C1024::frequency(int hz)
kenjiArai 2:36339fd174d0 113 {
kenjiArai 2:36339fd174d0 114 _i2c.frequency(hz);
kenjiArai 0:b9f5cf0309af 115 }