?? softuart.c
字號:
/****************************************************************************\
文件名:softuart.c
描述:軟件模擬異步串口通訊模塊。
利用定時器A的比較/捕獲功能軟件模擬異步串口通訊,RXD:P2.2,TXD:P1.1。
數據格式:1個起始位,8個數據位,1個停止位。接收/發送時低位在前
波特率:2400bit/s 半雙工。
可以通過查詢方式確定是否有數據被收到或者發送完畢。
原始資料來自TI公司。
版本:1.0 2005-2-20
\****************************************************************************/
#include <MSP430x14x.h>
#include "softuart.h"
#define TXDSEL P1SEL
#define TXDDIR P1DIR
#define RXDSEL P2SEL
#define SF_TXD BIT1
#define SF_RXD BIT2
#define NEXT_TIME 14 //一位數據的時間,427us,約 2341bit/s
#define NEXT_TIME_H 6 //大約半位數據的時間,在此時間讀RXD的數據
#define DATA_WEI_RX 8
#define DATA_WEI_TX 10
unsigned char CntWei; //接收或者發送的位數計數器
unsigned char RxBuf; //接收緩沖器
unsigned int TxBuf; //發送緩沖器
unsigned char bRTx=0; //1:發送完或收到一個字節 0:沒有收到或沒發送完
/*****************************************************************************
初始化
*****************************************************************************/
void InitSfUart()
{
TACTL |= TASSEL_1+ MC_2+TACLR;//定時器A,時鐘源:ACLK,連續計數模式
CCTL0 |= OUTMOD_1; //TXD空閑時輸出1
TXDSEL |= SF_TXD; //選擇P1.1使用第二功能
TXDDIR |= SF_TXD; //選擇P1.1為輸出模式
RXDSEL |= SF_RXD; //選擇P2.2使用第二功能
}
/****************************************************************************
進入接收狀態
****************************************************************************/
void InitRxd()
{
CntWei=DATA_WEI_RX;
CCTL0 = CCIS_1+OUTMOD_1+CM_2+CAP+CCIE; //選擇下降沿捕獲,CCIB(P2.2)
//為信號源,捕獲中斷允許
}
/****************************************************************************
發送數據
tx0:要發送的數據
****************************************************************************/
void SendUart(unsigned char tx0)
{
TxBuf=(tx0<<1)|0x200;
CntWei=DATA_WEI_TX;
CCR0=TAR+NEXT_TIME;
CCTL0 = OUTMOD_1+CCIE; //輸出高電平
}
/*****************************************************************************
定時器A中斷函數
中斷源:CC0
******************************************************************************/
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA0()
{
CCR0 += NEXT_TIME; //下一位到來的時間
if((CCTL0&CCIS_1)==CCIS_1)
{
//處于接收狀態
if((CCTL0&CAP)==CAP)
{
CCTL0 &= ~CAP; //處于捕獲模式,轉比較方式
CCR0 += NEXT_TIME_H; //1.5位后讀取數據
}
else
{
//接收數據
if(CntWei!=0)
{
RxBuf = RxBuf>>1;
if((CCTL0&SCCI)==SCCI)
RxBuf |= 0x80;
CntWei--;
}
else
{
//接收完畢
CCTL0 &= ~CCIE; //關閉接收中斷,退出接收狀態
bRTx=1; //接收到一個字節標志置位
LPM3_EXIT; //退出低功耗狀態
}
}
}
else
{
//處于發送狀態
if(CntWei!=0)
{
//未發送完
CCTL0 &= ~OUTMOD2; //輸出模式1,置位
if((TxBuf&0x1)==0)
{
//發送0
CCTL0 |= OUTMOD2; //輸出模式5,復位
}
TxBuf >>=1;
CntWei--;
}
else
{
//全部發送完
CCTL0 &= ~CCIE; //關閉中斷
bRTx=1;
}
}
}
/*****************************************************************************
讀收到的數據,清除有數據收到標志
返回值:收到的數據
******************************************************************************/
unsigned char ReadBuf()
{
bRTx=0;
return RxBuf;
}
/****************************************************************************
查詢是否收到或者發送完數據
返回值:是否收到或者發送完數據的標志 1:完成;0:沒有完成
****************************************************************************/
unsigned char GetRTx()
{
return bRTx;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -