2409|1

17

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

高手們~關於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;
}

最新回复

不知你是如何判断没接受到资料的,不会是接受到而没发送出去么?既然分开写没问题,那就应该是衔接有问题了,先接受然后发送,应该发送有问题的吧!我是这么认为的!  详情 回复 发表于 2013-2-19 14:54
 
点赞 关注

回复
举报

35

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

疑问

不知你是如何判断没接受到资料的,不会是接受到而没发送出去么?既然分开写没问题,那就应该是衔接有问题了,先接受然后发送,应该发送有问题的吧!我是这么认为的!
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表