RTC auf true

Committer:
kevman
Date:
Wed Mar 13 11:03:24 2019 +0000
Revision:
2:7aab896b1a3b
2019-03-13

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kevman 2:7aab896b1a3b 1 /*
kevman 2:7aab896b1a3b 2 * Copyright (c) 2016-2016 ARM Limited. All rights reserved.
kevman 2:7aab896b1a3b 3 * SPDX-License-Identifier: Apache-2.0
kevman 2:7aab896b1a3b 4 * Licensed under the Apache License, Version 2.0 (the License); you may
kevman 2:7aab896b1a3b 5 * not use this file except in compliance with the License.
kevman 2:7aab896b1a3b 6 * You may obtain a copy of the License at
kevman 2:7aab896b1a3b 7 *
kevman 2:7aab896b1a3b 8 * http://www.apache.org/licenses/LICENSE-2.0
kevman 2:7aab896b1a3b 9 *
kevman 2:7aab896b1a3b 10 * Unless required by applicable law or agreed to in writing, software
kevman 2:7aab896b1a3b 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
kevman 2:7aab896b1a3b 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kevman 2:7aab896b1a3b 13 * See the License for the specific language governing permissions and
kevman 2:7aab896b1a3b 14 * limitations under the License.
kevman 2:7aab896b1a3b 15 */
kevman 2:7aab896b1a3b 16 #include "at24mac.h"
kevman 2:7aab896b1a3b 17
kevman 2:7aab896b1a3b 18 #if DEVICE_I2C
kevman 2:7aab896b1a3b 19
kevman 2:7aab896b1a3b 20 /* Device addressing */
kevman 2:7aab896b1a3b 21 #define AT24MAC_EEPROM_ADDRESS (0x0A<<4)
kevman 2:7aab896b1a3b 22 #define AT24MAC_RW_PROTECT_ADDRESS (0x06<<4)
kevman 2:7aab896b1a3b 23 #define AT24MAC_SERIAL_ADDRESS (0x0B<<4)
kevman 2:7aab896b1a3b 24
kevman 2:7aab896b1a3b 25 /* Known memory blocks */
kevman 2:7aab896b1a3b 26 #define AT24MAC_SERIAL_OFFSET (0x80)
kevman 2:7aab896b1a3b 27 #define AT24MAC_EUI64_OFFSET (0x98)
kevman 2:7aab896b1a3b 28 #define AT24MAC_EUI48_OFFSET (0x9A)
kevman 2:7aab896b1a3b 29
kevman 2:7aab896b1a3b 30 #define SERIAL_LEN 16
kevman 2:7aab896b1a3b 31 #define EUI64_LEN 8
kevman 2:7aab896b1a3b 32 #define EUI48_LEN 6
kevman 2:7aab896b1a3b 33
kevman 2:7aab896b1a3b 34 AT24Mac::I2CReset::I2CReset(PinName sda, PinName scl)
kevman 2:7aab896b1a3b 35 {
kevman 2:7aab896b1a3b 36 mbed::DigitalInOut pin_sda(sda, PIN_OUTPUT, PullUp, 1);
kevman 2:7aab896b1a3b 37 mbed::DigitalInOut pin_scl(scl, PIN_OUTPUT, PullUp, 0);
kevman 2:7aab896b1a3b 38 //generate 9 clocks for worst-case scenario
kevman 2:7aab896b1a3b 39 for (int i = 0; i < 10; ++i) {
kevman 2:7aab896b1a3b 40 pin_scl = 1;
kevman 2:7aab896b1a3b 41 wait_us(5);
kevman 2:7aab896b1a3b 42 pin_scl = 0;
kevman 2:7aab896b1a3b 43 wait_us(5);
kevman 2:7aab896b1a3b 44 }
kevman 2:7aab896b1a3b 45 //generate a STOP condition
kevman 2:7aab896b1a3b 46 pin_sda = 0;
kevman 2:7aab896b1a3b 47 wait_us(5);
kevman 2:7aab896b1a3b 48 pin_scl = 1;
kevman 2:7aab896b1a3b 49 wait_us(5);
kevman 2:7aab896b1a3b 50 pin_sda = 1;
kevman 2:7aab896b1a3b 51 wait_us(5);
kevman 2:7aab896b1a3b 52 }
kevman 2:7aab896b1a3b 53
kevman 2:7aab896b1a3b 54 /*I2C needs to be reset before constructing the I2C object (in case I2C is stuck)
kevman 2:7aab896b1a3b 55 because they use the same pins, therefore i2c_reset has to be before _i2c
kevman 2:7aab896b1a3b 56 in the initializer list*/
kevman 2:7aab896b1a3b 57 AT24Mac::AT24Mac(PinName sda, PinName scl) : i2c_reset(sda, scl), _i2c(sda, scl)
kevman 2:7aab896b1a3b 58 {
kevman 2:7aab896b1a3b 59 // Do nothing
kevman 2:7aab896b1a3b 60 }
kevman 2:7aab896b1a3b 61
kevman 2:7aab896b1a3b 62 int AT24Mac::read_serial(void *buf)
kevman 2:7aab896b1a3b 63 {
kevman 2:7aab896b1a3b 64 char offset = AT24MAC_SERIAL_OFFSET;
kevman 2:7aab896b1a3b 65 if (_i2c.write(AT24MAC_SERIAL_ADDRESS, &offset, 1, true))
kevman 2:7aab896b1a3b 66 return -1; //No ACK
kevman 2:7aab896b1a3b 67 return _i2c.read(AT24MAC_SERIAL_ADDRESS, (char*)buf, SERIAL_LEN);
kevman 2:7aab896b1a3b 68 }
kevman 2:7aab896b1a3b 69
kevman 2:7aab896b1a3b 70 int AT24Mac::read_eui64(void *buf)
kevman 2:7aab896b1a3b 71 {
kevman 2:7aab896b1a3b 72 char offset = AT24MAC_EUI64_OFFSET;
kevman 2:7aab896b1a3b 73 if (_i2c.write(AT24MAC_SERIAL_ADDRESS, &offset, 1, true))
kevman 2:7aab896b1a3b 74 return -1; //No ACK
kevman 2:7aab896b1a3b 75 return _i2c.read(AT24MAC_SERIAL_ADDRESS, (char*)buf, EUI64_LEN);
kevman 2:7aab896b1a3b 76 }
kevman 2:7aab896b1a3b 77
kevman 2:7aab896b1a3b 78 int AT24Mac::read_eui48(void *buf)
kevman 2:7aab896b1a3b 79 {
kevman 2:7aab896b1a3b 80 char offset = AT24MAC_EUI48_OFFSET;
kevman 2:7aab896b1a3b 81 if (_i2c.write(AT24MAC_SERIAL_ADDRESS, &offset, 1, true))
kevman 2:7aab896b1a3b 82 return -1; //No ACK
kevman 2:7aab896b1a3b 83 return _i2c.read(AT24MAC_SERIAL_ADDRESS, (char*)buf, EUI48_LEN);
kevman 2:7aab896b1a3b 84 }
kevman 2:7aab896b1a3b 85
kevman 2:7aab896b1a3b 86 #endif /* DEVICE_I2C */