⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hplmsp430usart0p.nc

📁 tinyos2.0版本驱动
💻 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 + -