Olli Vanhoja / mFS
Committer:
HBP
Date:
Mon Feb 21 07:35:16 2011 +0000
Revision:
0:cbf45dde2b49
Child:
5:a0fe74dce80d
Initial release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
HBP 0:cbf45dde2b49 1 /*H****************************************************************************
HBP 0:cbf45dde2b49 2 * FILENAME : i2c_eeprom.cpp *
HBP 0:cbf45dde2b49 3 * *
HBP 0:cbf45dde2b49 4 * DESCRIPTION : *
HBP 0:cbf45dde2b49 5 * Simple library for external I2C EEEPROM. *
HBP 0:cbf45dde2b49 6 * *
HBP 0:cbf45dde2b49 7 * AUTHOR : Olli Vanhoja START DATE : 2011-02-17 *
HBP 0:cbf45dde2b49 8 *******************************************************************************
HBP 0:cbf45dde2b49 9 *
HBP 0:cbf45dde2b49 10 * CHANGES :
HBP 0:cbf45dde2b49 11 *
HBP 0:cbf45dde2b49 12 * VERSION DATE WHO DETAIL
HBP 0:cbf45dde2b49 13 * 0.1 2011-02-21 Olli Vanhoja Initial release version
HBP 0:cbf45dde2b49 14 *
HBP 0:cbf45dde2b49 15 *H*/
HBP 0:cbf45dde2b49 16
HBP 0:cbf45dde2b49 17 #include "mbed.h"
HBP 0:cbf45dde2b49 18 #include "i2c_eeprom.h"
HBP 0:cbf45dde2b49 19
HBP 0:cbf45dde2b49 20 I2C i2c(p28, p27);
HBP 0:cbf45dde2b49 21 DigitalOut BusyLed(LED1);
HBP 0:cbf45dde2b49 22
HBP 0:cbf45dde2b49 23 i2c_eeprom::i2c_eeprom()
HBP 0:cbf45dde2b49 24 {
HBP 0:cbf45dde2b49 25 }
HBP 0:cbf45dde2b49 26
HBP 0:cbf45dde2b49 27 i2c_eeprom::i2c_eeprom(int hwAddr)
HBP 0:cbf45dde2b49 28 {
HBP 0:cbf45dde2b49 29 i_i2c_address = hwAddr;
HBP 0:cbf45dde2b49 30 }
HBP 0:cbf45dde2b49 31
HBP 0:cbf45dde2b49 32 void i2c_eeprom::write(char *data, uint16 iAddr, unsigned int n)
HBP 0:cbf45dde2b49 33 {
HBP 0:cbf45dde2b49 34 char *pi2c_data[3]; // Pointers for CW items
HBP 0:cbf45dde2b49 35 char i2c_data[3]; // Final CW
HBP 0:cbf45dde2b49 36
HBP 0:cbf45dde2b49 37 BusyLed = 1;
HBP 0:cbf45dde2b49 38
HBP 0:cbf45dde2b49 39 /* Convert address to hi and low byte array
HBP 0:cbf45dde2b49 40 * This is really pointless even though they are
HBP 0:cbf45dde2b49 41 * called pointers it would be lot easier to do this
HBP 0:cbf45dde2b49 42 * conversion without any pointers */
HBP 0:cbf45dde2b49 43 uint16 *piAddr = &iAddr;
HBP 0:cbf45dde2b49 44 pi2c_data[0] = (char *)piAddr+1;
HBP 0:cbf45dde2b49 45 pi2c_data[1] = (char *)piAddr;
HBP 0:cbf45dde2b49 46
HBP 0:cbf45dde2b49 47 for (uint16 i=0; i < n; i++)
HBP 0:cbf45dde2b49 48 {
HBP 0:cbf45dde2b49 49 pi2c_data[2] = &data[i];
HBP 0:cbf45dde2b49 50
HBP 0:cbf45dde2b49 51 // Apply actual values from pointer
HBP 0:cbf45dde2b49 52 //for (int n=0; n < 3; n++)
HBP 0:cbf45dde2b49 53 // i2c_data[n] = *pi2c_data[n];
HBP 0:cbf45dde2b49 54 i2c_data[0] = *pi2c_data[0];
HBP 0:cbf45dde2b49 55 i2c_data[1] = *pi2c_data[1];
HBP 0:cbf45dde2b49 56 i2c_data[2] = *pi2c_data[2];
HBP 0:cbf45dde2b49 57
HBP 0:cbf45dde2b49 58 // Send write command
HBP 0:cbf45dde2b49 59 if(i2c.write(i_i2c_address, i2c_data, 3))
HBP 0:cbf45dde2b49 60 error("Write failed!\n\r");
HBP 0:cbf45dde2b49 61
HBP 0:cbf45dde2b49 62 iAddr++; // increment address counter
HBP 0:cbf45dde2b49 63
HBP 0:cbf45dde2b49 64 // Wait for ACK
HBP 0:cbf45dde2b49 65 while(i2c.write(i_i2c_address, NULL, 0)){}
HBP 0:cbf45dde2b49 66 }
HBP 0:cbf45dde2b49 67
HBP 0:cbf45dde2b49 68 BusyLed = 0;
HBP 0:cbf45dde2b49 69 }
HBP 0:cbf45dde2b49 70
HBP 0:cbf45dde2b49 71 void i2c_eeprom::read(uint16 iAddr, uint16 n, char *out)
HBP 0:cbf45dde2b49 72 {
HBP 0:cbf45dde2b49 73 char *pi2c_data[2]; // Pointers for CW items
HBP 0:cbf45dde2b49 74 char i2c_data[2]; // Final CW
HBP 0:cbf45dde2b49 75
HBP 0:cbf45dde2b49 76 uint16 *piAddr = &iAddr;
HBP 0:cbf45dde2b49 77 pi2c_data[0] = (char *)piAddr+1;
HBP 0:cbf45dde2b49 78 pi2c_data[1] = (char *)piAddr;
HBP 0:cbf45dde2b49 79
HBP 0:cbf45dde2b49 80 BusyLed = 1;
HBP 0:cbf45dde2b49 81
HBP 0:cbf45dde2b49 82 // Apply actual values from pointer
HBP 0:cbf45dde2b49 83 //for (int i=0; i < 2; i++)
HBP 0:cbf45dde2b49 84 // i2c_data[i] = *pi2c_data[i];
HBP 0:cbf45dde2b49 85 i2c_data[0] = *pi2c_data[0];
HBP 0:cbf45dde2b49 86 i2c_data[1] = *pi2c_data[1];
HBP 0:cbf45dde2b49 87
HBP 0:cbf45dde2b49 88 // Send read command
HBP 0:cbf45dde2b49 89 if(i2c.write(i_i2c_address, i2c_data, 2))
HBP 0:cbf45dde2b49 90 error("Read failed! ref:1\n\r");
HBP 0:cbf45dde2b49 91
HBP 0:cbf45dde2b49 92 if(i2c.read(i_i2c_address, out, n))
HBP 0:cbf45dde2b49 93 error("Read failed! ref:2\n\r");
HBP 0:cbf45dde2b49 94
HBP 0:cbf45dde2b49 95 BusyLed = 0;
HBP 0:cbf45dde2b49 96 }