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
Revision 0:8604e9cc07f2, committed 2015-01-19
- Comitter:
- bob_tpc
- Date:
- Mon Jan 19 23:16:50 2015 +0000
- Child:
- 1:bd988d267998
- Commit message:
- USB-RFID Firmware
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MODSERIAL.lib Mon Jan 19 23:16:50 2015 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/Sissors/code/MODSERIAL/#a04506a9a55b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice.lib Mon Jan 19 23:16:50 2015 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/USBDevice/#3b1c43ac045c
--- /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;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-rtos.lib Mon Jan 19 23:16:50 2015 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed-rtos/#9387d4c49609
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Mon Jan 19 23:16:50 2015 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/4fc01daae5a5 \ No newline at end of file
