DS21372

Dependencies:   max32625pico SerialInterface USBDevice

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?

UserRevisionLine numberNew 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 }