You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

218 lines
6.4 KiB

/* --COPYRIGHT--,BSD
* Copyright (c) 2013, Texas Instruments Incorporated
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of Texas Instruments Incorporated nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --/COPYRIGHT--*/
//*****************************************************************************
//
//! TouchProGUI.c
//
//! TouchProGUI enables interrupt-driven UART communication
//! to the Touch Pro GUI platform tool. The protocol is defined in
//! SLAU486 (The TouchPro GUI User's Guide).
//! The baud rate is fixed at 9600B.
//
//! Resources: UCA0 in UART Mode, USCIAB0TX_VECTOR
//! - UCA0 BR and MOD settings need to be placed in the header file for the
//! to provide 9600B with a given input clock.
//
//! \author Texas Instruments
//! \author MSP430 Strategic Applications
//
//! \version 1.0 - W. Schnoor, 1/7/14: Initial Release
//
//*****************************************************************************
#include "TouchProGUI.h"
uint8_t g_ui8TouchProGUITXBuffer[TOUCHPROGUI_BUFFER_LENGTH] = { TOUCHPROGUI_SYNC_UPPER, TOUCHPROGUI_SYNC_LOWER };
uint8_t g_ui8TouchProGUITXLength = 0;
//*****************************************************************************
//
//! TouchProGUI_init()
//! This API will configure the USCI UCA0 in UART mode based upon the
//! definitions UART_BR_LOWER, UART_BR_UPPER, and UART_MOD.
//
//! /param none.
//! /return none.
//
//*****************************************************************************
void TouchProGUI_init(void)
{
//
// Configure Pin for UART Transmit Functionality
//
P1SEL |= BIT2;
P1SEL2 |= BIT2;
//
// Configure USCIA0 UART based upon header file definitions
//
UCA0CTL1 |= UCSSEL_2;
UCA0BR0 = UART_BR_LOWER;
UCA0BR1 = UART_BR_UPPER;
UCA0MCTL = UART_MOD;
//
// Release State Machine Reset
//
UCA0CTL1 &= ~UCSWRST;
}
//*****************************************************************************
//
//! TouchProGUI_sendData(uint16_t *ui16DataBuffer, uint8_t ui8Length)
//! This API will send a set of data to TouchPro GUI.
//
//! /param ui16DataBuffer is a pointer to the data array to send.
//! /param ui8Length specifies how many words in the ui16DataBuffer array
//! that there are to be sent.
//! /return none.
//
//*****************************************************************************
void TouchProGUI_sendData(uint16_t *ui16DataBuffer, uint8_t ui8Length)
{
uint8_t *pTxBuffer;
uint8_t ui8CurrentChannel;
uint8_t ui8Checksum;
//
// Check to make sure the user is not trying to send more channels
// than the buffer or TouchPro GUI supprt
//
if (ui8Length > TOUCHPROGUI_MAX_CHANNELS)
{
ui8Length = TOUCHPROGUI_MAX_CHANNELS;
}
//
// Start buffer pointer at position 2 (since positions 0 and 1
// are utilized for the sync word and are not to be altered).
// NOTE: The check sum includes sync word.
//
pTxBuffer = &g_ui8TouchProGUITXBuffer[2];
ui8Checksum = TOUCHPROGUI_SYNC_UPPER + TOUCHPROGUI_SYNC_LOWER;
//
// Calculate packet length (without sync word) in bytes
// = (Length * 3) + 1
//
g_ui8TouchProGUITXLength = ui8Length * 3 + 1;
*(pTxBuffer++) = g_ui8TouchProGUITXLength;
ui8Checksum += g_ui8TouchProGUITXLength;
//
// Fill buffer with each channel's data
//
for (ui8CurrentChannel = 0; ui8CurrentChannel < ui8Length; ui8CurrentChannel++)
{
//
// Channel Number
//
*pTxBuffer = (uint8_t)ui8CurrentChannel;
ui8Checksum += *(pTxBuffer++);
//
// Channel Data Upper Byte
//
*pTxBuffer = (uint8_t)(ui16DataBuffer[ui8CurrentChannel] >> 8);
ui8Checksum += *(pTxBuffer++);
//
// Channel Data Lower Byte
//
*pTxBuffer = (uint8_t)ui16DataBuffer[ui8CurrentChannel];
ui8Checksum += *(pTxBuffer++);
}
//
// Add checksum to buffer
//
*pTxBuffer = ui8Checksum;
//
// Increase packet length by three to include the sync word (0x55AA)
// and length byte
//
g_ui8TouchProGUITXLength += 3;
//
// Start USCI_A0 transmit interrupt to
// send the data via the USCI_A0 peripheral
//
IE2 |= UCA0TXIE;
//
// Go to LPM0 for completion of byte transmission
//
LPM0;
//
// If revived from LPMx, ensure packet got sent
// before continuing
//
if (g_ui8TouchProGUITXLength != 0)
{
LPM0;
}
else
{
return;
}
}
//*****************************************************************************
//
//! USCIAB0TX_VECTOR
//
//*****************************************************************************
#pragma vector=USCIAB0TX_VECTOR
__interrupt void USCI_ISR(void)
{
static uint8_t g_ui8CurrentByteIndex = 0;
//
// Send the next byte in the transmit buffer
//
UCA0TXBUF = g_ui8TouchProGUITXBuffer[g_ui8CurrentByteIndex++];
//
// If sending the last byte, clear interrupt enable, reset byte
// counters, and wake back to application from LPMx.
//
if (g_ui8CurrentByteIndex == g_ui8TouchProGUITXLength)
{
g_ui8CurrentByteIndex = 0;
g_ui8TouchProGUITXLength = 0;
IE2 &= ~UCA0TXIE;
LPM3_EXIT;
}
}