This is a simple terminal used for send and receive data via SPI (p5, p6, p7). It use the usb as serial (9600bps) interface port.

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include <string.h>
00003 #include <stdlib.h>
00004 
00005 /* Commands:
00006     Dd      - Data out
00007     Cx      - CS line state (0/1)
00008     Fd,l    - Data flow out, the total size is l
00009     Rl      - Receive data, l is the size
00010     Md,d..  - Multiple data write
00011 */
00012 
00013 DigitalOut myled(LED1);
00014 
00015 SPI spi_device(p5, p6, p7);
00016 DigitalOut spi_cs(p8);
00017 
00018 Serial tty_usb(USBTX, USBRX);
00019 char tty_buffer[0x100];
00020 
00021 void receive_command() {
00022     uint8_t buffer_ptr = 0;
00023     char ch;
00024 
00025     tty_usb.putc('>');
00026     while (1) {
00027         if (tty_usb.readable()) {
00028             ch = tty_usb.getc();
00029             tty_usb.putc(ch);
00030             
00031             tty_buffer[buffer_ptr] = ch;
00032             buffer_ptr++;
00033             if ((ch == '\n') || (ch == '\r')) {
00034                 tty_usb.putc('\n');
00035                 tty_usb.putc('\r');
00036                 break;
00037             }
00038             if (ch == 0x7f) {
00039                 buffer_ptr -= 2;
00040                 tty_usb.putc(0x8);
00041                 tty_usb.putc(' ');
00042                 tty_usb.putc(0x8);
00043             }
00044         }
00045     }
00046 }
00047 
00048 int main() {
00049     uint8_t arg_data, arg_data_in;
00050     uint16_t arg_size;
00051     char *arg_ptr;
00052     
00053     tty_usb.baud(9600);
00054     
00055     while(1) {
00056         
00057         receive_command();
00058         switch (tty_buffer[0]) {
00059             case 'D':
00060             case 'd':
00061                 arg_data = strtol(&tty_buffer[1], NULL, 16);
00062                 arg_data_in = spi_device.write(arg_data);
00063                 tty_usb.printf("#\tSingle data: OUT: $%02X -  IN: $%02X\n\r", arg_data, arg_data_in);
00064                 break;
00065             case 'C':
00066             case 'c':
00067                 spi_cs = (tty_buffer[1] == '0') ? 0 : 1;
00068                 break;
00069             case 'R':
00070             case 'r':
00071                 arg_size = strtol(&tty_buffer[1], NULL, 16);
00072                 for (int i = 0; i < arg_size; i++)
00073                     tty_usb.printf("#\tReceived data [$%04X]: $%02X\n\r", i, spi_device.write(0x00));
00074                 break;
00075                 
00076             case 'F':
00077             case 'f':
00078                 arg_size = strtol(strchr(tty_buffer, ',')+1, NULL, 16);
00079                 *(strchr(tty_buffer, ',') + 1) = 0x00;
00080                 arg_data = strtol(&tty_buffer[1], NULL, 16);
00081                 
00082                 for (int i = 0; i < arg_size; i++) {
00083                     arg_data_in = spi_device.write(arg_data);
00084                     tty_usb.printf("#\tFlow data [$%04X]: OUT: $%02X - IN: $%02X\n\r", i, arg_data, arg_data_in);
00085                     
00086                 }
00087                 break;
00088 
00089             case 'M':
00090             case 'm':
00091                 arg_ptr = strtok(&tty_buffer[1], ",\n\r");
00092                 arg_size = 0;
00093                 while (arg_ptr != NULL) {
00094                     arg_data = strtol(arg_ptr, NULL, 16);
00095                     arg_data_in = spi_device.write(arg_data);
00096                     tty_usb.printf("#\tMultiple data [$%04X]: OUT: $%02X - IN: $%02X\n\r", arg_size, arg_data, arg_data_in);
00097                     arg_ptr = strtok(NULL, ",\n\r");
00098                     arg_size++;
00099                 }
00100                 break;
00101 
00102         }
00103     }
00104 }