各位大神好,小弟调试红外收发器遇到如下问题:PC端接收到的数据,高4位一直出错,而低四位正收发正确;用示波器抓取430接收口的信号(包括软件调试),接收的数据没问题,就是发送时出错了,找了半天找不出原因,求各路英雄帮帮忙。代码如下:
#include "msp430xG46x.h"
#define RXD BIT1 // RXD
#define TXD BIT0 // TXD
#define Bitime 417
#define Bitime_5 625
unsigned char TXData=0X00;
unsigned char RXData=0X00;
void delay(unsigned int data);
void TX_Byte(unsigned char data);
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
FLL_CTL0 |= XCAP14PF;
do
{
IFG1&=~OFIFG;
for(unsigned int i=50000;i>0;i--);
}
while(IFG1&OFIFG);
SCFI0|=FN_2; //DC0频率调整范围
SCFQCTL=30; //1M=(30+1)*32765Hz
TACTL |= TASSEL_2 + MC_2+TACLR; // SMCLK, 增计数模式
P1DIR |= TXD;
P1OUT &=~ TXD; //为通信端捕捉起始位做准备
P1IES |= RXD; //下降沿中断
P1IE |= RXD;
P1IFG=0;
_EINT();
while(1);
}
void TX_Byte(unsigned char data)
{
TXData=data;
TXData=TXData<<1; //左移1位,构造最低位为起始位
TXData=TXData|0x0200; //第十位置一,构造最高位为停止
for(unsigned char i=0;i<10;i++)
{
if(TXData & 0x01)
{
P1OUT|=TXD;
}
else
{
P1OUT&=~TXD;
}
TXData=TXData>>1;
delay(Bitime); //一位时长
}
P1OUT|=TXD;
}
#pragma vector=PORT1_VECTOR
__interrupt void RXD_isr()
{
if(P1IFG & RXD)
{
if(P1IN & RXD)
delay(Bitime_5);
for(unsigned char i=0;i<8;i++) //在中断程序中将8位数据读出来
{
if(P1IN & RXD)
{
RXData |= 0x80; //从最高位传递进来
}
else
{
RXData |= 0x00;
}
RXData >>= 1; //此语句放置位置影响接收位
delay(Bitime);
}
}
TX_Byte(RXData); P1IFG=0; }
void delay(unsigned int data)
{
TACTL |= TACLR + MC_2;
while(TAR<data);
TACTL |= TACLR;
}