高手們~關於IO模擬UART的問題可以幫幫忙嗎?
[复制链接]
我是以IO來判斷有無資料進入,timerA裡做收與傳
我把傳跟收分開寫是正常的
但是何在一起就無法收到資料了
可以請高手幫幫忙嗎?拜託了~
#include "msp430x14x.h"
#define Bitime ((8000000/2400u))
#define Bitime_5 ((8000000/(2400u*2)))
unsigned int txflag,rxflag,rxport,count;
int i=0;
unsigned int p=0,a=1;
void io_init();
void timer_init();
void clock_init();
void send();
void main( void )
{
WDTCTL = WDTPW + WDTHOLD;
clock_init();
io_init();
}
#pragma vector=PORT1_VECTOR //io中斷偵測有無資料進入
__interrupt void Port_1(void)
{
if(P1IFG&0x10)//確認是P1.4腳位有變化
{
i=0;//接收的計數器初始化為0
p=0;
a=1;
txflag=0;//旗幟txflag=0與rxflag=1此時會進入timerA接收部分
rxflag=1;
P1IFG&=~0x10;//清除中斷旗幟
timer_init();//timerA初始化
//LPM0;
P1IE&=~0x10; //關閉IO中斷
}
}
#pragma vector=TIMERA0_VECTOR
__interrupt void TIMER_A(void)
{
if(txflag==0&rxflag==1)//接收
{
CCR0=CCR0+Bitime;//加一位的時間
if(P1IN&0x10)//每一個時刻接收腳位的值
{
p+=a;
a*=2;
}
else
{
a*=2;
}
i++;
if(i==10)//當接收完10個
{
CCTL0&=~CCIE;//關閉中斷
TACTL|=TACLR;//計時器歸零
TACTL&=~MC_2;//關閉連續計時
send();//傳送初始化
}
}
if(txflag==1&rxflag==0)//傳送
{
if(p&0x01)//每一位的資料
P1OUT|=0x03;
else
P1OUT&=~0x03;
p=p>>1;
count++;
CCR0+=(Bitime);
if(count==10)
{
txflag=0;
rxflag=1;
// TACTL|=TACLR;
TACTL&=~MC_2;
CCTL0&=~CCIE;
P1IE|=0x10;
}
}
}
void send()
{
txflag=1;//當txflag=1與rxflag=0,此時進入timerA中斷傳送部分
rxflag=0;
count=0;//傳送的位數,初始為0
CCTL0=CCIE;//打開timerA中斷
CCR0=TAR+(Bitime);//為一位時間
TACTL=TASSEL_2 + MC_2;//選擇XT2震盪器與連續計時
_EINT();//進入timerA中斷
}
void timer_init()
{
TACTL|=TACLR;//清除計時器,將它歸0
CCTL0=CCIE;//開啟timerA中斷
CCR0=TAR+(Bitime_5);//一開始為半位時間
TACTL=TASSEL_2 + MC_2;//選擇XT2振盪器,計數時間為連續
_EINT();//進入timerA中斷
// while(1);
}
void io_init()
{
P1DIR |=0x01;
P1SEL=0x00; //select GPIO
P1DIR|=0x03; //P1.0; P1.1 output tx1 P1.2 output tx2
P1DIR&=~0x10; //P1.4 input rx1 P1.5 input rx2
P1OUT|=0x03; //write/read output
P1IES|=0x10; //select voltage up or down(use down here)
P1IFG&=~0x10; //clear flag
P1IE|=0x10; //P1.4 P1.5 turn on interrupt
_BIS_SR(LPM4_bits+GIE);
}
void clock_init()
{
volatile unsigned int ii;
BCSCTL1 &= ~XT2OFF; // XT2on 8MHz
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (ii = 0xFF; ii > 0; ii--); // Time for flag to set
}while ((IFG1 & OFIFG)); // OSCFault flag still set?
BCSCTL2 |= SELM_2 + SELS;
}