|
|
- /* --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;
- }
- }
|