This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于红外收发数据问题

各位大神好,小弟调试红外收发器遇到如下问题: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;

 }

  • 楼主你好,能说下高四位是如何错误的吗?是固定的值,还是比实际值大一定的数?还是无规律?

  • 您好,高位出错呈现一定的规律:当高四位为偶数时,会自动左移一位(如高四位为2时,PC端接收的数据为4),但如果为奇数,则会在左移的基础上最低位(高四位中最低位)置一(如为1时,PC端接收的为3);而低四位均收发正常。

    通过示波器、软件调试,均发现高四位数据收发正常,但是PC端接收的数据却出现如上所述情况。

    我想也不会是硬件电路上的问题,不然为什么低四位一切正常?

  • 楼主你好,我最近在调串口红外,发下一个问题, 红外需要38K的载波,但是发下msp430并没有调制到38k的载波上。另外手册上,给的描述是,一个串口数据 低电平 bit 调制后是一个脉冲,高电平bit不调。。我困惑几个问题,在串口红外功能时,是否有调制部分的时钟。?????