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