I2C Slave device. Mimics the 24LC256 in a very limited way (no addressing)
Fork of I2CSlave by
Diff: main.cpp
- 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