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.
Commands:
#
All the numeric constants MUST be in Hexadecimal #
- C[level] - Change the [level] of the CS line (p8)
- D[data] - Send single byte of [data]
- M[data],[data], .. ,[data] - Send multiple bytes of [data]
- F[data],[size] - Send a flow sized [size] of [data] bytes
- R[size] - Receive [size] bytes
Examples
- C0 - Put the CS at logic level 0
- C1 - Put the CS at logic level 1
- Dab - Send out the byte 0xab
- M55,aa,01,ab,cd - Send out the bytes 0x55, 0xaa, 0x01, 0xab, 0xcd
- Fff,05 - Send out 5 bytes of value 0xff
- R10 - Receive 16 bytes
main.cpp@0:7beba59b8a7d, 2014-05-19 (annotated)
- Committer:
- trombettamichele
- Date:
- Mon May 19 18:45:27 2014 +0000
- Revision:
- 0:7beba59b8a7d
Simple SPI Terminal
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
trombettamichele | 0:7beba59b8a7d | 1 | #include "mbed.h" |
trombettamichele | 0:7beba59b8a7d | 2 | #include <string.h> |
trombettamichele | 0:7beba59b8a7d | 3 | #include <stdlib.h> |
trombettamichele | 0:7beba59b8a7d | 4 | |
trombettamichele | 0:7beba59b8a7d | 5 | /* Commands: |
trombettamichele | 0:7beba59b8a7d | 6 | Dd - Data out |
trombettamichele | 0:7beba59b8a7d | 7 | Cx - CS line state (0/1) |
trombettamichele | 0:7beba59b8a7d | 8 | Fd,l - Data flow out, the total size is l |
trombettamichele | 0:7beba59b8a7d | 9 | Rl - Receive data, l is the size |
trombettamichele | 0:7beba59b8a7d | 10 | Md,d.. - Multiple data write |
trombettamichele | 0:7beba59b8a7d | 11 | */ |
trombettamichele | 0:7beba59b8a7d | 12 | |
trombettamichele | 0:7beba59b8a7d | 13 | DigitalOut myled(LED1); |
trombettamichele | 0:7beba59b8a7d | 14 | |
trombettamichele | 0:7beba59b8a7d | 15 | SPI spi_device(p5, p6, p7); |
trombettamichele | 0:7beba59b8a7d | 16 | DigitalOut spi_cs(p8); |
trombettamichele | 0:7beba59b8a7d | 17 | |
trombettamichele | 0:7beba59b8a7d | 18 | Serial tty_usb(USBTX, USBRX); |
trombettamichele | 0:7beba59b8a7d | 19 | char tty_buffer[0x100]; |
trombettamichele | 0:7beba59b8a7d | 20 | |
trombettamichele | 0:7beba59b8a7d | 21 | void receive_command() { |
trombettamichele | 0:7beba59b8a7d | 22 | uint8_t buffer_ptr = 0; |
trombettamichele | 0:7beba59b8a7d | 23 | char ch; |
trombettamichele | 0:7beba59b8a7d | 24 | |
trombettamichele | 0:7beba59b8a7d | 25 | tty_usb.putc('>'); |
trombettamichele | 0:7beba59b8a7d | 26 | while (1) { |
trombettamichele | 0:7beba59b8a7d | 27 | if (tty_usb.readable()) { |
trombettamichele | 0:7beba59b8a7d | 28 | ch = tty_usb.getc(); |
trombettamichele | 0:7beba59b8a7d | 29 | tty_usb.putc(ch); |
trombettamichele | 0:7beba59b8a7d | 30 | |
trombettamichele | 0:7beba59b8a7d | 31 | tty_buffer[buffer_ptr] = ch; |
trombettamichele | 0:7beba59b8a7d | 32 | buffer_ptr++; |
trombettamichele | 0:7beba59b8a7d | 33 | if ((ch == '\n') || (ch == '\r')) { |
trombettamichele | 0:7beba59b8a7d | 34 | tty_usb.putc('\n'); |
trombettamichele | 0:7beba59b8a7d | 35 | tty_usb.putc('\r'); |
trombettamichele | 0:7beba59b8a7d | 36 | break; |
trombettamichele | 0:7beba59b8a7d | 37 | } |
trombettamichele | 0:7beba59b8a7d | 38 | if (ch == 0x7f) { |
trombettamichele | 0:7beba59b8a7d | 39 | buffer_ptr -= 2; |
trombettamichele | 0:7beba59b8a7d | 40 | tty_usb.putc(0x8); |
trombettamichele | 0:7beba59b8a7d | 41 | tty_usb.putc(' '); |
trombettamichele | 0:7beba59b8a7d | 42 | tty_usb.putc(0x8); |
trombettamichele | 0:7beba59b8a7d | 43 | } |
trombettamichele | 0:7beba59b8a7d | 44 | } |
trombettamichele | 0:7beba59b8a7d | 45 | } |
trombettamichele | 0:7beba59b8a7d | 46 | } |
trombettamichele | 0:7beba59b8a7d | 47 | |
trombettamichele | 0:7beba59b8a7d | 48 | int main() { |
trombettamichele | 0:7beba59b8a7d | 49 | uint8_t arg_data, arg_data_in; |
trombettamichele | 0:7beba59b8a7d | 50 | uint16_t arg_size; |
trombettamichele | 0:7beba59b8a7d | 51 | char *arg_ptr; |
trombettamichele | 0:7beba59b8a7d | 52 | |
trombettamichele | 0:7beba59b8a7d | 53 | tty_usb.baud(9600); |
trombettamichele | 0:7beba59b8a7d | 54 | |
trombettamichele | 0:7beba59b8a7d | 55 | while(1) { |
trombettamichele | 0:7beba59b8a7d | 56 | |
trombettamichele | 0:7beba59b8a7d | 57 | receive_command(); |
trombettamichele | 0:7beba59b8a7d | 58 | switch (tty_buffer[0]) { |
trombettamichele | 0:7beba59b8a7d | 59 | case 'D': |
trombettamichele | 0:7beba59b8a7d | 60 | case 'd': |
trombettamichele | 0:7beba59b8a7d | 61 | arg_data = strtol(&tty_buffer[1], NULL, 16); |
trombettamichele | 0:7beba59b8a7d | 62 | arg_data_in = spi_device.write(arg_data); |
trombettamichele | 0:7beba59b8a7d | 63 | tty_usb.printf("#\tSingle data: OUT: $%02X - IN: $%02X\n\r", arg_data, arg_data_in); |
trombettamichele | 0:7beba59b8a7d | 64 | break; |
trombettamichele | 0:7beba59b8a7d | 65 | case 'C': |
trombettamichele | 0:7beba59b8a7d | 66 | case 'c': |
trombettamichele | 0:7beba59b8a7d | 67 | spi_cs = (tty_buffer[1] == '0') ? 0 : 1; |
trombettamichele | 0:7beba59b8a7d | 68 | break; |
trombettamichele | 0:7beba59b8a7d | 69 | case 'R': |
trombettamichele | 0:7beba59b8a7d | 70 | case 'r': |
trombettamichele | 0:7beba59b8a7d | 71 | arg_size = strtol(&tty_buffer[1], NULL, 16); |
trombettamichele | 0:7beba59b8a7d | 72 | for (int i = 0; i < arg_size; i++) |
trombettamichele | 0:7beba59b8a7d | 73 | tty_usb.printf("#\tReceived data [$%04X]: $%02X\n\r", i, spi_device.write(0x00)); |
trombettamichele | 0:7beba59b8a7d | 74 | break; |
trombettamichele | 0:7beba59b8a7d | 75 | |
trombettamichele | 0:7beba59b8a7d | 76 | case 'F': |
trombettamichele | 0:7beba59b8a7d | 77 | case 'f': |
trombettamichele | 0:7beba59b8a7d | 78 | arg_size = strtol(strchr(tty_buffer, ',')+1, NULL, 16); |
trombettamichele | 0:7beba59b8a7d | 79 | *(strchr(tty_buffer, ',') + 1) = 0x00; |
trombettamichele | 0:7beba59b8a7d | 80 | arg_data = strtol(&tty_buffer[1], NULL, 16); |
trombettamichele | 0:7beba59b8a7d | 81 | |
trombettamichele | 0:7beba59b8a7d | 82 | for (int i = 0; i < arg_size; i++) { |
trombettamichele | 0:7beba59b8a7d | 83 | arg_data_in = spi_device.write(arg_data); |
trombettamichele | 0:7beba59b8a7d | 84 | tty_usb.printf("#\tFlow data [$%04X]: OUT: $%02X - IN: $%02X\n\r", i, arg_data, arg_data_in); |
trombettamichele | 0:7beba59b8a7d | 85 | |
trombettamichele | 0:7beba59b8a7d | 86 | } |
trombettamichele | 0:7beba59b8a7d | 87 | break; |
trombettamichele | 0:7beba59b8a7d | 88 | |
trombettamichele | 0:7beba59b8a7d | 89 | case 'M': |
trombettamichele | 0:7beba59b8a7d | 90 | case 'm': |
trombettamichele | 0:7beba59b8a7d | 91 | arg_ptr = strtok(&tty_buffer[1], ",\n\r"); |
trombettamichele | 0:7beba59b8a7d | 92 | arg_size = 0; |
trombettamichele | 0:7beba59b8a7d | 93 | while (arg_ptr != NULL) { |
trombettamichele | 0:7beba59b8a7d | 94 | arg_data = strtol(arg_ptr, NULL, 16); |
trombettamichele | 0:7beba59b8a7d | 95 | arg_data_in = spi_device.write(arg_data); |
trombettamichele | 0:7beba59b8a7d | 96 | tty_usb.printf("#\tMultiple data [$%04X]: OUT: $%02X - IN: $%02X\n\r", arg_size, arg_data, arg_data_in); |
trombettamichele | 0:7beba59b8a7d | 97 | arg_ptr = strtok(NULL, ",\n\r"); |
trombettamichele | 0:7beba59b8a7d | 98 | arg_size++; |
trombettamichele | 0:7beba59b8a7d | 99 | } |
trombettamichele | 0:7beba59b8a7d | 100 | break; |
trombettamichele | 0:7beba59b8a7d | 101 | |
trombettamichele | 0:7beba59b8a7d | 102 | } |
trombettamichele | 0:7beba59b8a7d | 103 | } |
trombettamichele | 0:7beba59b8a7d | 104 | } |