Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@5:b73ea174e997, 2014-10-14 (annotated)
- Committer:
- dwini
- Date:
- Tue Oct 14 14:54:32 2014 +0000
- Revision:
- 5:b73ea174e997
- Parent:
- 4:f537311ddc53
- Child:
- 6:ec3b01ce9687
Refactored to simpler message protocol
Who changed what in which revision?
| User | Revision | Line number | New 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(); |
| dwini | 5:b73ea174e997 | 44 | switch (rec) { |
| dwini | 4:f537311ddc53 | 45 | case I2CSlave::ReadAddressed: |
| dwini | 4:f537311ddc53 | 46 | { |
| dwini | 4:f537311ddc53 | 47 | int value = memory.get(pointer); |
| dwini | 4:f537311ddc53 | 48 | buffer[0] = pointer; |
| dwini | 4:f537311ddc53 | 49 | intToByte(buffer+1, value); |
| dwini | 5:b73ea174e997 | 50 | if (!slave.write(buffer, 5)) { |
| dwini | 4:f537311ddc53 | 51 | pc.printf("Retrieving and sending to master %d@%d\r\n", value, pointer); |
| dwini | 4:f537311ddc53 | 52 | } else { |
| dwini | 4:f537311ddc53 | 53 | pc.printf("Failed to send to master %d@%d\r\n", value, pointer); |
| dwini | 0:e24b497adfce | 54 | } |
| dwini | 4:f537311ddc53 | 55 | break; |
| dwini | 4:f537311ddc53 | 56 | } |
| dwini | 0:e24b497adfce | 57 | case I2CSlave::WriteAddressed: |
| dwini | 4:f537311ddc53 | 58 | { |
| dwini | 5:b73ea174e997 | 59 | // First we read the command byte |
| dwini | 5:b73ea174e997 | 60 | int command = slave.read(); |
| dwini | 5:b73ea174e997 | 61 | |
| dwini | 5:b73ea174e997 | 62 | // Check the command |
| dwini | 5:b73ea174e997 | 63 | switch (command) |
| dwini | 5:b73ea174e997 | 64 | { |
| dwini | 5:b73ea174e997 | 65 | case PUSH: |
| dwini | 5:b73ea174e997 | 66 | // Expect 5 more bytes [address] [int value] |
| dwini | 5:b73ea174e997 | 67 | if(!slave.read(buffer, 5)) { |
| dwini | 5:b73ea174e997 | 68 | int address = buffer[0]; |
| dwini | 4:f537311ddc53 | 69 | int value; |
| dwini | 5:b73ea174e997 | 70 | byteToInt(buffer+1, &value); |
| dwini | 4:f537311ddc53 | 71 | pc.printf("Storing %d@%d\r\n", value, address); |
| dwini | 4:f537311ddc53 | 72 | memory.set(address, value); |
| dwini | 5:b73ea174e997 | 73 | } else { |
| dwini | 5:b73ea174e997 | 74 | pc.printf("PUSH received with missing address/data\r\n"); |
| dwini | 4:f537311ddc53 | 75 | } |
| dwini | 5:b73ea174e997 | 76 | break; |
| dwini | 5:b73ea174e997 | 77 | |
| dwini | 5:b73ea174e997 | 78 | case PULL: |
| dwini | 5:b73ea174e997 | 79 | // Expect 1 more byte [address] |
| dwini | 5:b73ea174e997 | 80 | if(!slave.read(buffer, 1)) { |
| dwini | 5:b73ea174e997 | 81 | int address = buffer[0]; |
| dwini | 5:b73ea174e997 | 82 | pc.printf("Setting pointer to %d\r\n", address); |
| dwini | 5:b73ea174e997 | 83 | if (address < Memory::MEMORY_SIZE) { |
| dwini | 5:b73ea174e997 | 84 | pointer = address; |
| dwini | 2:49bb6ee1191c | 85 | } else { |
| dwini | 2:49bb6ee1191c | 86 | pc.printf("Address out of boundary\r\n"); |
| dwini | 2:49bb6ee1191c | 87 | } |
| dwini | 5:b73ea174e997 | 88 | } else { |
| dwini | 5:b73ea174e997 | 89 | pc.printf("PULL received with missing address\r\n"); |
| dwini | 4:f537311ddc53 | 90 | } |
| dwini | 5:b73ea174e997 | 91 | break; |
| dwini | 5:b73ea174e997 | 92 | |
| dwini | 5:b73ea174e997 | 93 | case CLEAR: |
| dwini | 5:b73ea174e997 | 94 | pc.printf("Clearing the memory\r\n"); |
| dwini | 5:b73ea174e997 | 95 | memory.reset(); |
| dwini | 5:b73ea174e997 | 96 | break; |
| dwini | 5:b73ea174e997 | 97 | |
| dwini | 5:b73ea174e997 | 98 | case PRINT: |
| dwini | 5:b73ea174e997 | 99 | memory.print(); |
| dwini | 5:b73ea174e997 | 100 | break; |
| dwini | 5:b73ea174e997 | 101 | |
| dwini | 5:b73ea174e997 | 102 | default: |
| dwini | 5:b73ea174e997 | 103 | pc.printf("Unknown command byte\r\n"); |
| dwini | 0:e24b497adfce | 104 | } |
| dwini | 4:f537311ddc53 | 105 | } |
| dwini | 0:e24b497adfce | 106 | } |
| dwini | 2:49bb6ee1191c | 107 | |
| dwini | 2:49bb6ee1191c | 108 | // Clear buffer |
| dwini | 2:49bb6ee1191c | 109 | for (int i = 0; i < I2C_BUFFER_SIZE; i++) { |
| dwini | 2:49bb6ee1191c | 110 | buffer[i] = 0; |
| dwini | 2:49bb6ee1191c | 111 | } |
| dwini | 0:e24b497adfce | 112 | |
| dwini | 1:e8ff4ff5a726 | 113 | // Alive LED |
| dwini | 1:e8ff4ff5a726 | 114 | cAlive = (cAlive + 1) % 100000; |
| dwini | 1:e8ff4ff5a726 | 115 | if (!cAlive) { |
| dwini | 1:e8ff4ff5a726 | 116 | aLED = !aLED; |
| dwini | 1:e8ff4ff5a726 | 117 | } |
| dwini | 0:e24b497adfce | 118 | } |
| dwini | 0:e24b497adfce | 119 | } |