查看: 3286|回复: 2

[其他] freescale mcf5223x系列 UART通讯问题,求助!

[复制链接]

该用户从未签到

48

主题

141

帖子

1

中级会员

Rank: 3Rank: 3

积分
385
最后登录
2020-8-7
发表于 2009-4-17 15:44:14 | 显示全部楼层 |阅读模式
我外部用的是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
组织发送数据报文:
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)
       {
              sys_state&=~0x4000;                    //超时,发送失败
              comerr_num++;
       }
       else
       {
              comerr_num=0;
              break;
       }
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
我知道答案 目前已有1人回答
回复

使用道具 举报

该用户从未签到

48

主题

141

帖子

1

中级会员

Rank: 3Rank: 3

积分
385
最后登录
2020-8-7
 楼主| 发表于 2009-4-20 23:55:05 | 显示全部楼层

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

没人解答一下吗?我现在只能用笨方法来处理,希望有人能给一个比较好的解决方法。

该用户从未签到

2

主题

14

帖子

0

新手上路

Rank: 1

积分
35
最后登录
1970-1-1
发表于 2009-4-21 09:07:07 | 显示全部楼层

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

好像这个延时是必须的,这个延时由485驱动芯片决定,不由单片机决定。
我以前的做法是在开足够大的缓存空间用来保存数据,然后再慢慢发出去,这样可以解决一些问题,当然也要看你的数据量。
如果你的数据发送是周期性的,也可以考虑定时器中断发送。。。
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /4 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2024-4-28 07:04 , Processed in 0.122220 second(s), 22 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表