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.
Dependencies: FXOS8700CQ HIH6130 IS31SE5000 MAG3110 MAX44000 MAX44005 MAX44008 MMA8451Q MMA8452Q MPL3115A2 VEML6040 VEML6075 mbed vt100 LM75B FXAS21002 MAX30101 VCNL4020 VCNL4100
main.cpp@0:d4bbd473a83c, 2016-04-26 (annotated)
- Committer:
- Rhyme
- Date:
- Tue Apr 26 02:38:14 2016 +0000
- Revision:
- 0:d4bbd473a83c
Implementing sensor tests, up to FXOS8700CQ added.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Rhyme | 0:d4bbd473a83c | 1 | #include "mbed.h" |
Rhyme | 0:d4bbd473a83c | 2 | #include <string.h> |
Rhyme | 0:d4bbd473a83c | 3 | #include <ctype.h> |
Rhyme | 0:d4bbd473a83c | 4 | #include "vt100.h" |
Rhyme | 0:d4bbd473a83c | 5 | #include "MSS.h" |
Rhyme | 0:d4bbd473a83c | 6 | #include "MSU.h" |
Rhyme | 0:d4bbd473a83c | 7 | #include "dumb_i2c.h" |
Rhyme | 0:d4bbd473a83c | 8 | #define TEST_LOOP 10 |
Rhyme | 0:d4bbd473a83c | 9 | |
Rhyme | 0:d4bbd473a83c | 10 | DUMB_I2C *i2c = 0 ; |
Rhyme | 0:d4bbd473a83c | 11 | vt100 *tty = 0 ; |
Rhyme | 0:d4bbd473a83c | 12 | int test_loop = TEST_LOOP ; |
Rhyme | 0:d4bbd473a83c | 13 | |
Rhyme | 0:d4bbd473a83c | 14 | void doClose(void) |
Rhyme | 0:d4bbd473a83c | 15 | { |
Rhyme | 0:d4bbd473a83c | 16 | if (i2c != 0) { |
Rhyme | 0:d4bbd473a83c | 17 | printf("Closing I2C at 0x%02X ... ", i2c->address()) ; |
Rhyme | 0:d4bbd473a83c | 18 | delete i2c ; |
Rhyme | 0:d4bbd473a83c | 19 | i2c = 0 ; |
Rhyme | 0:d4bbd473a83c | 20 | printf("Done\n") ; |
Rhyme | 0:d4bbd473a83c | 21 | } |
Rhyme | 0:d4bbd473a83c | 22 | } |
Rhyme | 0:d4bbd473a83c | 23 | |
Rhyme | 0:d4bbd473a83c | 24 | void doOpen(void) |
Rhyme | 0:d4bbd473a83c | 25 | { |
Rhyme | 0:d4bbd473a83c | 26 | uint8_t address ; |
Rhyme | 0:d4bbd473a83c | 27 | scanf("%X", &address) ; |
Rhyme | 0:d4bbd473a83c | 28 | if (i2c != 0) { |
Rhyme | 0:d4bbd473a83c | 29 | doClose() ; |
Rhyme | 0:d4bbd473a83c | 30 | } |
Rhyme | 0:d4bbd473a83c | 31 | printf("Opening I2C at 0x%02X ... ", address) ; |
Rhyme | 0:d4bbd473a83c | 32 | i2c = new DUMB_I2C(PIN_SDA, PIN_SCL, address) ; |
Rhyme | 0:d4bbd473a83c | 33 | printf("Done\n") ; |
Rhyme | 0:d4bbd473a83c | 34 | } |
Rhyme | 0:d4bbd473a83c | 35 | |
Rhyme | 0:d4bbd473a83c | 36 | void doRead(void) |
Rhyme | 0:d4bbd473a83c | 37 | { |
Rhyme | 0:d4bbd473a83c | 38 | int addr ; |
Rhyme | 0:d4bbd473a83c | 39 | int len ; |
Rhyme | 0:d4bbd473a83c | 40 | uint8_t *data ; |
Rhyme | 0:d4bbd473a83c | 41 | int result ; |
Rhyme | 0:d4bbd473a83c | 42 | if (i2c == 0) { |
Rhyme | 0:d4bbd473a83c | 43 | printf("I2C is not opened\n") ; |
Rhyme | 0:d4bbd473a83c | 44 | return ; |
Rhyme | 0:d4bbd473a83c | 45 | } |
Rhyme | 0:d4bbd473a83c | 46 | scanf("%X %X", &addr, &len) ; |
Rhyme | 0:d4bbd473a83c | 47 | if (len > 0) { |
Rhyme | 0:d4bbd473a83c | 48 | data = new uint8_t[len] ; |
Rhyme | 0:d4bbd473a83c | 49 | } |
Rhyme | 0:d4bbd473a83c | 50 | // i2c->read(addr, data, len) ; |
Rhyme | 0:d4bbd473a83c | 51 | printf("0x%02X : ", (unsigned int)addr) ; |
Rhyme | 0:d4bbd473a83c | 52 | for (int i = 0 ; i < len ; i++ ) { |
Rhyme | 0:d4bbd473a83c | 53 | result = i2c->read(addr+i, &data[i], 1) ; |
Rhyme | 0:d4bbd473a83c | 54 | if (result == 0) { |
Rhyme | 0:d4bbd473a83c | 55 | printf("%02X ", data[i]) ; |
Rhyme | 0:d4bbd473a83c | 56 | if (((i+1) < len)&&(((i+1)%0x10) == 0)) { |
Rhyme | 0:d4bbd473a83c | 57 | printf("\n") ; |
Rhyme | 0:d4bbd473a83c | 58 | printf("0x%02X : ", (unsigned int)(addr + i + 1)) ; |
Rhyme | 0:d4bbd473a83c | 59 | } |
Rhyme | 0:d4bbd473a83c | 60 | } else { |
Rhyme | 0:d4bbd473a83c | 61 | printf("failed to read 0x%02X\n", addr+i) ; |
Rhyme | 0:d4bbd473a83c | 62 | } |
Rhyme | 0:d4bbd473a83c | 63 | } |
Rhyme | 0:d4bbd473a83c | 64 | printf("\n") ; |
Rhyme | 0:d4bbd473a83c | 65 | } |
Rhyme | 0:d4bbd473a83c | 66 | |
Rhyme | 0:d4bbd473a83c | 67 | void doWrite(void) |
Rhyme | 0:d4bbd473a83c | 68 | { |
Rhyme | 0:d4bbd473a83c | 69 | int addr ; |
Rhyme | 0:d4bbd473a83c | 70 | uint8_t len ; |
Rhyme | 0:d4bbd473a83c | 71 | uint8_t data ; |
Rhyme | 0:d4bbd473a83c | 72 | int ack ; |
Rhyme | 0:d4bbd473a83c | 73 | if (i2c == 0) { |
Rhyme | 0:d4bbd473a83c | 74 | printf("I2C is not opened\n") ; |
Rhyme | 0:d4bbd473a83c | 75 | return ; |
Rhyme | 0:d4bbd473a83c | 76 | } |
Rhyme | 0:d4bbd473a83c | 77 | scanf("%X %X", &addr, &data) ; |
Rhyme | 0:d4bbd473a83c | 78 | ack = i2c->write(addr, &data, 1) ; |
Rhyme | 0:d4bbd473a83c | 79 | if (ack != 0) { |
Rhyme | 0:d4bbd473a83c | 80 | printf("NAK at writing data[0x%02X] to address[0x%02X]\n", |
Rhyme | 0:d4bbd473a83c | 81 | data, addr ) ; |
Rhyme | 0:d4bbd473a83c | 82 | } |
Rhyme | 0:d4bbd473a83c | 83 | } |
Rhyme | 0:d4bbd473a83c | 84 | |
Rhyme | 0:d4bbd473a83c | 85 | void doStatus(void) |
Rhyme | 0:d4bbd473a83c | 86 | { |
Rhyme | 0:d4bbd473a83c | 87 | if (i2c == 0) { |
Rhyme | 0:d4bbd473a83c | 88 | printf("i2c is not opened\n") ; |
Rhyme | 0:d4bbd473a83c | 89 | } else { |
Rhyme | 0:d4bbd473a83c | 90 | printf("i2c device at 0x%02X is opened at %d Hz\n", |
Rhyme | 0:d4bbd473a83c | 91 | i2c->address(), i2c->frequency()) ; |
Rhyme | 0:d4bbd473a83c | 92 | } |
Rhyme | 0:d4bbd473a83c | 93 | } |
Rhyme | 0:d4bbd473a83c | 94 | |
Rhyme | 0:d4bbd473a83c | 95 | void doHelp(void) |
Rhyme | 0:d4bbd473a83c | 96 | { |
Rhyme | 0:d4bbd473a83c | 97 | printf("Simple I2C test program %s for %s\n", __DATE__, BOARD_NAME) ; |
Rhyme | 0:d4bbd473a83c | 98 | printf("\n === usage ===\n") ; |
Rhyme | 0:d4bbd473a83c | 99 | printf("open <7bit addr> : open i2c device at <7bit addr>\n") ; |
Rhyme | 0:d4bbd473a83c | 100 | printf("close : close currently opened i2c\n") ; |
Rhyme | 0:d4bbd473a83c | 101 | printf("read <addr> <len> : read <len> data from <addr>\n") ; |
Rhyme | 0:d4bbd473a83c | 102 | printf("write <addr> <data> : write <data> to register <addr>\n") ; |
Rhyme | 0:d4bbd473a83c | 103 | printf("frequency <freq> : change frequency to <freq> Hz\n") ; |
Rhyme | 0:d4bbd473a83c | 104 | printf("bus : bus scan for existing I2C addresses\n") ; |
Rhyme | 0:d4bbd473a83c | 105 | printf("test <sensor> : test a sensor\n") ; |
Rhyme | 0:d4bbd473a83c | 106 | printf("loop <number> : specify loop count for test\n") ; |
Rhyme | 0:d4bbd473a83c | 107 | printf("status : print current status\n") ; |
Rhyme | 0:d4bbd473a83c | 108 | printf("help : print this help\n") ; |
Rhyme | 0:d4bbd473a83c | 109 | printf("\nPlease set local-echo to see what you are typing.\n") ; |
Rhyme | 0:d4bbd473a83c | 110 | printf("\n") ; |
Rhyme | 0:d4bbd473a83c | 111 | } |
Rhyme | 0:d4bbd473a83c | 112 | |
Rhyme | 0:d4bbd473a83c | 113 | void doFreq(void) |
Rhyme | 0:d4bbd473a83c | 114 | { |
Rhyme | 0:d4bbd473a83c | 115 | int freq = 0 ; |
Rhyme | 0:d4bbd473a83c | 116 | scanf("%d", &freq) ; |
Rhyme | 0:d4bbd473a83c | 117 | if (i2c != 0) { |
Rhyme | 0:d4bbd473a83c | 118 | i2c->frequency(freq) ; |
Rhyme | 0:d4bbd473a83c | 119 | } |
Rhyme | 0:d4bbd473a83c | 120 | } |
Rhyme | 0:d4bbd473a83c | 121 | |
Rhyme | 0:d4bbd473a83c | 122 | |
Rhyme | 0:d4bbd473a83c | 123 | void print_sensor_name(int address) |
Rhyme | 0:d4bbd473a83c | 124 | { |
Rhyme | 0:d4bbd473a83c | 125 | int i ; |
Rhyme | 0:d4bbd473a83c | 126 | for(i = 0; i2c_sensor[i].address != 0 ; i++) { |
Rhyme | 0:d4bbd473a83c | 127 | if (i2c_sensor[i].address == address) { |
Rhyme | 0:d4bbd473a83c | 128 | printf("%s ", i2c_sensor[i].name) ; |
Rhyme | 0:d4bbd473a83c | 129 | } |
Rhyme | 0:d4bbd473a83c | 130 | } |
Rhyme | 0:d4bbd473a83c | 131 | } |
Rhyme | 0:d4bbd473a83c | 132 | |
Rhyme | 0:d4bbd473a83c | 133 | void doBusScan(void) |
Rhyme | 0:d4bbd473a83c | 134 | { |
Rhyme | 0:d4bbd473a83c | 135 | int address ; |
Rhyme | 0:d4bbd473a83c | 136 | uint8_t data ; |
Rhyme | 0:d4bbd473a83c | 137 | int result ; |
Rhyme | 0:d4bbd473a83c | 138 | if (i2c != 0) { |
Rhyme | 0:d4bbd473a83c | 139 | printf("Closing I2C at 0x%02X ... ", i2c->address()) ; |
Rhyme | 0:d4bbd473a83c | 140 | delete i2c ; |
Rhyme | 0:d4bbd473a83c | 141 | i2c = 0 ; |
Rhyme | 0:d4bbd473a83c | 142 | printf("Done\n") ; |
Rhyme | 0:d4bbd473a83c | 143 | } |
Rhyme | 0:d4bbd473a83c | 144 | |
Rhyme | 0:d4bbd473a83c | 145 | for (address = 1; address < 127 ; address++) { |
Rhyme | 0:d4bbd473a83c | 146 | i2c = new DUMB_I2C(PIN_SDA, PIN_SCL, address) ; |
Rhyme | 0:d4bbd473a83c | 147 | result = i2c->read(address, &data, 1) ; |
Rhyme | 0:d4bbd473a83c | 148 | if (result == 0) { |
Rhyme | 0:d4bbd473a83c | 149 | printf("%02X : ", address) ; |
Rhyme | 0:d4bbd473a83c | 150 | print_sensor_name(address) ; |
Rhyme | 0:d4bbd473a83c | 151 | printf("\n") ; |
Rhyme | 0:d4bbd473a83c | 152 | } |
Rhyme | 0:d4bbd473a83c | 153 | delete i2c ; |
Rhyme | 0:d4bbd473a83c | 154 | i2c = 0 ; |
Rhyme | 0:d4bbd473a83c | 155 | } |
Rhyme | 0:d4bbd473a83c | 156 | printf("\n") ; |
Rhyme | 0:d4bbd473a83c | 157 | } |
Rhyme | 0:d4bbd473a83c | 158 | |
Rhyme | 0:d4bbd473a83c | 159 | void setTestLoop(void) |
Rhyme | 0:d4bbd473a83c | 160 | { |
Rhyme | 0:d4bbd473a83c | 161 | int num ; |
Rhyme | 0:d4bbd473a83c | 162 | scanf("%d", &num) ; |
Rhyme | 0:d4bbd473a83c | 163 | if (num < 0) { num = 1 ; } |
Rhyme | 0:d4bbd473a83c | 164 | test_loop = num ; |
Rhyme | 0:d4bbd473a83c | 165 | printf("test loop count set to %d\n", test_loop) ; |
Rhyme | 0:d4bbd473a83c | 166 | } |
Rhyme | 0:d4bbd473a83c | 167 | |
Rhyme | 0:d4bbd473a83c | 168 | void doTestSensor(void) |
Rhyme | 0:d4bbd473a83c | 169 | { |
Rhyme | 0:d4bbd473a83c | 170 | int i ; |
Rhyme | 0:d4bbd473a83c | 171 | char name[32] ; |
Rhyme | 0:d4bbd473a83c | 172 | scanf("%s", name) ; |
Rhyme | 0:d4bbd473a83c | 173 | for (i = 0 ; i2c_sensor[i].address != 0 ; i++) { |
Rhyme | 0:d4bbd473a83c | 174 | if (strcmp(name, i2c_sensor[i].name) == 0) { /* found */ |
Rhyme | 0:d4bbd473a83c | 175 | i2c_sensor[i].test_func() ; |
Rhyme | 0:d4bbd473a83c | 176 | break ; |
Rhyme | 0:d4bbd473a83c | 177 | } |
Rhyme | 0:d4bbd473a83c | 178 | } |
Rhyme | 0:d4bbd473a83c | 179 | } |
Rhyme | 0:d4bbd473a83c | 180 | |
Rhyme | 0:d4bbd473a83c | 181 | void doCommand(char *str) |
Rhyme | 0:d4bbd473a83c | 182 | { |
Rhyme | 0:d4bbd473a83c | 183 | switch(*str) { |
Rhyme | 0:d4bbd473a83c | 184 | case 'o': case 'O': /* open */ |
Rhyme | 0:d4bbd473a83c | 185 | doOpen() ; break ; |
Rhyme | 0:d4bbd473a83c | 186 | case 'c': case 'C': /* close */ |
Rhyme | 0:d4bbd473a83c | 187 | doClose() ; break ; |
Rhyme | 0:d4bbd473a83c | 188 | case 'r': case 'R': /* read */ |
Rhyme | 0:d4bbd473a83c | 189 | doRead() ; break ; |
Rhyme | 0:d4bbd473a83c | 190 | case 'w': case 'W': /* write */ |
Rhyme | 0:d4bbd473a83c | 191 | doWrite() ; break ; |
Rhyme | 0:d4bbd473a83c | 192 | case 's': case 'S': /* status */ |
Rhyme | 0:d4bbd473a83c | 193 | doStatus() ; break ; |
Rhyme | 0:d4bbd473a83c | 194 | case 'f': case 'F': /* Frequency */ |
Rhyme | 0:d4bbd473a83c | 195 | doFreq() ; break ; |
Rhyme | 0:d4bbd473a83c | 196 | case 't': case 'T': /* test sensor */ |
Rhyme | 0:d4bbd473a83c | 197 | doTestSensor() ; break ; |
Rhyme | 0:d4bbd473a83c | 198 | case 'l': case 'L': /* set test_loop */ |
Rhyme | 0:d4bbd473a83c | 199 | setTestLoop() ; break ; |
Rhyme | 0:d4bbd473a83c | 200 | case 'b': case 'B': /* Bus Scan */ |
Rhyme | 0:d4bbd473a83c | 201 | doBusScan() ; break ; |
Rhyme | 0:d4bbd473a83c | 202 | default: |
Rhyme | 0:d4bbd473a83c | 203 | doHelp() ; break ; |
Rhyme | 0:d4bbd473a83c | 204 | } |
Rhyme | 0:d4bbd473a83c | 205 | } |
Rhyme | 0:d4bbd473a83c | 206 | |
Rhyme | 0:d4bbd473a83c | 207 | int main() { |
Rhyme | 0:d4bbd473a83c | 208 | char cmd[32] ; |
Rhyme | 0:d4bbd473a83c | 209 | tty = new vt100() ; |
Rhyme | 0:d4bbd473a83c | 210 | tty->cls() ; |
Rhyme | 0:d4bbd473a83c | 211 | doHelp() ; |
Rhyme | 0:d4bbd473a83c | 212 | while(1) { |
Rhyme | 0:d4bbd473a83c | 213 | printf("> ") ; |
Rhyme | 0:d4bbd473a83c | 214 | scanf("%s", cmd) ; |
Rhyme | 0:d4bbd473a83c | 215 | doCommand(cmd) ; |
Rhyme | 0:d4bbd473a83c | 216 | } |
Rhyme | 0:d4bbd473a83c | 217 | } |