Firmware development for use with LF21
Dependencies: USBDevice max32630fthr
Fork of FTHR_USB_serial by
main.cpp
- Committer:
- nwaskewicz
- Date:
- 2017-09-22
- Revision:
- 10:aec9f740a325
- Parent:
- 9:3c7f27df0b01
- Child:
- 11:8a8562282546
File content as of revision 10:aec9f740a325:
#include "mbed.h" #include "max32630fthr.h" #include "USBSerial.h" //#include "string.h" #define LF21_I2C_WRITE 0xD2 #define LF21_I2C_READ 0xD3 // Hardware serial port over DAPLink Serial daplink(P2_1, P2_0); // Virtual serial port over USB USBSerial microUSB; SPI spi(P5_1, P5_2, P5_0); // mosi, miso, sclk I2C i2c(P3_4, P3_5); DigitalOut spicsb(P4_0); // spi csb line DigitalOut p3_0(P3_0); DigitalOut p3_1(P3_1); DigitalOut p3_2(P3_2); DigitalOut p3_3(P3_3); DigitalOut p5_3(P5_3); DigitalOut p5_4(P5_4); DigitalOut p5_5(P5_5); DigitalOut p5_6(P5_6); DigitalOut rLED(LED1); DigitalOut gLED(LED2); DigitalOut bLED(LED3); MAX32630FTHR pegasus(MAX32630FTHR::VIO_1V8); int ascii(char a, char b); int ldo(char a, char b); // main() runs in its own thread in the OS // (note the calls to Thread::wait below for delays) int main() { char buf[10]; gLED = LED_OFF; bLED = LED_ON; rLED = LED_OFF; spi.format(8,0); spicsb = 1; pegasus.max14690.ldo3SetVoltage(1800); wait(1.0); i2c.frequency(1000000); p3_0 = 0; p3_1 = 1; p3_2 = 1; p3_3 = 0; p5_3 = 1; p5_4 = 0; p5_5 = 1; p5_6 = 1; while(1) { microUSB.scanf("%s", buf); // ping command, responds with pong if(buf[0]=='p' && buf[1]=='i' && buf[2]=='n' && buf[3]=='g') { microUSB.printf("pong\r\n"); gLED=LED_OFF; wait(0.01); gLED=LED_ON; wait(0.01); gLED=LED_OFF; } // spi write command: spiw.addr.data // addr and data in hex else if (buf[0]=='s' && buf[1]=='p' && buf[2]=='i' && buf[3]=='w') { int resp = 0; char payload[2]; char response[2]; payload[0] = ascii((int)buf[5],(int)buf[6]); payload[1] = ascii((int)buf[8],(int)buf[9]); spicsb = 0; resp = spi.write(payload, sizeof(payload), response, sizeof(response)); spicsb = 1; microUSB.printf("ack.%i\r\n",resp); gLED=LED_OFF; wait(0.01); gLED=LED_ON; wait(0.01); gLED=LED_OFF; } // virtual int write(const char *tx_buffer, int tx_length, char *rx_buffer, int rx_length); else if (buf[0]=='t' && buf[1]=='e' && buf[2]=='s' && buf[3]=='t') { int resp = 0; char payload[2]; char response[2]; payload[0] = 0x5A; payload[1] = 0xA5; spicsb = 0; resp = spi.write(payload, sizeof(payload), response, sizeof(response)); spicsb = 1; microUSB.printf("ack.%i\r\n",resp); gLED=LED_OFF; wait(0.01); gLED=LED_ON; wait(0.01); gLED=LED_OFF; } // spi read command: spir.addr else if (buf[0]=='s' && buf[1]=='p' && buf[2]=='i' && buf[3]=='r') { int resp = 0; char payload[2]; char response[2]; payload[0] = ascii((int)buf[5],(int)buf[6]); payload[1] = 0x00; spicsb = 0; resp = spi.write(payload, sizeof(payload), response, sizeof(response)); spicsb = 1; microUSB.printf("ack.%i.%i\r\n", response[1], resp); gLED=LED_OFF; wait(0.01); gLED=LED_ON; wait(0.01); gLED=LED_OFF; } // i2c write command: i2cw.addr.data else if (buf[0]=='i' && buf[1]=='2' && buf[2]=='c' && buf[3]=='w') { int response = 0; char payload[2]; payload[0] = ascii((int)buf[5],(int)buf[6]); payload[1] = ascii((int)buf[8],(int)buf[9]); response = i2c.write(LF21_I2C_WRITE, payload, sizeof(payload)); microUSB.printf("ack.%i\r\n", response); gLED=LED_OFF; wait(0.01); gLED=LED_ON; wait(0.01); gLED=LED_OFF; } // i2c read command: i2cr.addr else if (buf[0]=='i' && buf[1]=='2' && buf[2]=='c' && buf[3]=='r') { int response = 0; char address[1]; char payload[1]; payload[0] = 0xFF; address[0] = ascii((int)buf[5],(int)buf[6]); response = i2c.write(LF21_I2C_WRITE, address, sizeof(address), true); response = i2c.read(LF21_I2C_READ, payload, sizeof(payload)); microUSB.printf("ack.%i.%i\r\n", response, payload[0]); gLED=LED_OFF; wait(0.01); gLED=LED_ON; wait(0.01); gLED=LED_OFF; } // digital pin p5_5 else if (buf[0]=='p' && buf[1]=='5' && buf[2]=='_' && buf[3]=='5') { if (buf[5]=='1') p5_5 = 1; else p5_5 = 0; microUSB.printf("ack\r\n"); gLED=LED_OFF; wait(0.01); gLED=LED_ON; wait(0.01); gLED=LED_OFF; } // digital pin p5_6 else if (buf[0]=='p' && buf[1]=='5' && buf[2]=='_' && buf[3]=='6') { if (buf[5]=='1') p5_6 = 1; else p5_6 = 0; microUSB.printf("ack\r\n"); gLED=LED_OFF; wait(0.01); gLED=LED_ON; wait(0.01); gLED=LED_OFF; } // digital pin p5_3 else if (buf[0]=='p' && buf[1]=='5' && buf[2]=='_' && buf[3]=='3') { if (buf[5]=='1') p5_3 = 1; else p5_3 = 0; microUSB.printf("ack\r\n"); gLED=LED_OFF; wait(0.01); gLED=LED_ON; wait(0.01); gLED=LED_OFF; } // digital pin p5_4 else if (buf[0]=='p' && buf[1]=='5' && buf[2]=='_' && buf[3]=='4') { if (buf[5]=='1') p5_4 = 1; else p5_4 = 0; microUSB.printf("ack\r\n"); gLED=LED_OFF; wait(0.01); gLED=LED_ON; wait(0.01); gLED=LED_OFF; } // digital pin p3_1 else if (buf[0]=='p' && buf[1]=='3' && buf[2]=='_' && buf[3]=='1') { if (buf[5]=='1') p3_1 = 1; else p3_1 = 0; microUSB.printf("ack\r\n"); gLED=LED_OFF; wait(0.01); gLED=LED_ON; wait(0.01); gLED=LED_OFF; } // digital pin p3_0 else if (buf[0]=='p' && buf[1]=='3' && buf[2]=='_' && buf[3]=='0') { if (buf[5]=='1') p3_0 = 1; else p3_0 = 0; microUSB.printf("ack\r\n"); gLED=LED_OFF; wait(0.01); gLED=LED_ON; wait(0.01); gLED=LED_OFF; } // digital pin p3_3 else if (buf[0]=='p' && buf[1]=='3' && buf[2]=='_' && buf[3]=='3') { if (buf[5]=='1') p3_3 = 1; else p3_3 = 0; microUSB.printf("ack\r\n"); gLED=LED_OFF; wait(0.01); gLED=LED_ON; wait(0.01); gLED=LED_OFF; } // digital pin p3_2 else if (buf[0]=='p' && buf[1]=='3' && buf[2]=='_' && buf[3]=='2') { if (buf[5]=='1') p3_2 = 1; else p3_2 = 0; microUSB.printf("ack\r\n"); gLED=LED_OFF; wait(0.01); gLED=LED_ON; wait(0.01); gLED=LED_OFF; } // set ldo voltage else if (buf[0]=='l' && buf[1]=='d' && buf[2]=='o') { int setting = ldo((int)buf[4],(int)buf[5]); pegasus.max14690.ldo3SetVoltage(setting*100); microUSB.printf("ack.%i\r\n",setting); gLED=LED_OFF; wait(0.01); gLED=LED_ON; wait(0.01); gLED=LED_OFF; } } } int ascii(char a, char b) { int val1 = 0; int val2 = 0; int val = 0; if(a>64 && a<71) { val1 = (int)a-55; } else if(a>96 && a<103) { val1 = (int)a-87; } else val1 = (int)a-48; if(b>64 && b<71) { val2 = (int)b-55; } else if(b>96 && b<103) { val2 = (int)b-87; } else val2 = (int)b-48; val=16*val1+val2; return val; } int ldo(char a, char b) { int val1 = 0; int val2 = 0; int val = 0; if(a>64 && a<71) { val1 = (int)a-55; } else if(a>96 && a<103) { val1 = (int)a-87; } else val1 = (int)a-48; if(b>64 && b<71) { val2 = (int)b-55; } else if(b>96 && b<103) { val2 = (int)b-87; } else val2 = (int)b-48; val=10*val1+val2; return val; }