高手們~關於IO模擬UART的問題可以幫幫忙嗎?

2019-03-24 12:54发布

我是以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;
} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
1条回答
Ds_Sky
2019-03-24 17:18
不知你是如何判断没接受到资料的,不会是接受到而没发送出去么?既然分开写没问题,那就应该是衔接有问题了,先接受然后发送,应该发送有问题的吧!我是这么认为的!

一周热门 更多>

相关问题

    相关文章