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.
main.cpp@7:a52c300451ed, 2018-12-10 (annotated)
- Committer:
- pinnarelo
- Date:
- Mon Dec 10 09:19:37 2018 +0000
- Revision:
- 7:a52c300451ed
- Parent:
- 2:b60cb847489c
TPS92520
Who changed what in which revision?
| User | Revision | Line number | New 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 | } |