x

Dependents:   20180621_FT813

Committer:
JackB
Date:
Mon Jul 23 12:23:08 2018 +0000
Revision:
0:45d514e74be4
I2CEE

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JackB 0:45d514e74be4 1 /* Simple access class for I2C EEPROM chips like Microchip 24LC
JackB 0:45d514e74be4 2 * Copyright (c) 2015 Robin Hourahane
JackB 0:45d514e74be4 3 *
JackB 0:45d514e74be4 4 * Licensed under the Apache License, Version 2.0 (the "License");
JackB 0:45d514e74be4 5 * you may not use this file except in compliance with the License.
JackB 0:45d514e74be4 6 * You may obtain a copy of the License at
JackB 0:45d514e74be4 7 *
JackB 0:45d514e74be4 8 * http://www.apache.org/licenses/LICENSE-2.0
JackB 0:45d514e74be4 9 *
JackB 0:45d514e74be4 10 * Unless required by applicable law or agreed to in writing, software
JackB 0:45d514e74be4 11 * distributed under the License is distributed on an "AS IS" BASIS,
JackB 0:45d514e74be4 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
JackB 0:45d514e74be4 13 * See the License for the specific language governing permissions and
JackB 0:45d514e74be4 14 * limitations under the License.
JackB 0:45d514e74be4 15 */
JackB 0:45d514e74be4 16 #ifndef MBED_I2CEEPROM_BLOCK_DEVICE_H
JackB 0:45d514e74be4 17 #define MBED_I2CEEPROM_BLOCK_DEVICE_H
JackB 0:45d514e74be4 18
JackB 0:45d514e74be4 19 #include <mbed.h>
JackB 0:45d514e74be4 20 #include "BlockDevice.h"
JackB 0:45d514e74be4 21
JackB 0:45d514e74be4 22
JackB 0:45d514e74be4 23 /** BlockDevice for I2C based flash device such as
JackB 0:45d514e74be4 24 * Microchip's 24LC or ATMEL's AT24C ranges
JackB 0:45d514e74be4 25 *
JackB 0:45d514e74be4 26 * @code
JackB 0:45d514e74be4 27 * // Here's an example using a 24LC256 on a GR PEACH
JackB 0:45d514e74be4 28 * #include "mbed.h"
JackB 0:45d514e74be4 29 * #include "I2CEEBlockDevice.h"
JackB 0:45d514e74be4 30 *
JackB 0:45d514e74be4 31 * // Create EEPROM device on I2C bus with 32kbytes of memory
JackB 0:45d514e74be4 32 * I2CEEBlockDevice i2cee(D14, D15, 0xa0, 32*1024);
JackB 0:45d514e74be4 33 *
JackB 0:45d514e74be4 34 * int main() {
JackB 0:45d514e74be4 35 * printf("i2cee test\n");
JackB 0:45d514e74be4 36 *
JackB 0:45d514e74be4 37 * // Initialize the device and print the memory layout
JackB 0:45d514e74be4 38 * i2cee.init();
JackB 0:45d514e74be4 39 * printf("i2cee size: %llu\n", i2cee.size());
JackB 0:45d514e74be4 40 * printf("i2cee read size: %llu\n", i2cee.get_read_size());
JackB 0:45d514e74be4 41 * printf("i2cee program size: %llu\n", i2cee.get_program_size());
JackB 0:45d514e74be4 42 * printf("i2cee erase size: %llu\n", i2cee.get_erase_size());
JackB 0:45d514e74be4 43 *
JackB 0:45d514e74be4 44 * // Write "Hello World!" to the first block
JackB 0:45d514e74be4 45 * char *buffer = (char*)malloc(i2cee.get_erase_size());
JackB 0:45d514e74be4 46 * sprintf(buffer, "Hello World!\n");
JackB 0:45d514e74be4 47 * i2cee.erase(0, i2cee.get_erase_size());
JackB 0:45d514e74be4 48 * i2cee.program(buffer, 0, i2cee.get_erase_size());
JackB 0:45d514e74be4 49 *
JackB 0:45d514e74be4 50 * // Read back what was stored
JackB 0:45d514e74be4 51 * i2cee.read(buffer, 0, i2cee.get_erase_size());
JackB 0:45d514e74be4 52 * printf("%s", buffer);
JackB 0:45d514e74be4 53 *
JackB 0:45d514e74be4 54 * // Deinitialize the device
JackB 0:45d514e74be4 55 * i2cee.deinit();
JackB 0:45d514e74be4 56 * }
JackB 0:45d514e74be4 57 * @endcode
JackB 0:45d514e74be4 58 */
JackB 0:45d514e74be4 59 class I2CEEBlockDevice : public BlockDevice {
JackB 0:45d514e74be4 60 public:
JackB 0:45d514e74be4 61 /** Constructor to create an I2CEEBlockDevice on I2C pins
JackB 0:45d514e74be4 62 *
JackB 0:45d514e74be4 63 * @param sda The pin name for the sda line of the I2C bus.
JackB 0:45d514e74be4 64 * @param scl The pin name for the scl line of the I2C bus.
JackB 0:45d514e74be4 65 * @param addr The 8bit I2C address of the chip, common range 0xa0 - 0xae.
JackB 0:45d514e74be4 66 * @param size The size of the device in bytes
JackB 0:45d514e74be4 67 * @param block The page size of the device in bytes, defaults to 32bytes
JackB 0:45d514e74be4 68 * @param freq The frequency of the I2C bus, defaults to 400K.
JackB 0:45d514e74be4 69 */
JackB 0:45d514e74be4 70 I2CEEBlockDevice(
JackB 0:45d514e74be4 71 PinName sda, PinName scl, uint8_t address,
JackB 0:45d514e74be4 72 bd_size_t size, bd_size_t block=32,
JackB 0:45d514e74be4 73 int bus_speed=400000);
JackB 0:45d514e74be4 74
JackB 0:45d514e74be4 75 /** Initialize a block device
JackB 0:45d514e74be4 76 *
JackB 0:45d514e74be4 77 * @return 0 on success or a negative error code on failure
JackB 0:45d514e74be4 78 */
JackB 0:45d514e74be4 79 virtual int init();
JackB 0:45d514e74be4 80
JackB 0:45d514e74be4 81 /** Deinitialize a block device
JackB 0:45d514e74be4 82 *
JackB 0:45d514e74be4 83 * @return 0 on success or a negative error code on failure
JackB 0:45d514e74be4 84 */
JackB 0:45d514e74be4 85 virtual int deinit();
JackB 0:45d514e74be4 86
JackB 0:45d514e74be4 87 /** Read blocks from a block device
JackB 0:45d514e74be4 88 *
JackB 0:45d514e74be4 89 * @param buffer Buffer to write blocks to
JackB 0:45d514e74be4 90 * @param addr Address of block to begin reading from
JackB 0:45d514e74be4 91 * @param size Size to read in bytes, must be a multiple of read block size
JackB 0:45d514e74be4 92 * @return 0 on success, negative error code on failure
JackB 0:45d514e74be4 93 */
JackB 0:45d514e74be4 94 virtual int read(void *buffer, bd_addr_t addr, bd_size_t size);
JackB 0:45d514e74be4 95
JackB 0:45d514e74be4 96 /** Program blocks to a block device
JackB 0:45d514e74be4 97 *
JackB 0:45d514e74be4 98 * The blocks must have been erased prior to being programmed
JackB 0:45d514e74be4 99 *
JackB 0:45d514e74be4 100 * @param buffer Buffer of data to write to blocks
JackB 0:45d514e74be4 101 * @param addr Address of block to begin writing to
JackB 0:45d514e74be4 102 * @param size Size to write in bytes, must be a multiple of program block size
JackB 0:45d514e74be4 103 * @return 0 on success, negative error code on failure
JackB 0:45d514e74be4 104 */
JackB 0:45d514e74be4 105 virtual int program(const void *buffer, bd_addr_t addr, bd_size_t size);
JackB 0:45d514e74be4 106
JackB 0:45d514e74be4 107 /** Erase blocks on a block device
JackB 0:45d514e74be4 108 *
JackB 0:45d514e74be4 109 * The state of an erased block is undefined until it has been programmed
JackB 0:45d514e74be4 110 *
JackB 0:45d514e74be4 111 * @param addr Address of block to begin erasing
JackB 0:45d514e74be4 112 * @param size Size to erase in bytes, must be a multiple of erase block size
JackB 0:45d514e74be4 113 * @return 0 on success, negative error code on failure
JackB 0:45d514e74be4 114 */
JackB 0:45d514e74be4 115 virtual int erase(bd_addr_t addr, bd_size_t size);
JackB 0:45d514e74be4 116
JackB 0:45d514e74be4 117 /** Get the size of a readable block
JackB 0:45d514e74be4 118 *
JackB 0:45d514e74be4 119 * @return Size of a readable block in bytes
JackB 0:45d514e74be4 120 */
JackB 0:45d514e74be4 121 virtual bd_size_t get_read_size() const;
JackB 0:45d514e74be4 122
JackB 0:45d514e74be4 123 /** Get the size of a programable block
JackB 0:45d514e74be4 124 *
JackB 0:45d514e74be4 125 * @return Size of a programable block in bytes
JackB 0:45d514e74be4 126 * @note Must be a multiple of the read size
JackB 0:45d514e74be4 127 */
JackB 0:45d514e74be4 128 virtual bd_size_t get_program_size() const;
JackB 0:45d514e74be4 129
JackB 0:45d514e74be4 130 /** Get the size of a eraseable block
JackB 0:45d514e74be4 131 *
JackB 0:45d514e74be4 132 * @return Size of a eraseable block in bytes
JackB 0:45d514e74be4 133 * @note Must be a multiple of the program size
JackB 0:45d514e74be4 134 */
JackB 0:45d514e74be4 135 virtual bd_size_t get_erase_size() const;
JackB 0:45d514e74be4 136
JackB 0:45d514e74be4 137 /** Get the total size of the underlying device
JackB 0:45d514e74be4 138 *
JackB 0:45d514e74be4 139 * @return Size of the underlying device in bytes
JackB 0:45d514e74be4 140 */
JackB 0:45d514e74be4 141 virtual bd_size_t size() const;
JackB 0:45d514e74be4 142
JackB 0:45d514e74be4 143 private:
JackB 0:45d514e74be4 144 I2C _i2c;
JackB 0:45d514e74be4 145 uint8_t _i2c_addr;
JackB 0:45d514e74be4 146 uint32_t _size;
JackB 0:45d514e74be4 147 uint32_t _block;
JackB 0:45d514e74be4 148
JackB 0:45d514e74be4 149 int _sync();
JackB 0:45d514e74be4 150 };
JackB 0:45d514e74be4 151
JackB 0:45d514e74be4 152
JackB 0:45d514e74be4 153 #endif /* MBED_I2CEEPROM_BLOCK_DEVICE_H */