Sille Van Landschoot / Mbed 2 deprecated mbed_slave_full

Dependencies:   mbed

Committer:
dwini
Date:
Mon Oct 13 14:50:01 2014 +0000
Revision:
3:01b322df3731
Parent:
2:49bb6ee1191c
Child:
4:f537311ddc53
Add memory print

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dwini 0:e24b497adfce 1 #include "mbed.h"
dwini 0:e24b497adfce 2
dwini 1:e8ff4ff5a726 3 DigitalOut aLED(LED1);
dwini 0:e24b497adfce 4 Serial pc(USBTX, USBRX); // tx, rx
dwini 0:e24b497adfce 5 I2CSlave slave(p28, p27);
dwini 0:e24b497adfce 6
dwini 1:e8ff4ff5a726 7 const int SLAVE_ADDRESS = 0x84;
dwini 0:e24b497adfce 8 const int MEMORY_SIZE = 16;
dwini 2:49bb6ee1191c 9 const int I2C_FREQUENCY = 100000;
dwini 2:49bb6ee1191c 10 const int I2C_BUFFER_SIZE = 10;
dwini 2:49bb6ee1191c 11
dwini 3:01b322df3731 12 enum COMMAND { PUSH, PULL, CLEAR, PRINT };
dwini 0:e24b497adfce 13
dwini 0:e24b497adfce 14 int memory[MEMORY_SIZE];
dwini 0:e24b497adfce 15
dwini 2:49bb6ee1191c 16 /*
dwini 2:49bb6ee1191c 17 * Set all memory locations to 0x55
dwini 2:49bb6ee1191c 18 */
dwini 0:e24b497adfce 19 void initializeMemory(void)
dwini 0:e24b497adfce 20 {
dwini 0:e24b497adfce 21 for (int i = 0; i < MEMORY_SIZE; i++) {
dwini 3:01b322df3731 22 memory[i] = -1;
dwini 3:01b322df3731 23 }
dwini 3:01b322df3731 24 }
dwini 3:01b322df3731 25
dwini 3:01b322df3731 26 /*
dwini 3:01b322df3731 27 * Print current memory content
dwini 3:01b322df3731 28 */
dwini 3:01b322df3731 29 void printMemory(void)
dwini 3:01b322df3731 30 {
dwini 3:01b322df3731 31 for (int i = 0; i < MEMORY_SIZE; i++) {
dwini 3:01b322df3731 32 pc.printf("%d@0x%x\r\n", memory[i], i);
dwini 0:e24b497adfce 33 }
dwini 0:e24b497adfce 34 }
dwini 0:e24b497adfce 35
dwini 0:e24b497adfce 36 int main() {
dwini 0:e24b497adfce 37 pc.baud(115200);
dwini 0:e24b497adfce 38 pc.printf("Size of integer is %d bytes\r\n", sizeof(int));
dwini 0:e24b497adfce 39 pc.printf("Size of memory buffer is %d elements\r\n", MEMORY_SIZE);
dwini 2:49bb6ee1191c 40
dwini 2:49bb6ee1191c 41 // Alive LED
dwini 2:49bb6ee1191c 42 int cAlive = 0;
dwini 2:49bb6ee1191c 43
dwini 2:49bb6ee1191c 44 // Configure I2C
dwini 2:49bb6ee1191c 45 slave.frequency(I2C_FREQUENCY);
dwini 2:49bb6ee1191c 46 pc.printf("Slave is working @ %dHz\r\n", I2C_FREQUENCY);
dwini 2:49bb6ee1191c 47 slave.address(SLAVE_ADDRESS);
dwini 2:49bb6ee1191c 48 pc.printf("Slave is working @ SLAVE_ADDRESS = 0x%x\r\n", SLAVE_ADDRESS);
dwini 0:e24b497adfce 49
dwini 0:e24b497adfce 50 // Make sure memory buffer is zeroed
dwini 0:e24b497adfce 51 initializeMemory();
dwini 3:01b322df3731 52 printMemory();
dwini 0:e24b497adfce 53
dwini 2:49bb6ee1191c 54 // I2C buffer
dwini 2:49bb6ee1191c 55 char buffer[I2C_BUFFER_SIZE];
dwini 0:e24b497adfce 56
dwini 0:e24b497adfce 57 while (1) {
dwini 0:e24b497adfce 58 int i = slave.receive();
dwini 0:e24b497adfce 59 switch (i) {
dwini 2:49bb6ee1191c 60 /*case I2CSlave::ReadAddressed:
dwini 0:e24b497adfce 61 pc.printf("Slave received command: %d [ReadAddressed]\r\n", i);
dwini 0:e24b497adfce 62
dwini 0:e24b497adfce 63 if (slave.write(msg, strlen(msg) + 1) == 0) {
dwini 0:e24b497adfce 64 printf("Sending %s to master\r\n", msg);
dwini 0:e24b497adfce 65 }
dwini 2:49bb6ee1191c 66 break;*/
dwini 0:e24b497adfce 67
dwini 0:e24b497adfce 68 case I2CSlave::WriteAddressed:
dwini 2:49bb6ee1191c 69
dwini 2:49bb6ee1191c 70 if (!slave.read(buffer, I2C_BUFFER_SIZE)) {
dwini 2:49bb6ee1191c 71 // Check command byte
dwini 2:49bb6ee1191c 72 switch (buffer[0]) {
dwini 2:49bb6ee1191c 73 case PUSH:
dwini 2:49bb6ee1191c 74 pc.printf("Storing %d@%d\r\n", *((int*)(&(buffer[2]))), buffer[1]);
dwini 2:49bb6ee1191c 75 if (buffer[1] < MEMORY_SIZE) {
dwini 2:49bb6ee1191c 76 memory[buffer[1]] = *((int*)(&(buffer[2])));
dwini 2:49bb6ee1191c 77 } else {
dwini 2:49bb6ee1191c 78 pc.printf("Address out of boundary\r\n");
dwini 2:49bb6ee1191c 79 }
dwini 2:49bb6ee1191c 80 break;
dwini 2:49bb6ee1191c 81
dwini 3:01b322df3731 82 case PRINT:
dwini 3:01b322df3731 83 printMemory();
dwini 3:01b322df3731 84 break;
dwini 3:01b322df3731 85
dwini 2:49bb6ee1191c 86 default:
dwini 2:49bb6ee1191c 87 pc.printf("Unknown command byte\r\n");
dwini 2:49bb6ee1191c 88 }
dwini 2:49bb6ee1191c 89 } else {
dwini 2:49bb6ee1191c 90 pc.printf("Received WriteAddressed] without data\r\n");
dwini 0:e24b497adfce 91 }
dwini 0:e24b497adfce 92 break;
dwini 0:e24b497adfce 93 }
dwini 2:49bb6ee1191c 94
dwini 2:49bb6ee1191c 95 // Clear buffer
dwini 2:49bb6ee1191c 96 for (int i = 0; i < I2C_BUFFER_SIZE; i++) {
dwini 2:49bb6ee1191c 97 buffer[i] = 0;
dwini 2:49bb6ee1191c 98 }
dwini 0:e24b497adfce 99
dwini 1:e8ff4ff5a726 100 // Alive LED
dwini 1:e8ff4ff5a726 101 cAlive = (cAlive + 1) % 100000;
dwini 1:e8ff4ff5a726 102 if (!cAlive) {
dwini 1:e8ff4ff5a726 103 aLED = !aLED;
dwini 1:e8ff4ff5a726 104 }
dwini 0:e24b497adfce 105 }
dwini 0:e24b497adfce 106 }