首页 »论坛首页 »技术社区 >> 飞思卡尔社区论坛 >> 32位MCU >>
我要发帖 | 我要投票 | 收藏
1

freescale mcf5223x系列 UART通讯问题,求助!

版主: 大学IV队  南京老练   
freescale mcf5223x系列 UART通讯问题,求助!
 

我外部用的是485方式,485有个发送/接受使能,用口线控制。有个问题是在发送的时候我必须先使能发送口线,延时一段时间后才能真正在程序里面发送数据,否则发出的第一个数据会出现错误。 发送完后还不能立即将使能口线转为接收,需要再延时一断时间后再使能接收口线才能收到正确数据,否则最后一个数据有错误。这个时间不好控制,对方可能回得很快也可能回得慢。开始怀疑是隔离光耦问题,但我查了一个我的3个光耦(TLP114A),高低转换的最大速度都是0.8us,速度没问题。这怎么解决?

UART初始化程序:

void Init_UART1(void)

{

  /* ### Init_UART1 init code */

  /* UCR1: MISC=3,TC=0,RC=0 */

  UCR1 = 0x30;                                     

  /* UCR1: MISC=2,TC=0,RC=0 */

  UCR1 = 0x20;                                     

  /* UCR1: MISC=1,TC=0,RC=0 */

  UCR1 = 0x10;                                     

  /* UACR1: IEC=0 */

  UACR1 = 0x00;                                     

  /* UIMR1: COS=1,DB=1,FFULL_RXRDY=1,TXRDY=1 */

  UIMR1 = 0x3;                                      

  /* UMR11: RXRTS=0,RXIRQ=0,ERR=0,PM=2,PT=0,BC=3 */

  UMR11 = 0x13;                                     

  /* UBG11: Divider_MSB=0 */

  UBG11 = 0x00;                                     

  /* UBG21: Divider_LSB=0xC3 */

  UBG21 = 0xc3;                                      

  /* UCSR1: RCS=0x0D,TCS=0x0D */

  UCSR1 = 0xDD;                                     

  /* UMR21: CM=0,TXRTS=0,TXCTS=0,SB=7 */

  UMR21 = 0x07;                                     

  /* UCR1: MISC=0,TC=0,RC=0 */

  UCR1 = 0x01;                  

      

}

 

中断程序:

__declspec(interrupt) void isrINT_UART1(void)

{

  /* Write your interrupt code here ... */

    if (UISR1 & UISR1_TXRDY_BITMASK) {

        /* Yes. If any character to send, write it to UTB0

           else disable transmitter as follows:

        */

        send_char();

    }

 

 

    /* Character received? */

    if (UISR1 & UISR1_FFULL_RXRDY_BITMASK) {

        /* Yes, read character to clear interrupt

           (NB: Should check for framing, parity and overrun errors here)

        */

        rev_char(URB1);

    }

}

/* end of isrINT_UART1 */

 

void send_char(void)

{

       uint16 i;

       if(dis_se_ptr<dis_sb_ptr)

       {

              UTB1=distxd[dis_se_ptr];                                    //未发送完,继续发送

              dis_se_ptr++;

       }

       else

       {                       //发送完成,转为接收。

                                                                                                               i=20000;           //这个时间不好控制。短了最后一个字节发出有问题

                  while(i!= 0)                         

                         i--;

                  }

              UCR1 = UCR1_TC1_BITMASK;                    

              UCR1 = UCR1_RC0_BITMASK;

PORTUC&=~PORTUC_PORTUC0_BITMASK;               //使能接收口线

              dis_se_ptr=0;

              dis_sb_ptr=0;

       }

}

 

组织发送数据报文:

void send_ask(void)

{

       uint16 sum;

       uint8  i;

      

       distxd[0]=0xeb;

       distxd[1]=0x90;

       distxd[2]=0xeb;

       distxd[3]=0x90;

       distxd[4]=0x02;                                    //起始符

       distxd[5]=0x2;                                //特征码  查询键盘命令

       distxd[6]=11;                        //报文总长度

       distxd[7]=dis_inf;

      

       sum=CheckSum(distxd,8);

       distxd[8]=(uint8)(sum%0x100);           //代码和l

       distxd[9]=(uint8)(sum/0x100);       //代码和h

       distxd[10]=0x03;                                   //结束

      

       PORTUC|=PORTUC_PORTUC0_BITMASK;              //使能发送

      sum=20000;                            //这个延时短了发出的第一个字节有问题

       while(sum!=0)

       {

              sum--;

       }

       dis_rb_ptr=0;

       dis_se_ptr=0;

       dis_sb_ptr=distxd[6];

      UCR1 = UCR1_TC0_BITMASK;               //发送数据

       sys_state|=0x4000;  

       dsfh=0;                                    //等待发送完成

       while( ((sys_state&0x4000)!=0)&&(dsfh<LP3S))

       {

       }

       if(dsfh>=LP3S)

       {

              sys_state&=~0x4000;                    //超时,发送失败

              comerr_num++;

       }

       else

       {

              comerr_num=0;

              break;

       }

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

[最后修改于2009-04-20 23:53:48]
 
相关主题
...
回复 链接 收藏
 
RE:freescale mcf5223x系列 UART通讯问题,求助!
 
没人解答一下吗?我现在只能用笨方法来处理,希望有人能给一个比较好的解决方法。
 
...
回复 链接 收藏
 
回复:freescale mcf5223x系列 UART通讯问题,求助!
 

好像这个延时是必须的,这个延时由485驱动芯片决定,不由单片机决定。

我以前的做法是在开足够大的缓存空间用来保存数据,然后再慢慢发出去,这样可以解决一些问题,当然也要看你的数据量。

如果你的数据发送是周期性的,也可以考虑定时器中断发送。。。

 
...
回复 链接 收藏
 
我要发帖 | 我要投票 | 我要回复 | 收藏
1