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.
Dependencies: MODSERIAL USBDevice_for_Rev_C_HW mbed
Fork of mbed_sv_firmware_with_init by
Diff: main.cpp
- Revision:
- 0:8604e9cc07f2
- Child:
- 1:bd988d267998
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Jan 19 23:16:50 2015 +0000 @@ -0,0 +1,215 @@ +#include "mbed.h" +#include "USBSerial.h" +#include "MODSERIAL.h" +#include "InterruptIn.h" + +// Constants +#define LEDON 0 // Low active for LEDs - turns LED on +#define LEDOFF 1 // Low active for LEDs - turns LED off +#define TRUE 1 +#define FALSE 0 + + +// Error return values +#define ERR_NONE 0 // Success +#define ERR_CDC_BAD_CMD 1 +#define ERR_CDC_NO_TX_ENDMARK 2 +#define ERR_UART_NOT_WRITEABLE 3 // UART has no buffer space +#define ERR_UART_NO_TX_ENDMARK 4 // message for UART has no 0x7E end-mark +#define ERR_UART_NO_RX_ENDMARK 5 // message received from UART has no end-mark + + +// I2C addresses +#define PROX (0x29 << 1) // default I2C address of VL6180X, shift into upper 7 bits +#define EEPROM (0xA0) // default I2C address of EEPROM, already shifted + +// UART-RFID baud rate +#define RFIDBAUD 115200 // RFID-FE board default rate = 115.2Kbps + +// Peripherals +USBSerial cdc; // CDC Class USB<>Serial adapter. Needs custom INF, but uses existing Windows drivers. +MODSERIAL uart(PTA2, PTA1); // UART port connected to RFID-FE board +I2C i2c(PTB1, PTB0); // I2C port connected to VL6180X and EEPROM - note addresses above) + +// GPIO signals +DigitalOut led_err(PTC1); // Red LED shows error condition (active low) +DigitalOut led_com(PTC2); // Yellow LED shows communication activity (active low) +DigitalOut rfid_int(PTD4); // RFID FE power control (active high) +DigitalOut rfid_isp(PTD5); // RFID FE In-System Programming (active high) +DigitalOut rfid_rst(PTD6); // RFID FE Reset (active high) +DigitalOut rfid_pwr(PTE30); // RFID power switch on USB board (active high for prototype 1, low for all others) +DigitalIn rfid_hot(PTE0); // RFID over-current detection on USB board power switch (active low) +InterruptIn prox_int(PTD7); // Proximity sensor interrupt (active low) + +// buffers & variables +uint8_t cdc_buffer_rx[32]; // buffers for cdc (USB-Serial port on PC) +uint8_t cdc_buffer_tx[32]; +uint8_t uart_buffer_rx[32]; // buffers for uart (RFID-FE board) +uint8_t uart_buffer_tx[32]; +int i, j; // index variables +int status = 0x00; // return value + +int prox_irq(void) +{ + return 0; +} + +int init_periph(void) +{ + // Set up peripherals + // RFID + uart.baud(RFIDBAUD); // RFID-FE baud rate + + rfid_int = 0; // RFID FE power control (active high) + rfid_isp = 0; // RFID FE In-System Programming (active high) + rfid_rst = 1; // RFID FE Reset (active high) + rfid_pwr = 1; // RFID power switch on USB board (active high for prototype 1, low for all others) + wait(0.25); // wait 1/4 second before... + rfid_rst = 0; // ... taking RFID out of reset + + // Prox + return 0; +} + +int rfid_msg(void) +{ + bool end_mark = FALSE; + int i; + uint8_t crcCount = sizeof(uart_buffer_tx); // use tx buffer size to start + + uart.txBufferFlush(); // clear out UART buffers + uart.rxBufferFlush(); + + for (int i = 0; i < sizeof(uart_buffer_tx); i++) + { + if (!uart.writeable()) return ERR_UART_NOT_WRITEABLE; // if no space in uart, return error + uart.putc(uart_buffer_tx[i]); // send uart message + + if (uart_buffer_tx[i] == 0x7E) // check for rfid end mark in outbound message + { + crcCount = 2; // two more bytes for CRC + end_mark = TRUE; // end mark was reached + } + if (crcCount-- == 0) // end of message + { + if (end_mark == FALSE) return ERR_UART_NO_TX_ENDMARK; // no end mark detected + break; + } + } + + end_mark = FALSE; + wait(0.5); + while(!uart.readable()) printf("."); // wait for data from rfid + crcCount = sizeof(uart_buffer_rx); // use rx buffer size to start + for (i = 0; i < sizeof(uart_buffer_rx); i++) + { + uart_buffer_rx[i] = uart.getc(); // read a character +// cdc.printf("%d, 0x%X\n\r", i, uart_buffer_rx[i]); // debug + + if (uart_buffer_rx[i] == 0x7E) // check for rfid end mark in inbound message + { + crcCount = 2; // two more bytes for crc + end_mark = TRUE; // end mark was reached + } + if (crcCount-- == 0) // end of message + { + if (end_mark == FALSE) return ERR_UART_NO_RX_ENDMARK; + break; + } + } + return ERR_NONE; +} + + +int prox_msg() +{ + return ERR_NONE; +} + +int gpio_msg() +{ + return ERR_NONE; +} + +int eeprom_msg() // eeprom to be implemented along with next hardware prototype +{ + return ERR_NONE; +} + +int main() +{ + // initialize everything + + wait(3.0); + init_periph(); + + cdc.printf("Starting...\n\r"); + + //while(!cdc.readable()); // spin here until a message comes in from the host PC + bool end_mark = FALSE; + uint8_t crcCount = sizeof(cdc_buffer_rx); // use tx buffer size to start + cdc.printf("\n\rCDC Input: "); + for (i = 0; i < sizeof(cdc_buffer_rx); i++) + { + //cdc_buffer_rx[i] = cdc.getc(); // + + cdc.printf("%X, ",cdc_buffer_rx[i]); + + if (cdc_buffer_rx[i] == 0x7E) // check for rfid end mark in outbound message + { + crcCount = 2; // two more bytes for CRC + end_mark = TRUE; // end mark was reached + } + if (crcCount-- == 0) // end of message + { + if (end_mark == FALSE) return ERR_UART_NO_TX_ENDMARK; // no end mark detected + break; + } + } + + switch(cdc_buffer_rx[0]) + { + case 0xBB: // RFID-FE + for (i = 0; i < sizeof(cdc_buffer_rx); i++) + { + uart_buffer_tx[i] = cdc_buffer_rx[i]; // copy USB message to UART for RFID + } + + status = rfid_msg(); // send buffer to RFID and get response according to RFID board + + for (i = 0; i < sizeof(cdc_buffer_tx); i++) + { + cdc_buffer_tx[i] = uart_buffer_rx[i]; // copy RFID response back to USB buffer + } + + cdc.printf("\n\rRFID Response: "); + + for (i = 0; i < sizeof(cdc_buffer_tx); i++) + { + cdc.printf("%x, ", cdc_buffer_tx[i]); // send message back to PC + + if (cdc_buffer_tx[i] == 0x7E) // check for rfid end mark in outbound message + { + crcCount = 2; // two more bytes for CRC + end_mark = TRUE; // end mark was reached + } + if (crcCount-- == 0) // end of message + { + if (end_mark == FALSE) return ERR_CDC_NO_TX_ENDMARK; // no end mark detected + break; + } + } + break; + case 0xCC: // Proximity Sensor + prox_msg(); + break; + case 0xDD: // GPIO (LEDs and RFID-FE control + gpio_msg(); + break; + case 0xEE: // Read/write EEPROM + eeprom_msg(); + break; + default: + return ERR_CDC_BAD_CMD; + } +}