📄 hplmsp430usart0p.nc
字号:
/** * Copyright (c) 2005-2006 Arched Rock Corporation * 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 the Arched Rock Corporation 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 * ARCHED ROCK OR ITS 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 (c) 2004-2005, Technische Universitaet Berlin * 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 the Technische Universitaet Berlin 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. */#include "msp430usart.h"/** * Implementation of USART0 lowlevel functionality - stateless. * Setting a mode will by default disable USART-Interrupts. * * @author: Jan Hauer <hauer@tkn.tu-berlin.de> * @author: Jonathan Hui <jhui@archedrock.com> * @author: Vlado Handziski <handzisk@tkn.tu-berlin.de> * @author: Joe Polastre * @author: Philipp Huppertz <huppertz@tkn.tu-berlin.de> * @version $Revision: 1.1 $ $Date: 2008/06/12 14:02:25 $ */module HplMsp430Usart0P { provides interface HplMsp430Usart as Usart; provides interface HplMsp430UsartInterrupts as Interrupts; provides interface HplMsp430I2CInterrupts as I2CInterrupts; uses interface HplMsp430I2C as HplI2C; uses interface HplMsp430GeneralIO as SIMO; uses interface HplMsp430GeneralIO as SOMI; uses interface HplMsp430GeneralIO as UCLK; uses interface HplMsp430GeneralIO as URXD; uses interface HplMsp430GeneralIO as UTXD; uses interface PlatformInterrupt;}implementation{ MSP430REG_NORACE(IE1); MSP430REG_NORACE(ME1); MSP430REG_NORACE(IFG1); MSP430REG_NORACE(U0TCTL); MSP430REG_NORACE(U0RCTL); MSP430REG_NORACE(U0TXBUF); TOSH_SIGNAL(UART0RX_VECTOR) { uint8_t temp = U0RXBUF; signal Interrupts.rxDone(temp); call PlatformInterrupt.postAmble(); } TOSH_SIGNAL(UART0TX_VECTOR) { if ( call HplI2C.isI2C() ) signal I2CInterrupts.fired(); else signal Interrupts.txDone(); call PlatformInterrupt.postAmble(); } async command void Usart.setUctl(msp430_uctl_t control) { U0CTL=uctl2int(control); } async command msp430_uctl_t Usart.getUctl() { return int2uctl(U0CTL); } async command void Usart.setUtctl(msp430_utctl_t control) { U0TCTL=utctl2int(control); } async command msp430_utctl_t Usart.getUtctl() { return int2utctl(U0TCTL); } async command void Usart.setUrctl(msp430_urctl_t control) { U0RCTL=urctl2int(control); } async command msp430_urctl_t Usart.getUrctl() { return int2urctl(U0RCTL); } async command void Usart.setUbr(uint16_t control) { atomic { U0BR0 = control & 0x00FF; U0BR1 = (control >> 8) & 0x00FF; } } async command uint16_t Usart.getUbr() { return (U0BR1 << 8) + U0BR0; } async command void Usart.setUmctl(uint8_t control) { U0MCTL=control; } async command uint8_t Usart.getUmctl() { return U0MCTL; } async command void Usart.resetUsart(bool reset) { if (reset) { U0CTL = SWRST; } else { CLR_FLAG(U0CTL, SWRST); } } async command bool Usart.isSpi() { atomic { return (U0CTL & SYNC) && (ME1 & USPIE0); } } async command bool Usart.isUart() { atomic { return !(U0CTL & SYNC) && ((ME1 & UTXE0) && (ME1 & URXE0)); } } async command bool Usart.isUartTx() { atomic { return !(U0CTL & SYNC) && (ME1 & UTXE0); } } async command bool Usart.isUartRx() { atomic { return !(U0CTL & SYNC) && (ME1 & URXE0); } } async command msp430_usartmode_t Usart.getMode() { if (call Usart.isUart()) return USART_UART; else if (call Usart.isUartRx()) return USART_UART_RX; else if (call Usart.isUartTx()) return USART_UART_TX; else if (call Usart.isSpi()) return USART_SPI; else if (call HplI2C.isI2C()) return USART_I2C; else return USART_NONE; } async command void Usart.enableUart() { atomic{ call UTXD.selectModuleFunc(); call URXD.selectModuleFunc(); } ME1 |= (UTXE0 | URXE0); // USART0 UART module enable } async command void Usart.disableUart() { atomic { ME1 &= ~(UTXE0 | URXE0); // USART0 UART module enable call UTXD.selectIOFunc(); call URXD.selectIOFunc(); } } async command void Usart.enableUartTx() { call UTXD.selectModuleFunc(); ME1 |= UTXE0; // USART0 UART Tx module enable } async command void Usart.disableUartTx() { ME1 &= ~UTXE0; // USART0 UART Tx module enable call UTXD.selectIOFunc(); } async command void Usart.enableUartRx() { call URXD.selectModuleFunc(); ME1 |= URXE0; // USART0 UART Rx module enable } async command void Usart.disableUartRx() { ME1 &= ~URXE0; // USART0 UART Rx module disable call URXD.selectIOFunc(); } async command void Usart.enableSpi() { atomic { call SIMO.selectModuleFunc(); call SOMI.selectModuleFunc(); call UCLK.selectModuleFunc(); } ME1 |= USPIE0; // USART0 SPI module enable } async command void Usart.disableSpi() { atomic { ME1 &= ~USPIE0; // USART0 SPI module disable call SIMO.selectIOFunc(); call SOMI.selectIOFunc(); call UCLK.selectIOFunc(); } } void configSpi(msp430_spi_union_config_t* config) { // U0CTL = (config->spiRegisters.uctl & ~I2C) | SYNC | SWRST; U0CTL = (config->spiRegisters.uctl) | SYNC | SWRST; U0TCTL = config->spiRegisters.utctl; call Usart.setUbr(config->spiRegisters.ubr); call Usart.setUmctl(0x00); } async command void Usart.setModeSpi(msp430_spi_union_config_t* config) { atomic { call Usart.resetUsart(TRUE); call HplI2C.clearModeI2C(); call Usart.disableUart(); configSpi(config); call Usart.enableSpi(); call Usart.resetUsart(FALSE); call Usart.clrIntr(); call Usart.disableIntr(); } return; } void configUart(msp430_uart_union_config_t* config) { U0CTL = (config->uartRegisters.uctl & ~SYNC) | SWRST; U0TCTL = config->uartRegisters.utctl; U0RCTL = config->uartRegisters.urctl; call Usart.setUbr(config->uartRegisters.ubr); call Usart.setUmctl(config->uartRegisters.umctl); } async command void Usart.setModeUart(msp430_uart_union_config_t* config) { atomic { call Usart.resetUsart(TRUE); call HplI2C.clearModeI2C(); call Usart.disableSpi(); configUart(config); if ((config->uartConfig.utxe == 1) && (config->uartConfig.urxe == 1)) { call Usart.enableUart(); } else if ((config->uartConfig.utxe == 0) && (config->uartConfig.urxe == 1)) { call Usart.disableUartTx(); call Usart.enableUartRx(); } else if ((config->uartConfig.utxe == 1) && (config->uartConfig.urxe == 0)){ call Usart.disableUartRx(); call Usart.enableUartTx(); } else { call Usart.disableUart(); } call Usart.resetUsart(FALSE); call Usart.clrIntr(); call Usart.disableIntr(); } return; } async command bool Usart.isTxIntrPending(){ if (IFG1 & UTXIFG0){ return TRUE; } return FALSE; } async command bool Usart.isTxEmpty(){ if (U0TCTL & TXEPT) { return TRUE; } return FALSE; } async command bool Usart.isRxIntrPending(){ if (IFG1 & URXIFG0){ return TRUE; } return FALSE; } async command void Usart.clrTxIntr(){ IFG1 &= ~UTXIFG0; } async command void Usart.clrRxIntr() { IFG1 &= ~URXIFG0; } async command void Usart.clrIntr() { IFG1 &= ~(UTXIFG0 | URXIFG0); } async command void Usart.disableRxIntr() { IE1 &= ~URXIE0; } async command void Usart.disableTxIntr() { IE1 &= ~UTXIE0; } async command void Usart.disableIntr() { IE1 &= ~(UTXIE0 | URXIE0); } async command void Usart.enableRxIntr() { atomic { IFG1 &= ~URXIFG0; IE1 |= URXIE0; } } async command void Usart.enableTxIntr() { atomic { IFG1 &= ~UTXIFG0; IE1 |= UTXIE0; } } async command void Usart.enableIntr() { atomic { IFG1 &= ~(UTXIFG0 | URXIFG0); IE1 |= (UTXIE0 | URXIE0); } } async command void Usart.tx(uint8_t data) { atomic U0TXBUF = data; } async command uint8_t Usart.rx() { uint8_t value; atomic value = U0RXBUF; return value; } default async event void I2CInterrupts.fired() {} default async command bool HplI2C.isI2C() { return FALSE; } default async command void HplI2C.clearModeI2C() {}; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -