I2C Slave device. Mimics the 24LC256 in a very limited way (no addressing)

Dependencies:   mbed

Fork of I2CSlave by phil dani

Revision:
4:d1d5a02cc721
Parent:
3:1bb80997f316
--- a/main.cpp	Thu Aug 29 15:01:15 2013 +0000
+++ b/main.cpp	Wed Mar 25 19:53:10 2015 +0000
@@ -1,41 +1,33 @@
-/*Program Example 7.6: I2C Slave, when called transfers switch state to mbed acting as Master, and
-displays state of Master’ s switches on its leds.
-*/
+// 24LC256 I2C EEPROM mock device
+// Datasheet: http://ww1.microchip.com/downloads/en/DeviceDoc/20001203U.pdf
+
 #include <mbed.h>
-I2CSlave slave(p28, p27); //Configure I2C slave
-DigitalOut red_led(LED1); //red led
-DigitalOut green_led(LED2); //green led
-DigitalIn switch_ip1(p5);
-DigitalIn switch_ip2(p6);
-char switch_word ; //word we will send
-char recd_val; //value received from master
+
+#define BUFF_SIZE   10
+
+I2CSlave slave(p28, p27);
 
 int main() {
-    slave.address(0x52);
-        while (1) {
-            //set up switch_word from switches that are pressed
-            switch_word=0xa0; //set up a recognizable output pattern
-            if (switch_ip1==1)
-            switch_word=switch_word|0x01;
-            if (switch_ip2==1)
-            switch_word=switch_word|0x02;
-            slave.write(switch_word); //load up word to send
-            //test for I2C, and act accordingly
-            int i = slave.receive();
-            if (i == 3){ //slave is addressed, Master will write
-            recd_val= slave.read();
-            //now set leds according to received word
-            red_led=0; //preset both to 0
-            green_led=0;            
-            recd_val=recd_val&0x03; //AND out unwanted bits
-            if (recd_val==1)
-                red_led=1;
-            if (recd_val==2)
-                green_led=1;
-            if (recd_val==3){
-                red_led=1;
-                green_led=1;
-            }
-            }
+    char buf[BUFF_SIZE];               // Only up to 10 bytes (8 bytes max sequential write)
+    slave.frequency(400000);
+    slave.address(0xA0);
+    
+    printf("Starting on address 0xA0\r\n");
+    
+    while (1) {
+        int i = slave.receive();
+        switch (i) {
+            case I2CSlave::ReadAddressed:
+                slave.write(buf + 2, 8); // buf[0 - 1] are just the address bytes (ignoring them)
+            break;
+            
+            case I2CSlave::WriteGeneral:
+                slave.read(buf, BUFF_SIZE);
+            break;
+            
+            case I2CSlave::WriteAddressed:
+                slave.read(buf, BUFF_SIZE);
+            break;
         }
+    }
 }
\ No newline at end of file