Olli Vanhoja / mFS
Committer:
HBP
Date:
Mon Feb 21 18:26:27 2011 +0000
Revision:
5:a0fe74dce80d
Parent:
0:cbf45dde2b49
Child:
7:5ac5121bb4e0
-File::read issues fixed
-rewind/forward functions improved
-Added possibility change I2C speed
-I2C autoreset on failure (P20 wired to SCL)

Now it\s actually realible and useful library :)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
HBP 5:a0fe74dce80d 1 /** @file i2c_eeprom.cpp */
HBP 5:a0fe74dce80d 2 /*CPP**************************************************************************
HBP 0:cbf45dde2b49 3 * FILENAME : i2c_eeprom.cpp *
HBP 0:cbf45dde2b49 4 * *
HBP 0:cbf45dde2b49 5 * DESCRIPTION : *
HBP 0:cbf45dde2b49 6 * Simple library for external I2C EEEPROM. *
HBP 0:cbf45dde2b49 7 * *
HBP 0:cbf45dde2b49 8 * AUTHOR : Olli Vanhoja START DATE : 2011-02-17 *
HBP 5:a0fe74dce80d 9 ******************************************************************************/
HBP 0:cbf45dde2b49 10
HBP 0:cbf45dde2b49 11 #include "mbed.h"
HBP 0:cbf45dde2b49 12 #include "i2c_eeprom.h"
HBP 0:cbf45dde2b49 13
HBP 0:cbf45dde2b49 14 I2C i2c(p28, p27);
HBP 0:cbf45dde2b49 15 DigitalOut BusyLed(LED1);
HBP 5:a0fe74dce80d 16 DigitalInOut scl_ext(p20); /** \attention Clock override pin connected to SCL */
HBP 0:cbf45dde2b49 17
HBP 5:a0fe74dce80d 18 i2c_eeprom::i2c_eeprom(int hwAddr, int speed)
HBP 0:cbf45dde2b49 19 {
HBP 0:cbf45dde2b49 20 i_i2c_address = hwAddr;
HBP 5:a0fe74dce80d 21
HBP 5:a0fe74dce80d 22 scl_ext.input(); // Make it input to start with...
HBP 5:a0fe74dce80d 23 scl_ext.mode(PullUp); // ...with pull up
HBP 5:a0fe74dce80d 24
HBP 5:a0fe74dce80d 25 i2c.frequency(speed);
HBP 0:cbf45dde2b49 26 }
HBP 0:cbf45dde2b49 27
HBP 0:cbf45dde2b49 28 void i2c_eeprom::write(char *data, uint16 iAddr, unsigned int n)
HBP 0:cbf45dde2b49 29 {
HBP 0:cbf45dde2b49 30 char *pi2c_data[3]; // Pointers for CW items
HBP 0:cbf45dde2b49 31 char i2c_data[3]; // Final CW
HBP 0:cbf45dde2b49 32
HBP 0:cbf45dde2b49 33 BusyLed = 1;
HBP 0:cbf45dde2b49 34
HBP 0:cbf45dde2b49 35 /* Convert address to hi and low byte array
HBP 0:cbf45dde2b49 36 * This is really pointless even though they are
HBP 0:cbf45dde2b49 37 * called pointers it would be lot easier to do this
HBP 0:cbf45dde2b49 38 * conversion without any pointers */
HBP 0:cbf45dde2b49 39 uint16 *piAddr = &iAddr;
HBP 0:cbf45dde2b49 40 pi2c_data[0] = (char *)piAddr+1;
HBP 0:cbf45dde2b49 41 pi2c_data[1] = (char *)piAddr;
HBP 0:cbf45dde2b49 42
HBP 0:cbf45dde2b49 43 for (uint16 i=0; i < n; i++)
HBP 0:cbf45dde2b49 44 {
HBP 0:cbf45dde2b49 45 pi2c_data[2] = &data[i];
HBP 0:cbf45dde2b49 46
HBP 0:cbf45dde2b49 47 // Apply actual values from pointer
HBP 0:cbf45dde2b49 48 //for (int n=0; n < 3; n++)
HBP 0:cbf45dde2b49 49 // i2c_data[n] = *pi2c_data[n];
HBP 0:cbf45dde2b49 50 i2c_data[0] = *pi2c_data[0];
HBP 0:cbf45dde2b49 51 i2c_data[1] = *pi2c_data[1];
HBP 0:cbf45dde2b49 52 i2c_data[2] = *pi2c_data[2];
HBP 0:cbf45dde2b49 53
HBP 0:cbf45dde2b49 54 // Send write command
HBP 0:cbf45dde2b49 55 if(i2c.write(i_i2c_address, i2c_data, 3))
HBP 0:cbf45dde2b49 56 error("Write failed!\n\r");
HBP 0:cbf45dde2b49 57
HBP 0:cbf45dde2b49 58 iAddr++; // increment address counter
HBP 0:cbf45dde2b49 59
HBP 0:cbf45dde2b49 60 // Wait for ACK
HBP 0:cbf45dde2b49 61 while(i2c.write(i_i2c_address, NULL, 0)){}
HBP 0:cbf45dde2b49 62 }
HBP 0:cbf45dde2b49 63
HBP 0:cbf45dde2b49 64 BusyLed = 0;
HBP 0:cbf45dde2b49 65 }
HBP 0:cbf45dde2b49 66
HBP 0:cbf45dde2b49 67 void i2c_eeprom::read(uint16 iAddr, uint16 n, char *out)
HBP 0:cbf45dde2b49 68 {
HBP 0:cbf45dde2b49 69 char *pi2c_data[2]; // Pointers for CW items
HBP 0:cbf45dde2b49 70 char i2c_data[2]; // Final CW
HBP 0:cbf45dde2b49 71
HBP 0:cbf45dde2b49 72 uint16 *piAddr = &iAddr;
HBP 0:cbf45dde2b49 73 pi2c_data[0] = (char *)piAddr+1;
HBP 0:cbf45dde2b49 74 pi2c_data[1] = (char *)piAddr;
HBP 0:cbf45dde2b49 75
HBP 0:cbf45dde2b49 76 BusyLed = 1;
HBP 0:cbf45dde2b49 77
HBP 0:cbf45dde2b49 78 // Apply actual values from pointer
HBP 0:cbf45dde2b49 79 //for (int i=0; i < 2; i++)
HBP 0:cbf45dde2b49 80 // i2c_data[i] = *pi2c_data[i];
HBP 0:cbf45dde2b49 81 i2c_data[0] = *pi2c_data[0];
HBP 0:cbf45dde2b49 82 i2c_data[1] = *pi2c_data[1];
HBP 0:cbf45dde2b49 83
HBP 0:cbf45dde2b49 84 // Send read command
HBP 5:a0fe74dce80d 85 srread:
HBP 0:cbf45dde2b49 86 if(i2c.write(i_i2c_address, i2c_data, 2))
HBP 5:a0fe74dce80d 87 {
HBP 5:a0fe74dce80d 88 i2c.start();
HBP 5:a0fe74dce80d 89 scl_ext = 0; // Setup override pin to pull clock low
HBP 5:a0fe74dce80d 90 scl_ext.input(); // Make it input to start with...
HBP 5:a0fe74dce80d 91 scl_ext.mode(PullUp); // ...with pull up
HBP 5:a0fe74dce80d 92 wait(0.00005); // Pause after stop
HBP 5:a0fe74dce80d 93 scl_ext.output(); // Override clock pin low
HBP 5:a0fe74dce80d 94 wait(0.00005); // Pause
HBP 5:a0fe74dce80d 95 scl_ext.input(); // Remove override...
HBP 5:a0fe74dce80d 96 scl_ext.mode(PullUp); // ...with pull up
HBP 5:a0fe74dce80d 97 wait(0.00005); // Pause again
HBP 5:a0fe74dce80d 98
HBP 5:a0fe74dce80d 99 i2c.start();
HBP 5:a0fe74dce80d 100 i2c.stop();
HBP 5:a0fe74dce80d 101 goto srread;
HBP 5:a0fe74dce80d 102 }
HBP 0:cbf45dde2b49 103
HBP 0:cbf45dde2b49 104 if(i2c.read(i_i2c_address, out, n))
HBP 5:a0fe74dce80d 105 error("Read failed!\n\r");
HBP 0:cbf45dde2b49 106
HBP 0:cbf45dde2b49 107 BusyLed = 0;
HBP 0:cbf45dde2b49 108 }