Jakub Tomanek / Mbed 2 deprecated TPS92520_TEST_v2

Dependencies:   mbed

Committer:
pinnarelo
Date:
Mon Dec 10 09:19:37 2018 +0000
Revision:
7:a52c300451ed
Parent:
2:b60cb847489c
TPS92520

Who changed what in which revision?

UserRevisionLine numberNew contents of line
screamer 0:005629fe3609 1 #include "mbed.h"
pinnarelo 7:a52c300451ed 2 #include <string> // this should be already included in <sstream>
pinnarelo 7:a52c300451ed 3 #include "TPS92520.h"
screamer 0:005629fe3609 4
pinnarelo 7:a52c300451ed 5
pinnarelo 7:a52c300451ed 6 TPS92520 LedDriver(PA_7, PA_6, PA_5, PA_4, PA_0);
pinnarelo 7:a52c300451ed 7
pinnarelo 7:a52c300451ed 8 Serial pc(SERIAL_TX, SERIAL_RX);
screamer 0:005629fe3609 9 DigitalOut myled(LED1);
screamer 0:005629fe3609 10
pinnarelo 7:a52c300451ed 11 DigitalOut CH1_PWM(PA_1);
pinnarelo 7:a52c300451ed 12 DigitalOut CH2_PWM(PA_3);
pinnarelo 7:a52c300451ed 13
pinnarelo 7:a52c300451ed 14 volatile char c = '\0'; // Initialized to the NULL character
pinnarelo 7:a52c300451ed 15
pinnarelo 7:a52c300451ed 16 void Rx_interrupt();
pinnarelo 7:a52c300451ed 17 void read_line();
pinnarelo 7:a52c300451ed 18 int hex2int(char ch);
pinnarelo 7:a52c300451ed 19
pinnarelo 7:a52c300451ed 20 // Circular buffers for serial TX and RX data - used by interrupt routines
pinnarelo 7:a52c300451ed 21 const int buffer_size = 255;
pinnarelo 7:a52c300451ed 22 // might need to increase buffer size for high baud rates
pinnarelo 7:a52c300451ed 23 char rx_buffer[buffer_size+1];
pinnarelo 7:a52c300451ed 24 // Circular buffer pointers
pinnarelo 7:a52c300451ed 25 // volatile makes read-modify-write atomic
pinnarelo 7:a52c300451ed 26 volatile int rx_in=0;
pinnarelo 7:a52c300451ed 27 volatile int rx_out=0;
pinnarelo 7:a52c300451ed 28 // Line buffers for sprintf and sscanf
pinnarelo 7:a52c300451ed 29 char rx_line[80];
pinnarelo 7:a52c300451ed 30
pinnarelo 7:a52c300451ed 31 // Receive Buffer
pinnarelo 7:a52c300451ed 32 char buffer[50];
pinnarelo 7:a52c300451ed 33
screamer 0:005629fe3609 34 int main() {
pinnarelo 7:a52c300451ed 35
pinnarelo 7:a52c300451ed 36 pc.baud(9600);
pinnarelo 7:a52c300451ed 37 pc.attach(&Rx_interrupt, Serial::RxIrq);
pinnarelo 7:a52c300451ed 38 pc.printf("TPS92520 Test Software\n\r");
pinnarelo 7:a52c300451ed 39
pinnarelo 7:a52c300451ed 40
pinnarelo 7:a52c300451ed 41 // Enable Led Channels
pinnarelo 7:a52c300451ed 42 CH1_PWM = 0;
pinnarelo 7:a52c300451ed 43 CH2_PWM = 0;
pinnarelo 7:a52c300451ed 44
pinnarelo 7:a52c300451ed 45
pinnarelo 7:a52c300451ed 46 LedDriver.init();
pinnarelo 7:a52c300451ed 47 LedDriver.reset();
pinnarelo 7:a52c300451ed 48 LedDriver.status();
pinnarelo 7:a52c300451ed 49
pinnarelo 7:a52c300451ed 50 int ret, pokus;
pinnarelo 7:a52c300451ed 51 char buf[50];
pinnarelo 7:a52c300451ed 52
screamer 0:005629fe3609 53 while(1) {
pinnarelo 7:a52c300451ed 54
pinnarelo 7:a52c300451ed 55 /* Status read TPS92520 */
pinnarelo 7:a52c300451ed 56 sprintf(buffer, LedDriver.status());
pinnarelo 7:a52c300451ed 57 if(strncmp(buffer, buf, strlen(buffer))) {
pinnarelo 7:a52c300451ed 58 strcpy(buf, buffer);
pinnarelo 7:a52c300451ed 59 pc.printf("Status:\n%s", buf); }
pinnarelo 7:a52c300451ed 60
pinnarelo 7:a52c300451ed 61 /* Status LED */
pinnarelo 7:a52c300451ed 62 myled = !myled;
bcostm 2:b60cb847489c 63 wait(0.2); // 200 ms
pinnarelo 7:a52c300451ed 64
pinnarelo 7:a52c300451ed 65 /* COM PORT read incoming data */
pinnarelo 7:a52c300451ed 66 read_line();
pinnarelo 7:a52c300451ed 67
screamer 0:005629fe3609 68 }
screamer 0:005629fe3609 69 }
pinnarelo 7:a52c300451ed 70
pinnarelo 7:a52c300451ed 71
pinnarelo 7:a52c300451ed 72 // Read a line from the large rx buffer from rx interrupt routine
pinnarelo 7:a52c300451ed 73 void read_line() {
pinnarelo 7:a52c300451ed 74 int i=0;
pinnarelo 7:a52c300451ed 75 int raw_data = 0;
pinnarelo 7:a52c300451ed 76 int raw_data2 = 0;
pinnarelo 7:a52c300451ed 77 int response, ret, ret2;
pinnarelo 7:a52c300451ed 78 // Loop reading rx buffer characters until end of line character
pinnarelo 7:a52c300451ed 79 while ((i==0) || (rx_line[i-1] != '\r')) {
pinnarelo 7:a52c300451ed 80 // Wait if buffer empty
pinnarelo 7:a52c300451ed 81 if (rx_in == rx_out) {
pinnarelo 7:a52c300451ed 82 return;
pinnarelo 7:a52c300451ed 83 }
pinnarelo 7:a52c300451ed 84 rx_line[i] = rx_buffer[rx_out];
pinnarelo 7:a52c300451ed 85 i++;
pinnarelo 7:a52c300451ed 86 rx_out = (rx_out + 1) % buffer_size;
pinnarelo 7:a52c300451ed 87 }
pinnarelo 7:a52c300451ed 88 rx_line[i-1] = 0;
pinnarelo 7:a52c300451ed 89 if(strncmp(rx_line,"W",1)== 0) {
pinnarelo 7:a52c300451ed 90
pinnarelo 7:a52c300451ed 91 int address = 16*hex2int(rx_line[2])+hex2int(rx_line[3]);
pinnarelo 7:a52c300451ed 92 int data = 16*hex2int(rx_line[5])+hex2int(rx_line[6]);
pinnarelo 7:a52c300451ed 93
pinnarelo 7:a52c300451ed 94 pc.printf("Writing register: Address: %d\r\n", address);
pinnarelo 7:a52c300451ed 95 pc.printf("Writing register: Data: %d\r\n", data);
pinnarelo 7:a52c300451ed 96 ret = LedDriver.writeRegs(address, data, &response);
pinnarelo 7:a52c300451ed 97 if(ret < 0) printf("Error Code A: %d\r\n", ret);
pinnarelo 7:a52c300451ed 98 pc.printf("Writen Data: %d\r\n", response & 0x00FF);
pinnarelo 7:a52c300451ed 99 }
pinnarelo 7:a52c300451ed 100 else if(strncmp(rx_line,"R",1)== 0) {
pinnarelo 7:a52c300451ed 101
pinnarelo 7:a52c300451ed 102 int address = 16*hex2int(rx_line[2])+hex2int(rx_line[3]);
pinnarelo 7:a52c300451ed 103
pinnarelo 7:a52c300451ed 104 pc.printf("Reading register: Address: %d\r\n", address);
pinnarelo 7:a52c300451ed 105 ret = LedDriver.readRegs(address, &raw_data);
pinnarelo 7:a52c300451ed 106 if(ret < 0) printf("Error Code A: %d\r\n", ret);
pinnarelo 7:a52c300451ed 107
pinnarelo 7:a52c300451ed 108 pc.printf("Register data: %d\r\n", raw_data & 0x00FF);
pinnarelo 7:a52c300451ed 109 }
pinnarelo 7:a52c300451ed 110 else if(strncmp(rx_line,"reset",5) == 0) {
pinnarelo 7:a52c300451ed 111 ret = LedDriver.reset();
pinnarelo 7:a52c300451ed 112 pc.printf("Reseting device\r\n");
pinnarelo 7:a52c300451ed 113 if(ret < 0) printf("Error Code: %d\r\n", ret); }
pinnarelo 7:a52c300451ed 114 else if(strncmp(rx_line,"stat",4) == 0) {
pinnarelo 7:a52c300451ed 115 pc.printf("%s", LedDriver.status()); }
pinnarelo 7:a52c300451ed 116 else if(strncmp(rx_line,"temp",4) == 0) {
pinnarelo 7:a52c300451ed 117 pc.printf("%s", LedDriver.temp()); }
pinnarelo 7:a52c300451ed 118 else {
pinnarelo 7:a52c300451ed 119 pc.printf("Invalid Command\r\n");
pinnarelo 7:a52c300451ed 120 }
pinnarelo 7:a52c300451ed 121
pinnarelo 7:a52c300451ed 122 return;
pinnarelo 7:a52c300451ed 123 }
pinnarelo 7:a52c300451ed 124
pinnarelo 7:a52c300451ed 125
pinnarelo 7:a52c300451ed 126 // Interupt Routine to read in data from serial port
pinnarelo 7:a52c300451ed 127 void Rx_interrupt() {
pinnarelo 7:a52c300451ed 128 // Loop just in case more than one character is in UART's receive FIFO buffer
pinnarelo 7:a52c300451ed 129 // Stop if buffer full
pinnarelo 7:a52c300451ed 130 while ((pc.readable()) && (((rx_in + 1) % buffer_size) != rx_out)) {
pinnarelo 7:a52c300451ed 131 rx_buffer[rx_in] = pc.getc();
pinnarelo 7:a52c300451ed 132 // Uncomment to Echo to USB serial to watch data flow
pinnarelo 7:a52c300451ed 133 // pc.putc(rx_buffer[rx_in]);
pinnarelo 7:a52c300451ed 134 rx_in = (rx_in + 1) % buffer_size;
pinnarelo 7:a52c300451ed 135 }
pinnarelo 7:a52c300451ed 136 return;
pinnarelo 7:a52c300451ed 137 }
pinnarelo 7:a52c300451ed 138
pinnarelo 7:a52c300451ed 139 int hex2int(char ch)
pinnarelo 7:a52c300451ed 140 {
pinnarelo 7:a52c300451ed 141 if (ch >= '0' && ch <= '9')
pinnarelo 7:a52c300451ed 142 return ch - '0';
pinnarelo 7:a52c300451ed 143 if (ch >= 'A' && ch <= 'F')
pinnarelo 7:a52c300451ed 144 return ch - 'A' + 10;
pinnarelo 7:a52c300451ed 145 if (ch >= 'a' && ch <= 'f')
pinnarelo 7:a52c300451ed 146 return ch - 'a' + 10;
pinnarelo 7:a52c300451ed 147 return -1;
pinnarelo 7:a52c300451ed 148 }