DS21372
Dependencies: max32625pico SerialInterface USBDevice
main.cpp@19:ba361d9c6b46, 2019-11-07 (annotated)
- Committer:
- mikevanderploeg
- Date:
- Thu Nov 07 04:19:27 2019 +0000
- Revision:
- 19:ba361d9c6b46
- Parent:
- 15:e8b28cadf100
need some help;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
switches | 0:60a522ae2e35 | 1 | #include "mbed.h" |
switches | 13:fed6ff32bf5d | 2 | #include "rtos.h" |
switches | 1:6923b075c8d7 | 3 | #include "USBSerial.h" |
switches | 14:dd5a96c353ed | 4 | #include "max32625pico.h" |
switches | 3:aa55728c8e09 | 5 | #include "SerialInterface.h" |
switches | 3:aa55728c8e09 | 6 | |
switches | 15:e8b28cadf100 | 7 | #define USB_MAX_RESP_LENGTH 511 |
switches | 15:e8b28cadf100 | 8 | #define USB_MAX_CMD_LENGTH 511 |
switches | 0:60a522ae2e35 | 9 | |
switches | 14:dd5a96c353ed | 10 | // configure VDDIOH to local 3.3V supply, set dipVio and swdVio to 1.8V supply |
switches | 14:dd5a96c353ed | 11 | MAX32625PICO pico(MAX32625PICO::IOH_3V3, MAX32625PICO::VIO_1V8, MAX32625PICO::VIO_1V8); |
switches | 0:60a522ae2e35 | 12 | |
switches | 14:dd5a96c353ed | 13 | // Virtual serial port over USB |
switches | 14:dd5a96c353ed | 14 | USBSerial microUSB(0x0B6A, 0x4360); |
switches | 3:aa55728c8e09 | 15 | |
mikevanderploeg | 19:ba361d9c6b46 | 16 | DigitalInOut AD[] = {P0_0, P0_1, P0_2, P0_3, P0_4, P0_5, P0_6, P0_7}; |
mikevanderploeg | 19:ba361d9c6b46 | 17 | DigitalIn RLOS = P1_6; |
mikevanderploeg | 19:ba361d9c6b46 | 18 | DigitalIn INTB = P1_7; |
mikevanderploeg | 19:ba361d9c6b46 | 19 | DigitalOut WRB = P4_4; |
mikevanderploeg | 19:ba361d9c6b46 | 20 | DigitalOut ALE = P4_5; |
mikevanderploeg | 19:ba361d9c6b46 | 21 | DigitalOut CSB = P4_6; |
mikevanderploeg | 19:ba361d9c6b46 | 22 | DigitalOut RDB = P4_7; |
mikevanderploeg | 19:ba361d9c6b46 | 23 | |
switches | 3:aa55728c8e09 | 24 | // Serial Interfaces |
mikevanderploeg | 19:ba361d9c6b46 | 25 | //I2C i2c(P1_6, P1_7); |
mikevanderploeg | 19:ba361d9c6b46 | 26 | //SPI spi(P0_5, P0_6, P0_4); |
mikevanderploeg | 19:ba361d9c6b46 | 27 | //DigitalInOut gpio[] = {P0_0, P0_1, P0_2, P0_3, P4_4, P4_5, P4_6, P4_7}; |
mikevanderploeg | 19:ba361d9c6b46 | 28 | //AnalogIn ain[] = {AIN_0, AIN_1, AIN_2, AIN_3, AIN_4, AIN_5, AIN_6, AIN_7}; |
switches | 9:e59eb5f5ce32 | 29 | |
switches | 9:e59eb5f5ce32 | 30 | // Serial Interface Adapter |
mikevanderploeg | 19:ba361d9c6b46 | 31 | //SerialInterface serInt(&i2c, &spi, gpio, ain); |
switches | 3:aa55728c8e09 | 32 | |
switches | 3:aa55728c8e09 | 33 | // Threads |
switches | 3:aa55728c8e09 | 34 | Thread threadUSB; |
switches | 3:aa55728c8e09 | 35 | |
switches | 2:57500e991166 | 36 | DigitalOut rLED(LED1); |
switches | 2:57500e991166 | 37 | DigitalOut gLED(LED2); |
switches | 2:57500e991166 | 38 | DigitalOut bLED(LED3); |
switches | 0:60a522ae2e35 | 39 | |
mikevanderploeg | 19:ba361d9c6b46 | 40 | void parseCommand( char* input, char* output); |
mikevanderploeg | 19:ba361d9c6b46 | 41 | void write( char* resp ); |
mikevanderploeg | 19:ba361d9c6b46 | 42 | void read( char* resp ); |
mikevanderploeg | 19:ba361d9c6b46 | 43 | int _args[MAX_NUM_ARGS]; |
mikevanderploeg | 19:ba361d9c6b46 | 44 | |
switches | 3:aa55728c8e09 | 45 | void usb_thread() |
switches | 3:aa55728c8e09 | 46 | { |
switches | 15:e8b28cadf100 | 47 | char obuf[USB_MAX_RESP_LENGTH +1]; |
switches | 15:e8b28cadf100 | 48 | char ibuf[USB_MAX_CMD_LENGTH +1]; |
switches | 3:aa55728c8e09 | 49 | int i = 0; |
switches | 3:aa55728c8e09 | 50 | |
switches | 5:2436ae0a9eb1 | 51 | microUSB.printf("micro USB serial port\r\n"); |
switches | 5:2436ae0a9eb1 | 52 | |
switches | 3:aa55728c8e09 | 53 | while(1) { |
switches | 3:aa55728c8e09 | 54 | if (microUSB.readable()) { |
switches | 3:aa55728c8e09 | 55 | ibuf[i]=microUSB.getc(); |
switches | 3:aa55728c8e09 | 56 | if (ibuf[i]!='\r') { |
switches | 3:aa55728c8e09 | 57 | if (i < USB_MAX_CMD_LENGTH) { |
switches | 3:aa55728c8e09 | 58 | i += 1; |
switches | 3:aa55728c8e09 | 59 | } |
switches | 3:aa55728c8e09 | 60 | } else { |
switches | 15:e8b28cadf100 | 61 | bLED = LED_ON; |
switches | 3:aa55728c8e09 | 62 | if (i < USB_MAX_CMD_LENGTH) { |
switches | 3:aa55728c8e09 | 63 | ibuf[i]=0; |
switches | 3:aa55728c8e09 | 64 | // microUSB.printf("UART CMD: %s=", ibuf); |
mikevanderploeg | 19:ba361d9c6b46 | 65 | // serInt.call(ibuf, obuf); |
mikevanderploeg | 19:ba361d9c6b46 | 66 | parseCommand( ibuf, obuf ); |
switches | 3:aa55728c8e09 | 67 | microUSB.printf("%s\r\n", obuf); |
switches | 3:aa55728c8e09 | 68 | } else { |
switches | 3:aa55728c8e09 | 69 | microUSB.printf("[-1]\r\n"); |
switches | 3:aa55728c8e09 | 70 | } |
switches | 3:aa55728c8e09 | 71 | i=0; |
switches | 15:e8b28cadf100 | 72 | bLED = LED_OFF; |
switches | 3:aa55728c8e09 | 73 | } |
switches | 3:aa55728c8e09 | 74 | } |
switches | 3:aa55728c8e09 | 75 | } |
switches | 3:aa55728c8e09 | 76 | } |
switches | 3:aa55728c8e09 | 77 | |
switches | 3:aa55728c8e09 | 78 | |
switches | 0:60a522ae2e35 | 79 | // main() runs in its own thread in the OS |
switches | 0:60a522ae2e35 | 80 | // (note the calls to Thread::wait below for delays) |
switches | 0:60a522ae2e35 | 81 | int main() |
switches | 0:60a522ae2e35 | 82 | { |
switches | 2:57500e991166 | 83 | rLED = LED_ON; |
switches | 2:57500e991166 | 84 | gLED = LED_ON; |
switches | 2:57500e991166 | 85 | bLED = LED_OFF; |
switches | 3:aa55728c8e09 | 86 | |
switches | 14:dd5a96c353ed | 87 | // Configure P4_4 through P4_7 for 3.3V I/O |
mikevanderploeg | 19:ba361d9c6b46 | 88 | pico.vddioh(P0_0, MAX32625PICO::VIO_IOH); |
mikevanderploeg | 19:ba361d9c6b46 | 89 | pico.vddioh(P0_1, MAX32625PICO::VIO_IOH); |
mikevanderploeg | 19:ba361d9c6b46 | 90 | pico.vddioh(P0_2, MAX32625PICO::VIO_IOH); |
mikevanderploeg | 19:ba361d9c6b46 | 91 | pico.vddioh(P0_3, MAX32625PICO::VIO_IOH); |
mikevanderploeg | 19:ba361d9c6b46 | 92 | pico.vddioh(P0_4, MAX32625PICO::VIO_IOH); |
mikevanderploeg | 19:ba361d9c6b46 | 93 | pico.vddioh(P0_5, MAX32625PICO::VIO_IOH); |
mikevanderploeg | 19:ba361d9c6b46 | 94 | pico.vddioh(P0_6, MAX32625PICO::VIO_IOH); |
mikevanderploeg | 19:ba361d9c6b46 | 95 | pico.vddioh(P0_7, MAX32625PICO::VIO_IOH); |
mikevanderploeg | 19:ba361d9c6b46 | 96 | pico.vddioh(P1_6, MAX32625PICO::VIO_IOH); |
mikevanderploeg | 19:ba361d9c6b46 | 97 | pico.vddioh(P1_7, MAX32625PICO::VIO_IOH); |
switches | 14:dd5a96c353ed | 98 | pico.vddioh(P4_4, MAX32625PICO::VIO_IOH); |
switches | 14:dd5a96c353ed | 99 | pico.vddioh(P4_5, MAX32625PICO::VIO_IOH); |
switches | 14:dd5a96c353ed | 100 | pico.vddioh(P4_6, MAX32625PICO::VIO_IOH); |
switches | 14:dd5a96c353ed | 101 | pico.vddioh(P4_7, MAX32625PICO::VIO_IOH); |
switches | 2:57500e991166 | 102 | |
switches | 2:57500e991166 | 103 | rLED = LED_OFF; |
switches | 5:2436ae0a9eb1 | 104 | |
switches | 3:aa55728c8e09 | 105 | // Start USB serial thread |
switches | 3:aa55728c8e09 | 106 | threadUSB.start(usb_thread); |
switches | 5:2436ae0a9eb1 | 107 | |
switches | 3:aa55728c8e09 | 108 | // Start main loop |
switches | 1:6923b075c8d7 | 109 | while(1) { |
switches | 3:aa55728c8e09 | 110 | Thread::wait(500); |
switches | 3:aa55728c8e09 | 111 | gLED = !gLED; |
switches | 0:60a522ae2e35 | 112 | } |
switches | 0:60a522ae2e35 | 113 | } |
switches | 0:60a522ae2e35 | 114 | |
mikevanderploeg | 19:ba361d9c6b46 | 115 | // taken from SerialInterface.cpp |
mikevanderploeg | 19:ba361d9c6b46 | 116 | void parseCommand( char* input, char* output) |
mikevanderploeg | 19:ba361d9c6b46 | 117 | { |
mikevanderploeg | 19:ba361d9c6b46 | 118 | char cmd; |
mikevanderploeg | 19:ba361d9c6b46 | 119 | _args[0] = 0; // reset _args |
mikevanderploeg | 19:ba361d9c6b46 | 120 | if (*input == '/') { // only proceed if input is the format '/w/addr/data' |
mikevanderploeg | 19:ba361d9c6b46 | 121 | input++; // look at second character |
mikevanderploeg | 19:ba361d9c6b46 | 122 | cmd = *input; // cmd should be either 'w' or 'r' |
mikevanderploeg | 19:ba361d9c6b46 | 123 | input = strchr(input, '/'); // strchr returns a pointer to the first occurance of a character, in this case, it is the second '/' |
mikevanderploeg | 19:ba361d9c6b46 | 124 | while (*input == '/') { |
mikevanderploeg | 19:ba361d9c6b46 | 125 | input++; // advance to next character |
mikevanderploeg | 19:ba361d9c6b46 | 126 | _args[(_args[0]+1)] = strtol(input, &input, 0); // parse data as integer number |
mikevanderploeg | 19:ba361d9c6b46 | 127 | if (input) { // if there is still data, increase |
mikevanderploeg | 19:ba361d9c6b46 | 128 | _args[0]++; |
mikevanderploeg | 19:ba361d9c6b46 | 129 | } |
mikevanderploeg | 19:ba361d9c6b46 | 130 | } |
mikevanderploeg | 19:ba361d9c6b46 | 131 | switch (cmd) { |
mikevanderploeg | 19:ba361d9c6b46 | 132 | case 'w': // /w/addr/data |
mikevanderploeg | 19:ba361d9c6b46 | 133 | write(output); |
mikevanderploeg | 19:ba361d9c6b46 | 134 | break; |
mikevanderploeg | 19:ba361d9c6b46 | 135 | case 'r': |
mikevanderploeg | 19:ba361d9c6b46 | 136 | read(output); |
mikevanderploeg | 19:ba361d9c6b46 | 137 | break; |
mikevanderploeg | 19:ba361d9c6b46 | 138 | default: |
mikevanderploeg | 19:ba361d9c6b46 | 139 | sprintf(output, "!commands: w r"); |
mikevanderploeg | 19:ba361d9c6b46 | 140 | break; |
mikevanderploeg | 19:ba361d9c6b46 | 141 | } |
mikevanderploeg | 19:ba361d9c6b46 | 142 | } else { |
mikevanderploeg | 19:ba361d9c6b46 | 143 | sprintf(output, "!format: /cmd/arg1/arg2..."); |
mikevanderploeg | 19:ba361d9c6b46 | 144 | |
mikevanderploeg | 19:ba361d9c6b46 | 145 | } |
mikevanderploeg | 19:ba361d9c6b46 | 146 | } |
mikevanderploeg | 19:ba361d9c6b46 | 147 | |
mikevanderploeg | 19:ba361d9c6b46 | 148 | void write(char* resp) |
mikevanderploeg | 19:ba361d9c6b46 | 149 | { |
mikevanderploeg | 19:ba361d9c6b46 | 150 | int i; |
mikevanderploeg | 19:ba361d9c6b46 | 151 | // _args[1] should be the address |
mikevanderploeg | 19:ba361d9c6b46 | 152 | // _args[2] should be the data to write |
mikevanderploeg | 19:ba361d9c6b46 | 153 | ALE = 1; |
mikevanderploeg | 19:ba361d9c6b46 | 154 | RDB = 1; |
mikevanderploeg | 19:ba361d9c6b46 | 155 | WRB = 1; |
mikevanderploeg | 19:ba361d9c6b46 | 156 | CSB = 0; |
mikevanderploeg | 19:ba361d9c6b46 | 157 | // Set address |
mikevanderploeg | 19:ba361d9c6b46 | 158 | for( i=0; i<8; i++ ) { |
mikevanderploeg | 19:ba361d9c6b46 | 159 | AD[i].output(); |
mikevanderploeg | 19:ba361d9c6b46 | 160 | if( ((int)_args[1] & (1<<i)) > 0 ) |
mikevanderploeg | 19:ba361d9c6b46 | 161 | AD[i] = 1; |
mikevanderploeg | 19:ba361d9c6b46 | 162 | else |
mikevanderploeg | 19:ba361d9c6b46 | 163 | AD[i] = 0; |
mikevanderploeg | 19:ba361d9c6b46 | 164 | } |
mikevanderploeg | 19:ba361d9c6b46 | 165 | wait_us(1.0); |
mikevanderploeg | 19:ba361d9c6b46 | 166 | // ALE falling latches in address |
mikevanderploeg | 19:ba361d9c6b46 | 167 | ALE = 0; |
mikevanderploeg | 19:ba361d9c6b46 | 168 | wait_us(1.0); |
mikevanderploeg | 19:ba361d9c6b46 | 169 | // Set WRB = 0 |
mikevanderploeg | 19:ba361d9c6b46 | 170 | WRB = 0; |
mikevanderploeg | 19:ba361d9c6b46 | 171 | wait_us(1.0); |
mikevanderploeg | 19:ba361d9c6b46 | 172 | // Set data |
mikevanderploeg | 19:ba361d9c6b46 | 173 | for( i=0; i<8; i++ ) { |
mikevanderploeg | 19:ba361d9c6b46 | 174 | if( ((int)_args[2] & (1<<i)) > 0 ) |
mikevanderploeg | 19:ba361d9c6b46 | 175 | AD[i] = 1; |
mikevanderploeg | 19:ba361d9c6b46 | 176 | else |
mikevanderploeg | 19:ba361d9c6b46 | 177 | AD[i] = 0; |
mikevanderploeg | 19:ba361d9c6b46 | 178 | } |
mikevanderploeg | 19:ba361d9c6b46 | 179 | wait_us(1.0); |
mikevanderploeg | 19:ba361d9c6b46 | 180 | // Enable WRB to latch in data |
mikevanderploeg | 19:ba361d9c6b46 | 181 | WRB = 1; |
mikevanderploeg | 19:ba361d9c6b46 | 182 | wait_us(1.0); |
mikevanderploeg | 19:ba361d9c6b46 | 183 | // set CSB |
mikevanderploeg | 19:ba361d9c6b46 | 184 | CSB = 1; |
mikevanderploeg | 19:ba361d9c6b46 | 185 | wait_us(1.0); |
mikevanderploeg | 19:ba361d9c6b46 | 186 | // Set ALE |
mikevanderploeg | 19:ba361d9c6b46 | 187 | ALE = 1; |
mikevanderploeg | 19:ba361d9c6b46 | 188 | wait_us(1.0); |
mikevanderploeg | 19:ba361d9c6b46 | 189 | resp = "[0]"; |
mikevanderploeg | 19:ba361d9c6b46 | 190 | } |
mikevanderploeg | 19:ba361d9c6b46 | 191 | |
mikevanderploeg | 19:ba361d9c6b46 | 192 | void read(char* resp) |
mikevanderploeg | 19:ba361d9c6b46 | 193 | { |
mikevanderploeg | 19:ba361d9c6b46 | 194 | int i; |
mikevanderploeg | 19:ba361d9c6b46 | 195 | // _args[1] should be the address |
mikevanderploeg | 19:ba361d9c6b46 | 196 | ALE = 1; |
mikevanderploeg | 19:ba361d9c6b46 | 197 | RDB = 1; |
mikevanderploeg | 19:ba361d9c6b46 | 198 | WRB = 1; |
mikevanderploeg | 19:ba361d9c6b46 | 199 | CSB = 0; |
mikevanderploeg | 19:ba361d9c6b46 | 200 | int readVal=0; |
mikevanderploeg | 19:ba361d9c6b46 | 201 | // Set address |
mikevanderploeg | 19:ba361d9c6b46 | 202 | for( i=0; i<8; i++ ) { |
mikevanderploeg | 19:ba361d9c6b46 | 203 | if( ((int)_args[1] & (1<<i)) > 0 ) |
mikevanderploeg | 19:ba361d9c6b46 | 204 | AD[i] = 1; |
mikevanderploeg | 19:ba361d9c6b46 | 205 | else |
mikevanderploeg | 19:ba361d9c6b46 | 206 | AD[i] = 0; |
mikevanderploeg | 19:ba361d9c6b46 | 207 | } |
mikevanderploeg | 19:ba361d9c6b46 | 208 | wait_us(1.0); |
mikevanderploeg | 19:ba361d9c6b46 | 209 | // ALE falling latches in address |
mikevanderploeg | 19:ba361d9c6b46 | 210 | ALE = 0; |
mikevanderploeg | 19:ba361d9c6b46 | 211 | wait_us(1.0); |
mikevanderploeg | 19:ba361d9c6b46 | 212 | // Set RDB = 0 |
mikevanderploeg | 19:ba361d9c6b46 | 213 | RDB = 0; |
mikevanderploeg | 19:ba361d9c6b46 | 214 | wait_us(1.0); |
mikevanderploeg | 19:ba361d9c6b46 | 215 | // Read data |
mikevanderploeg | 19:ba361d9c6b46 | 216 | // First set as inputs |
mikevanderploeg | 19:ba361d9c6b46 | 217 | for( i=0; i<8; i++ ) AD[i].input(); |
mikevanderploeg | 19:ba361d9c6b46 | 218 | wait_us(1.0); |
mikevanderploeg | 19:ba361d9c6b46 | 219 | for( i=0; i<8; i++ ) readVal = readVal + (1<<i) * AD[i]; |
mikevanderploeg | 19:ba361d9c6b46 | 220 | sprintf(resp, "%d", readVal); |
mikevanderploeg | 19:ba361d9c6b46 | 221 | wait_us(1.0); |
mikevanderploeg | 19:ba361d9c6b46 | 222 | // Enable WRB to latch in data |
mikevanderploeg | 19:ba361d9c6b46 | 223 | RDB = 1; |
mikevanderploeg | 19:ba361d9c6b46 | 224 | wait_us(1.0); |
mikevanderploeg | 19:ba361d9c6b46 | 225 | // set CSB |
mikevanderploeg | 19:ba361d9c6b46 | 226 | CSB = 1; |
mikevanderploeg | 19:ba361d9c6b46 | 227 | wait_us(1.0); |
mikevanderploeg | 19:ba361d9c6b46 | 228 | // Set ALE |
mikevanderploeg | 19:ba361d9c6b46 | 229 | ALE = 1; |
mikevanderploeg | 19:ba361d9c6b46 | 230 | wait_us(1.0); |
mikevanderploeg | 19:ba361d9c6b46 | 231 | } |