mbed_slave_full

Dependencies:   mbed

Committer:
sillevl
Date:
Tue Oct 21 09:45:38 2014 +0000
Revision:
6:ec3b01ce9687
Parent:
5:b73ea174e997
added slave.stop()

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dwini 0:e24b497adfce 1 #include "mbed.h"
dwini 4:f537311ddc53 2 #include "memory.h"
dwini 0:e24b497adfce 3
dwini 1:e8ff4ff5a726 4 DigitalOut aLED(LED1);
dwini 0:e24b497adfce 5 Serial pc(USBTX, USBRX); // tx, rx
dwini 0:e24b497adfce 6 I2CSlave slave(p28, p27);
dwini 0:e24b497adfce 7
dwini 1:e8ff4ff5a726 8 const int SLAVE_ADDRESS = 0x84;
dwini 2:49bb6ee1191c 9 const int I2C_FREQUENCY = 100000;
dwini 5:b73ea174e997 10 const int I2C_BUFFER_SIZE = 6;
dwini 2:49bb6ee1191c 11
dwini 3:01b322df3731 12 enum COMMAND { PUSH, PULL, CLEAR, PRINT };
dwini 0:e24b497adfce 13
dwini 4:f537311ddc53 14 #define intToByte(pbytebuff,intval) (*((int*)(pbytebuff)) = intval)
dwini 4:f537311ddc53 15 #define byteToInt(pbytebuff,pintval) (*(pintval) = *((int*)(pbytebuff)))
dwini 0:e24b497adfce 16
dwini 0:e24b497adfce 17 int main() {
dwini 0:e24b497adfce 18 pc.baud(115200);
dwini 0:e24b497adfce 19 pc.printf("Size of integer is %d bytes\r\n", sizeof(int));
dwini 2:49bb6ee1191c 20
dwini 2:49bb6ee1191c 21 // Alive LED
dwini 2:49bb6ee1191c 22 int cAlive = 0;
dwini 2:49bb6ee1191c 23
dwini 2:49bb6ee1191c 24 // Configure I2C
dwini 2:49bb6ee1191c 25 slave.frequency(I2C_FREQUENCY);
dwini 2:49bb6ee1191c 26 pc.printf("Slave is working @ %dHz\r\n", I2C_FREQUENCY);
dwini 2:49bb6ee1191c 27 slave.address(SLAVE_ADDRESS);
dwini 2:49bb6ee1191c 28 pc.printf("Slave is working @ SLAVE_ADDRESS = 0x%x\r\n", SLAVE_ADDRESS);
dwini 0:e24b497adfce 29
dwini 4:f537311ddc53 30 // Setup memory
dwini 4:f537311ddc53 31 Memory memory;
dwini 4:f537311ddc53 32 pc.printf("Size of memory buffer is %d elements\r\n", Memory::MEMORY_SIZE);
dwini 4:f537311ddc53 33 memory.print();
dwini 4:f537311ddc53 34 pc.printf("Awaiting commands from master ...\r\n");
dwini 0:e24b497adfce 35
dwini 2:49bb6ee1191c 36 // I2C buffer
dwini 2:49bb6ee1191c 37 char buffer[I2C_BUFFER_SIZE];
dwini 0:e24b497adfce 38
dwini 4:f537311ddc53 39 // Internal address pointer
dwini 4:f537311ddc53 40 int pointer = 0;
dwini 4:f537311ddc53 41
dwini 0:e24b497adfce 42 while (1) {
dwini 5:b73ea174e997 43 int rec = slave.receive();
sillevl 6:ec3b01ce9687 44 switch (rec) {
dwini 4:f537311ddc53 45 case I2CSlave::ReadAddressed:
dwini 4:f537311ddc53 46 {
sillevl 6:ec3b01ce9687 47 pc.printf("ReadAddressed:\r\n");
dwini 4:f537311ddc53 48 int value = memory.get(pointer);
dwini 4:f537311ddc53 49 buffer[0] = pointer;
dwini 4:f537311ddc53 50 intToByte(buffer+1, value);
dwini 5:b73ea174e997 51 if (!slave.write(buffer, 5)) {
dwini 4:f537311ddc53 52 pc.printf("Retrieving and sending to master %d@%d\r\n", value, pointer);
dwini 4:f537311ddc53 53 } else {
dwini 4:f537311ddc53 54 pc.printf("Failed to send to master %d@%d\r\n", value, pointer);
dwini 0:e24b497adfce 55 }
dwini 4:f537311ddc53 56 break;
dwini 4:f537311ddc53 57 }
dwini 0:e24b497adfce 58 case I2CSlave::WriteAddressed:
dwini 4:f537311ddc53 59 {
sillevl 6:ec3b01ce9687 60 pc.printf("WriteAddressed:\r\n");
dwini 5:b73ea174e997 61 // First we read the command byte
dwini 5:b73ea174e997 62 int command = slave.read();
sillevl 6:ec3b01ce9687 63 pc.printf("Command: %d \r\n", command);
dwini 5:b73ea174e997 64 // Check the command
dwini 5:b73ea174e997 65 switch (command)
dwini 5:b73ea174e997 66 {
dwini 5:b73ea174e997 67 case PUSH:
dwini 5:b73ea174e997 68 // Expect 5 more bytes [address] [int value]
dwini 5:b73ea174e997 69 if(!slave.read(buffer, 5)) {
dwini 5:b73ea174e997 70 int address = buffer[0];
dwini 4:f537311ddc53 71 int value;
dwini 5:b73ea174e997 72 byteToInt(buffer+1, &value);
dwini 4:f537311ddc53 73 pc.printf("Storing %d@%d\r\n", value, address);
dwini 4:f537311ddc53 74 memory.set(address, value);
dwini 5:b73ea174e997 75 } else {
dwini 5:b73ea174e997 76 pc.printf("PUSH received with missing address/data\r\n");
dwini 4:f537311ddc53 77 }
dwini 5:b73ea174e997 78 break;
dwini 5:b73ea174e997 79
dwini 5:b73ea174e997 80 case PULL:
dwini 5:b73ea174e997 81 // Expect 1 more byte [address]
dwini 5:b73ea174e997 82 if(!slave.read(buffer, 1)) {
dwini 5:b73ea174e997 83 int address = buffer[0];
dwini 5:b73ea174e997 84 pc.printf("Setting pointer to %d\r\n", address);
dwini 5:b73ea174e997 85 if (address < Memory::MEMORY_SIZE) {
dwini 5:b73ea174e997 86 pointer = address;
dwini 2:49bb6ee1191c 87 } else {
dwini 2:49bb6ee1191c 88 pc.printf("Address out of boundary\r\n");
dwini 2:49bb6ee1191c 89 }
dwini 5:b73ea174e997 90 } else {
dwini 5:b73ea174e997 91 pc.printf("PULL received with missing address\r\n");
dwini 4:f537311ddc53 92 }
dwini 5:b73ea174e997 93 break;
dwini 5:b73ea174e997 94
dwini 5:b73ea174e997 95 case CLEAR:
dwini 5:b73ea174e997 96 pc.printf("Clearing the memory\r\n");
dwini 5:b73ea174e997 97 memory.reset();
sillevl 6:ec3b01ce9687 98 slave.stop();
dwini 5:b73ea174e997 99 break;
dwini 5:b73ea174e997 100
dwini 5:b73ea174e997 101 case PRINT:
dwini 5:b73ea174e997 102 memory.print();
sillevl 6:ec3b01ce9687 103 slave.stop();
dwini 5:b73ea174e997 104 break;
dwini 5:b73ea174e997 105
dwini 5:b73ea174e997 106 default:
dwini 5:b73ea174e997 107 pc.printf("Unknown command byte\r\n");
dwini 0:e24b497adfce 108 }
dwini 4:f537311ddc53 109 }
dwini 0:e24b497adfce 110 }
dwini 2:49bb6ee1191c 111
dwini 2:49bb6ee1191c 112 // Clear buffer
dwini 2:49bb6ee1191c 113 for (int i = 0; i < I2C_BUFFER_SIZE; i++) {
dwini 2:49bb6ee1191c 114 buffer[i] = 0;
dwini 2:49bb6ee1191c 115 }
dwini 0:e24b497adfce 116
dwini 1:e8ff4ff5a726 117 // Alive LED
dwini 1:e8ff4ff5a726 118 cAlive = (cAlive + 1) % 100000;
dwini 1:e8ff4ff5a726 119 if (!cAlive) {
dwini 1:e8ff4ff5a726 120 aLED = !aLED;
dwini 1:e8ff4ff5a726 121 }
dwini 0:e24b497adfce 122 }
dwini 0:e24b497adfce 123 }