9,14 → 9,19 |
#include "oled_ssd1306.h" |
#include "oled_ssd1331.h" |
#include "adc.h" |
#include <usart.h> |
#include "xbee.h" |
#include <delays.h> |
#include <string.h> |
|
#pragma config WDTEN = OFF // Turn off watchdog timer |
#pragma config XINST = OFF // Turn off extended instruction set |
#ifdef USE_EXT_OSC |
#pragma config OSC = HSPLL // Use external oscillator (101) |
#pragma config PLLDIV = 3 // Set PPL prescaler to 3 (to get 4MHz) |
#else |
#pragma config OSC = INTOSCPLL // Use internal oscillator |
#pragma config PLLDIV = 2 // Set PPL prescaler to 2 (to get 4MHz) |
#endif |
#pragma config CFGPLLEN = ON // Enable PLL on startup |
#pragma config PLLSEL = PLL96 // Use 96MHz PLL 4MHz -> 96MHz / 2 = 48MHz |
//#pragma config SOSCSEL = HIGH // High Power T1OSC/SOSC circuit selected |
77,7 → 82,7 |
|
while (1) { |
|
length = UART1_Read((char *) buffer); |
length = UART1_Read_Buffer((unsigned char *) buffer); |
if (length != 0) { |
UART1_WriteB((char *) buffer, length); |
} |
249,7 → 254,7 |
NFC_SAMConfig(); |
|
memset(cardData, 0, 24); |
|
|
while (1) { |
|
// // This query will hang until the NFC chip replies (card detected) |
272,6 → 277,26 |
// } |
// } |
|
// // This query will hang until the NFC chip replies (card detected) |
// length = NFC_readPassiveTargetID(cardData); |
// if (length) { |
// DBG_PRINT_MAIN("Cards Found: %u\r\n", length); |
// DBG_PRINT_MAIN("UID Length: %d bytes\r\n", cardData[0].NFCID_LEN); |
// DBG_PRINT_MAIN("UID: "); |
// for (i = 0; i < cardData[0].NFCID_LEN; i++) { |
// DBG_PRINT_MAIN("%02X ", cardData[0].NFCID[i]); |
// } |
// DBG_PRINT_MAIN("\r\n"); |
// if (length == 2) { |
// DBG_PRINT_MAIN("UID Length: %d bytes\r\n", cardData[1].NFCID_LEN); |
// DBG_PRINT_MAIN("UID: "); |
// for (i = 0; i < cardData[1].NFCID_LEN; i++) { |
// DBG_PRINT_MAIN("%02X ", cardData[1].NFCID[i]); |
// } |
// DBG_PRINT_MAIN("\r\n"); |
// } |
// } |
|
// This query will not wait for a detection before responding |
length = NFC_pollTargets(1, 1, cardData); |
if (!length) { |
280,7 → 305,7 |
if (memcmp(&cardData[0].NFCID, &cardData_prev[0].NFCID, cardData[0].NFCID_LEN) == 0) { |
// Do nothing |
} else if (memcmp(&cardData[0].NFCID, &cardData_prev[1].NFCID, cardData[0].NFCID_LEN) == 0) { |
memcpy((char *)&cardData_prev[0], (const char *)&cardData[0], 12); |
memcpy((char *) &cardData_prev[0], (const char *) &cardData[0], 12); |
} else { |
DBG_PRINT_MAIN("UID: "); |
for (i = 0; i < cardData[0].NFCID_LEN; i++) { |
287,7 → 312,7 |
DBG_PRINT_MAIN("%02X ", cardData[0].NFCID[i]); |
} |
DBG_PRINT_MAIN("\r\n"); |
memcpy((char *)&cardData_prev[0], (const char *)&cardData[0], 12); |
memcpy((char *) &cardData_prev[0], (const char *) &cardData[0], 12); |
} |
memset(&cardData_prev[1], 0, 12); |
} else if (length == 2) { |
296,8 → 321,8 |
// Do nothing |
} else if (memcmp(&cardData[0].NFCID, &cardData_prev[1].NFCID, cardData[0].NFCID_LEN) == 0 && |
memcmp(&cardData[1].NFCID, &cardData_prev[0].NFCID, cardData[1].NFCID_LEN) == 0) { |
memcpy((char *)&cardData_prev[0], (const char *)&cardData[0], 12); |
memcpy((char *)&cardData_prev[1], (const char *)&cardData[1], 12); |
memcpy((char *) &cardData_prev[0], (const char *) &cardData[0], 12); |
memcpy((char *) &cardData_prev[1], (const char *) &cardData[1], 12); |
} else if (memcmp(&cardData[0].NFCID, &cardData_prev[0].NFCID, cardData[0].NFCID_LEN) == 0) { |
// First card matched |
DBG_PRINT_MAIN("UID2: "); |
305,7 → 330,7 |
DBG_PRINT_MAIN("%02X ", cardData[1].NFCID[i]); |
} |
DBG_PRINT_MAIN("\r\n"); |
memcpy(&cardData_prev[1], (const char *)&cardData[1], 12); |
memcpy(&cardData_prev[1], (const char *) &cardData[1], 12); |
} else if (memcmp(&cardData[1].NFCID, &cardData_prev[1].NFCID, cardData[1].NFCID_LEN) == 0) { |
// Second card matched |
DBG_PRINT_MAIN("UID1: "); |
313,7 → 338,7 |
DBG_PRINT_MAIN("%02X ", cardData[0].NFCID[i]); |
} |
DBG_PRINT_MAIN("\r\n"); |
memcpy((char *)&cardData_prev[0], (const char *)&cardData[0], 12); |
memcpy((char *) &cardData_prev[0], (const char *) &cardData[0], 12); |
} else { |
// No match |
DBG_PRINT_MAIN("UID1: "); |
321,13 → 346,13 |
DBG_PRINT_MAIN("%02X ", cardData[0].NFCID[i]); |
} |
DBG_PRINT_MAIN("\r\n"); |
memcpy((char *)&cardData_prev[0], (const char *)&cardData[0], 12); |
memcpy((char *) &cardData_prev[0], (const char *) &cardData[0], 12); |
DBG_PRINT_MAIN("UID2: "); |
for (i = 0; i < cardData[1].NFCID_LEN; i++) { |
DBG_PRINT_MAIN("%02X ", cardData[1].NFCID[i]); |
} |
DBG_PRINT_MAIN("\r\n"); |
memcpy((char *)&cardData_prev[1], &cardData[1], 12); |
memcpy((char *) &cardData_prev[1], (const char *) &cardData[1], 12); |
} |
} |
} |
732,7 → 757,7 |
|
while (1) { |
// ADC read from AN0-AN2 and prints to display |
ADC_Start(ADC_CHANNEL_AN0); |
ADC_Start(ADC_CHANNEL_AN2); |
GFX_fillRect(0, 0, GFX_width(), 8, SSD1331_BLACK); |
GFX_setCursor(0, 0); |
while (!ADC_Get_Result(&x)); |
744,7 → 769,7 |
while (!ADC_Get_Result(&y)); |
GFX_writeString("Y: %u", y); |
|
ADC_Start(ADC_CHANNEL_AN2); |
ADC_Start(ADC_CHANNEL_AN0); |
GFX_fillRect(0, 16, GFX_width(), 8, SSD1331_BLACK); |
GFX_setCursor(0, 16); |
while (!ADC_Get_Result(&z)); |
754,16 → 779,136 |
|
#endif |
|
#ifdef _TEST_XBEE |
|
void main(void) { |
unsigned int i, length = 0; |
unsigned char buffer[100]; |
|
XBEE_RX_DATA_PACKET_FRAME *rx_data_frame; |
|
/* --------------------- Oscillator Configuration --------------------- */ |
// OSCTUNEbits.PLLEN = 1; // Enable 4x PLL |
OSCCONbits.IRCF = 0b111; // Set INTOSC postscaler to 8MHz |
OSCCONbits.SCS = 0b00; // Use 96MHz PLL as primary clock source |
/* -------------------------------------------------------------------- */ |
|
// Set all ports as digial I/O |
ANCON0 = 0xFF; |
ANCON1 = 0x1F; |
|
UART1_Init(); // Initialize the UART handler code |
XBee_Init(); |
|
interrupt_enable(); // Enable high-priority interrupts and low-priority interrupts |
interrupt_init(); // Initialize the interrupt priorities |
|
DBG_PRINT_MAIN("\r\nBegin Program\r\n"); |
|
while (1) { |
|
//#define _ROUTER |
#define _COORDINATOR |
|
#ifdef _ROUTER |
XBEE_TX_DATA_PACKET_FRAME *tx_data_frame; |
tx_data_frame = (void *) buffer; |
tx_data_frame->frame_type = XBEE_TX_DATA_PACKET; |
tx_data_frame->frame_id = 1; |
tx_data_frame->destination_64.UPPER_32.long_value = 0x00000000; |
tx_data_frame->destination_64.LOWER_32.long_value = 0x00000000; |
tx_data_frame->destination_16.INT_16.int_value = 0xFEFF; |
tx_data_frame->broadcast_radius = 0; |
tx_data_frame->options = 0; |
tx_data_frame->data[0] = 0x54; |
tx_data_frame->data[1] = 0x78; |
tx_data_frame->data[2] = 0x32; |
tx_data_frame->data[3] = 0x43; |
tx_data_frame->data[4] = 0x6F; |
tx_data_frame->data[5] = 0x6F; |
tx_data_frame->data[6] = 0x72; |
tx_data_frame->data[7] = 0x11; |
XBee_Process_Transmit_Frame(buffer, XBEE_TX_DATA_PACKET_FRAME_SIZE + 8); |
|
Delay10KTCYx(255); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
Delay10KTCYx(255); |
#endif |
|
#ifdef _COORDINATOR |
length = XBee_Get_Received_Frame(buffer); |
if (length != 0) { |
switch (*(unsigned char *) buffer) { |
case XBEE_RX_AT_COMMAND_RESPONSE: |
DBG_PRINT_MAIN("XBEE: parsing recieved AT command response frame\r\n"); |
break; |
case XBEE_RX_DATA_PACKET: |
rx_data_frame = (void *)buffer; |
DBG_PRINT_MAIN("XBEE: parsing recieved data recieved frame\r\n"); |
XBee_ConvertEndian64(&(rx_data_frame->source_64)); |
XBee_ConvertEndian16(&(rx_data_frame->source_16)); |
DBG_PRINT_MAIN("Source 64: %08lX %08lX Source 16: %04X Options: %X\r\n", \\ |
rx_data_frame->source_64.UPPER_32.long_value, \\ |
rx_data_frame->source_64.LOWER_32.long_value, \\ |
rx_data_frame->source_16.INT_16.int_value, \\ |
rx_data_frame->recieve_options); |
DBG_PRINT_MAIN("Data: "); |
for (i = 0; i < length - XBEE_RX_DATA_PACKET_FRAME_SIZE; i++) { |
DBG_PRINT_MAIN("%02X ", rx_data_frame->data[i]); |
} |
DBG_PRINT_MAIN("\r\n"); |
break; |
case XBEE_RX_DATA_TX_STATUS: |
DBG_PRINT_MAIN("XBEE: parsing recieved TX status frame\r\n"); |
break; |
case XBEE_RX_IO_DATA_SAMPLE: |
DBG_PRINT_MAIN("XBEE: parsing recieved IO data sample frame\r\n"); |
break; |
case XBEE_RX_EXPLICIT_COMMAND: |
DBG_PRINT_MAIN("XBEE: parsing recieved explicit command frame\r\n"); |
break; |
case XBEE_RX_REMOTE_AT_COMMAND_RESPONSE: |
DBG_PRINT_MAIN("XBEE: parsing recieved remote AT command frame\r\n"); |
break; |
case XBEE_RX_ROUTE_RECORD: |
DBG_PRINT_MAIN("XBEE: parsing recieved route record frame\r\n"); |
break; |
case XBEE_RX_NODE_IDENTIFICATION: |
DBG_PRINT_MAIN("XBEE: parsing recieved node identification frame\r\n"); |
break; |
case XBEE_RX_FRAME_MODEM_STATUS: |
DBG_PRINT_MAIN("XBEE: parsing recieved modem status frame\r\n"); |
break; |
default: |
DBG_PRINT_MAIN("??\r\n"); |
break; |
} |
} |
#endif |
|
} |
} |
#endif |
|
#if !defined(_TEST_UART) && !defined(_TEST_I2C_MASTER) && \ |
!defined(_TEST_I2C_SLAVE) && !defined(_TEST_SPI) && \ |
!defined(_TEST_NFC) && !defined(_TEST_LED_BACKPACK) && \ |
!defined(_TEST_SSD1306_OLED) && !defined(_TEST_SSD1331_OLED) && \ |
!defined(_TEST_ADC) |
!defined(_TEST_ADC) && !defined(_TEST_XBEE) |
|
void main(void) { |
unsigned char length = 0; |
unsigned char buffer[60]; |
|
// NFC stuff |
NFC_FIRMWARE_VERSION version; |
NFC_TargetDataMiFare cardData[2]; |
NFC_TargetDataMiFare cardData_prev[2]; |
|
/* --------------------- Oscillator Configuration --------------------- */ |
// OSCTUNEbits.PLLEN = 1; // Enable 4x PLL |
OSCCONbits.IRCF = 0b111; // Set INTOSC postscaler to 8MHz |
774,15 → 919,14 |
ANCON0 = 0xF8; |
ANCON1 = 0x1F; |
|
UART1_Init(); // Initialize the UART handler code |
I2C_Init(); // Initialize the I2C handler code |
SPI2_Init(SPI2_FOSC_8); // Initialize the SPI module |
SSD1331_Init(); // Initialize the SSD1331 OLED display (uses SPI2) |
// NFC_Init(); // Initialize the NFC chip (uses I2C) |
LED_Init(); // Initialize the LED backpack (uses I2C) |
UART1_Init(); |
I2C_Init(); |
NFC_Init(); |
SPI2_Init(SPI2_FOSC_8); |
SSD1331_Init(); |
|
I2C_Configure_Master(I2C_400KHZ); |
|
|
interrupt_enable(); // Enable high-priority interrupts and low-priority interrupts |
interrupt_init(); // Initialize the interrupt priorities |
|
789,20 → 933,60 |
DBG_PRINT_MAIN("\r\nBegin Program\r\n"); |
|
SSD1331_Begin(); |
LED_Start(); |
|
memset(buffer, 0, 60); |
memset(cardData, 0, 24); |
memset(cardData_prev, 0, 24); |
GFX_clearScreen(); |
GFX_setRotation(3); |
GFX_setRotation(0); |
GFX_setCursor(0, 0); |
|
version = NFC_getFirmwareVersion(); |
while (!version.IC) { |
GFX_appendString("Waiting for NFC board..\r"); |
Delay10KTCYx(3); |
version = NFC_getFirmwareVersion(); |
} |
GFX_appendString("PN5%X Ver. %d.%d\r", version.IC, version.Ver, version.Rev); |
NFC_SAMConfig(); |
|
while (1) { |
|
// Reads input from UART and prints to display |
length = UART1_Read_Buffer(buffer); |
if (length != 0) { |
buffer[length] = 0; |
GFX_appendString("%s", buffer); |
LED_writeNum(length-1); |
// This query will not wait for a detection before responding |
length = NFC_pollTargets(1, 1, cardData); |
if (!length) { |
memset(cardData_prev, 0, 24); |
} else if (length == 1) { |
if (memcmp(&cardData[0].NFCID, &cardData_prev[0].NFCID, cardData[0].NFCID_LEN) == 0) { |
// Do nothing |
} else if (memcmp(&cardData[0].NFCID, &cardData_prev[1].NFCID, cardData[0].NFCID_LEN) == 0) { |
memcpy((char *) &cardData_prev[0], (const char *) &cardData[0], 12); |
} else { |
GFX_appendString("UID: %02X %02X %02X %02X\n", cardData[0].NFCID[0], cardData[0].NFCID[1], cardData[0].NFCID[2], cardData[0].NFCID[3]); |
memcpy((char *) &cardData_prev[0], (const char *) &cardData[0], 12); |
} |
memset(&cardData_prev[1], 0, 12); |
} else if (length == 2) { |
if (memcmp(&cardData[0].NFCID, &cardData_prev[0].NFCID, cardData[0].NFCID_LEN) == 0 && |
memcmp(&cardData[1].NFCID, &cardData_prev[1].NFCID, cardData[1].NFCID_LEN) == 0) { |
// Do nothing |
} else if (memcmp(&cardData[0].NFCID, &cardData_prev[1].NFCID, cardData[0].NFCID_LEN) == 0 && |
memcmp(&cardData[1].NFCID, &cardData_prev[0].NFCID, cardData[1].NFCID_LEN) == 0) { |
memcpy((char *) &cardData_prev[0], (const char *) &cardData[0], 12); |
memcpy((char *) &cardData_prev[1], (const char *) &cardData[1], 12); |
} else if (memcmp(&cardData[0].NFCID, &cardData_prev[0].NFCID, cardData[0].NFCID_LEN) == 0) { |
// First card matched |
GFX_appendString("UID: %02X %02X %02X %02X\n", cardData[1].NFCID[0], cardData[1].NFCID[1], cardData[1].NFCID[2], cardData[1].NFCID[3]); |
memcpy(&cardData_prev[1], (const char *) &cardData[1], 12); |
} else if (memcmp(&cardData[1].NFCID, &cardData_prev[1].NFCID, cardData[1].NFCID_LEN) == 0) { |
// Second card matched |
GFX_appendString("UID: %02X %02X %02X %02X\n", cardData[0].NFCID[0], cardData[0].NFCID[1], cardData[0].NFCID[2], cardData[0].NFCID[3]); |
memcpy((char *) &cardData_prev[0], (const char *) &cardData[0], 12); |
} else { |
// No match |
GFX_appendString("UID: %02X %02X %02X %02X\n", cardData[0].NFCID[0], cardData[0].NFCID[1], cardData[0].NFCID[2], cardData[0].NFCID[3]); |
memcpy((char *) &cardData_prev[0], (const char *) &cardData[0], 12); |
GFX_appendString("UID: %02X %02X %02X %02X\n", cardData[1].NFCID[0], cardData[1].NFCID[1], cardData[1].NFCID[2], cardData[1].NFCID[3]); |
memcpy((char *) &cardData_prev[1], (const char *) &cardData[1], 12); |
} |
} |
} |
} |