12996|19

483

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

串口可靠性问题什么的最抓狂了~!已经解决!解决过程已经附上 [复制链接]

本帖最后由 yl20084784 于 2014-10-27 17:34 编辑

最近在调试一个MSP430的串口1,有时候能收发都正常,过两天又不行了,每次把示波器借来还没开始弄,就自己就好了,卧槽,浪费个人情去借示波器!(在这个串口1上做了个标准MODbus协议,出问题的时候连串口中断都没法进入)

照国际例,贴上串口1初始化代码:
void UART1_init(void)
{
   U1CTL=CHAR+SPB;//异步 8位  两位停止位
   ME2 |=URXE1+UTXE1;  //串口收使能
         U1TCTL=SSEL0;  //9600,默认的
         U0BR1=0x00;
         U0BR0=0x03;
         U0MCTL=0x4a;  
   U1RCTL |=URXWIE;//仅响应首字节
   P3SEL |=BIT6+BIT7;//第二功能
   delay_ms(1);
   UCTL1 &= ~SWRST;  // 使能
   IE2 |=URXIE1+UTXIE1;//允许UART接收+发送中断中断
   P3DIR |=BIT4;
   RE;//    接收使能
   delay_ms(10);
}

然后是串口1 的中断服务程序
#pragma vector=USART1RX_VECTOR               
__interrupt void usart1_rx (void)
    {
        if(MB_Head)//如果已经收到了字头 且 接收的长度没超过设定长度,就把数据压入 MB_Rcv[]
         {           
                         TAR=0;//清楚帧空闲计时
                         MB_Rcv[MB_Rcv_Cnt]=U1RXBUF;
                         MB_Rcv_Cnt++;   
                        return;            
         }
        
        if(ModBus_ID==U1RXBUF)//如果地址是本机,置标志位
        {
                        TACTL=TASSEL_1+TAIE;//TA增计数,允许中断
                        TACCR0=IDLELINE_TIME;//空闲时间
                        //TAR=0;//清除帧空闲计时
                        TACTL |=TACLR;
                        TACTL |=TASSEL_1+MC_1;//开始以增计数方式开始计时
                        U1RCTL&=~URXWIE;//之后响应所有字节
                        MB_Head=1;//置针头标志位
                        return;//返回,等待下次中断,
        }               
}

定时器部分也贴上,但是根本就运行部到那里去过...


//定时器溢出中断
#pragma vector =TIMERA1_VECTOR
__interrupt void TA_ISR(void)
    {
      TACTL=TASSEL_1+MC0;//停止计数器   
      U1RCTL |=URXWIE;//又开始只仅响应首字节
      MB_Rcv_command_Flag=1;//置标志位,在主函数中回复上位机命令
      MB_Head=0;//下一个又是针头了
      DE;//转为发送状态,防止接收了一个命令以后还没来得及处理又接收到一个命令
    }
在主函数里面,
_EINT();//开中断

硬件电路部分使用ADM2587E做隔离,可能有的朋友没用到过,就是一个集成DC-DC的隔离器,好处是简化电路,大概买的是20块左右一片。在以前调试成功之前换了一块就莫名其妙的收发正常了,但是这次ADM2587E应该没问题,输出波形正常。
说道这个ADM2587E,最开始那一块,莫名其妙的发热很厉害,功耗0.6W。换一片就好。换了个店家买的就好了。淘宝的东西部靠谱啊!


关于虚焊的问题,应该可以排除,已经来回拖焊了两三次,万用表检查没问题。
关于单片机问题,今天下午刚换了一块新的,问题依旧。
电路中R8 R9 取9.1K ,也考虑过是这个太大,影响信号传输,所以修改为低波特率1200,问题依旧。以前正常的时候是2K,修改过来,应该问题不大。

可能还有那些方面的原因?
下载器有没有可能?
串口这里会不会出现信号反射,有个电阻,但是我对着个没研究过,也不知道它的影响怎么样?波特设置在9600。加电阻式怕把430的IO口给烧了...加了保险一点

静待大神..................
另,字大,不费神

新情况:
刚才在调试的时候发现运行下图中左边程序对U0BR0 U0BR1 U0MCTL 赋值以后再观察窗口根本没有改变!
这个问题是怎么来的?单片机顺坏?还是jtag没更新的问题?






待解决..............问题已经解决了!


先说解决过程:


就在刚刚,上电,串口发送的时候突然收到的数据!这一次我已经开始怀疑硬件部分了(上午的时候又好了一次,在那一次的时候屏蔽了很多函数,然后又一次加入,再执行了各个软件模块的功能后就莫名其妙的失效了,又收不到了),包括串口数据来了,晶振停振,以及各种莫名其妙的东西,所以趁这次能够正常收发的机会,把串口精灵设置为自动500毫秒读取单片机,然后逐一排查,如果排查到突然收不到返回数据了,肯定就是那里有问题。(示波器实在不好意思再去借了。。。)
首先用手摸了下晶振,收发正常,问题,靠近晶振的时候肯定有干扰,(如果问题,摸一下的时候,等效匹配电容什么的肯定会变)然后又扣了下单片机(还是担心虚焊)依然正常,然后柔了下信号线,出现了一次没有收到的现象,然后又正常了..心里一紧,问题多半在这里!但是往各个方向都试了下又不出现故障了,说明线没问题,这个时候我仔细一看,原来焊接信号线的头子往下压的时候就会通过原本预计焊接TVS(现在没有焊接,为了排除故障)的焊盘处形成短路!OMG....

再说串口1寄存器的值没有正常赋值,改变的问题,大家仔细看附图的代码,仔细看肯定能发现!!这里隔断几行,大家不好看结果,看看你能找到问题吗?







这个串口设置代码是我抄的串口0的(因为当时串口故障实在没法解决,以为是配置问题,就抄了当时正常工作的串口0的),当时抄过来修改的时候没有仔细,应该是U1BRO 和U1BR1,而不是U0BR0和U0BR1~~!!!很让人抓狂的细节错误!所以答案就是代码搞错了,寄存器张冠李戴了。




虽然发现了问题,挺高兴的,但是因为这么一个小问题导致耽搁了一周多,如果不是几天运气好,还不知道要弄到什么时候....细节决定成败,经过这次,从来都不是一句口号啊!这里穿两张照片,大家看一下吧。、
另,关于代码的问题,我稍后整理后将主函数剔除(也没必要留着,需要的自己也不用删了)把ILI9320显示控制部分的函数,以及各个模块的弄出来,需要的直接添加文件到工程里面就可以用了,接口函数都在.H文件里面。需要的下来看看吧。


QQ图片20141024205727.jpg (50.61 KB, 下载次数: 3)

硬件连接

硬件连接

QQ图片20141025132708.jpg (44.08 KB, 下载次数: 0)

JTAG仿真结果

JTAG仿真结果

串口设置关键问题.jpg (92.53 KB, 下载次数: 3)

串口设置细节问题

串口设置细节问题

IMG_20141027_165117.jpg (936.5 KB, 下载次数: 1)

这两根就是信号线

这两根就是信号线

IMG_20141027_165400.jpg (883.49 KB, 下载次数: 0)

我的流量计大概样子

我的流量计大概样子

最新回复

  详情 回复 发表于 2018-1-15 09:43
 
点赞 关注

回复
举报

2144

帖子

3

TA的资源

五彩晶圆(中级)

推荐
 
简单看了下UG中的Address-Bit Multiprocessor Format章节
不清楚楼主是哪款型号,没法判断,毕竟代码和头文件定义有关
最好描述下配置,这样便于分析,或者告知型号。帮忙看一下


If an address is received, user software can validate the address and must reset UCDORM to continue
receiving data. If UCDORM remains set, only address characters with address bit = 1 are received. The
UCDORM bit is not modified by the eUSCI_A hardware automatically.

这里描述的UCDORM和你的URXWIE是一个意思不,我参考的FR5xx6xx UG

点评

就像5楼的理解那样。这个URXWIE就是帧头识别的意思,比如连续发很多数据,这个检测原理我的理解是:当高电平大于正常结束位N位的时候,那么下一个接收到的字节就是帧头。  详情 回复 发表于 2014-10-24 23:30
抱歉,把最重要的信息搞忘说了,单片机型号是MSP430F1611,有两个串口的  详情 回复 发表于 2014-10-24 23:20
 
个人签名电工
 

回复

483

帖子

0

TA的资源

纯净的硅(初级)

沙发
 
等把这个问题解决了,我就把这个项目的所有代码共享出来。用到的模块倒是很多:MODbus协议,4到20毫安电路输出,继电器,逻辑电平驱动输出12V  高级DC-DC滤波技术 ILI9320液晶控制显示全套。以及硬件电路。希望大家踊跃发言啊~~~拿到这个代码可以直接做项目赚钱钱的哟
 
 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

4
 
综述,可提供具体型号或者用语言描述配置
 
个人签名电工
 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

5
 
你的思路我大概理解:
地址匹配之前只接受address bit的数据,接收到之后就全部接收,并打开定时器超时,如果一段时间没有数据则超时,然后再次设置为初始的地址匹配唤醒模式下,如此循环。

当然建议还是贴一些timer的代码,状态机不对也会有问题,当然配置还需要参考具体型号的UG

问题不能判断,待定
 
个人签名电工
 
 

回复

483

帖子

0

TA的资源

纯净的硅(初级)

6
 
lyzhangxiang 发表于 2014-10-24 21:30
简单看了下UG中的Address-Bit Multiprocessor Format章节
不清楚楼主是哪款型号,没法判断,毕竟代码和头 ...

抱歉,把最重要的信息搞忘说了,单片机型号是MSP430F1611,有两个串口的
 
 
 

回复

483

帖子

0

TA的资源

纯净的硅(初级)

7
 
lyzhangxiang 发表于 2014-10-24 21:30
简单看了下UG中的Address-Bit Multiprocessor Format章节
不清楚楼主是哪款型号,没法判断,毕竟代码和头 ...

就像5楼的理解那样。这个URXWIE就是帧头识别的意思,比如连续发很多数据,这个检测原理我的理解是:当高电平大于正常结束位N位的时候,那么下一个接收到的字节就是帧头。
 
 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

8
 
建议去淘宝买个逻辑分析仪,20M的只要三十几块。对于串口、I2C分析足够了,也不用你费事去借示波器。
对于我来说,字大不费眼,但费脑。一页显示不完所有内容,得记下来再翻页看其他内容。还不如用code代码呢!
既然你的电路正常运行过,那就应该通信本身没问题,主要是逻辑处理的问题。由于你用的是硬件串口,可以把串口的RX与电路断开,然后用一个USB-TTL模块直接连电脑,利用串口助手的连续发送功能调试。

下面说说我发现的几个问题。用code代码标识:


  1. if(ModBus_ID==U1RXBUF)//如果地址是本机,置标志位
  2. /*如果数据里恰好有一位也等于ModBus_ID怎么办?*/

  3. MB_Head=1;//置针头标志位
  4. /*MB_Head什么时候清0?*/

  5. U1RCTL&=~URXWIE;//之后响应所有字节
  6. /*关于多机通信的东西我不懂,这里我不清楚程序是怎么确定收到的是地址位,而不是数据位。换句话说,单片机是怎么实现同步的?*/
复制代码

点评

关于第一个问题是我抄掉了一句 ,在MB_Rcv_Cnt++;以后,有一句return;直接返回。这样的话,就只有第一个侦头才会被判断,即只有侦头字符才会执行到执行到第二个判断if语句,直到这个帧结束(超过一定时间)才会继续  详情 回复 发表于 2014-10-25 13:14
 
 
 

回复

483

帖子

0

TA的资源

纯净的硅(初级)

9
 
qiushenghua 发表于 2014-10-24 23:48
建议去淘宝买个逻辑分析仪,20M的只要三十几块。对于串口、I2C分析足够了,也不用你费事去借示波器。
对于 ...

关于第一个问题是我抄掉了一句 ,在MB_Rcv_Cnt++;以后,有一句return;直接返回。

这样的话,就只有第一个侦头才会被判断,即只有侦头字符才会执行到执行到第二个判断if语句,直到这个帧结束(超过一定时间)才会继续检查帧头,。

MB_Head 清0是放在定时器中断函数清0的。定时器的目的是为了接收未知长度帧的数据的,即,如果我收到一个字节以后的两个字节(正常发送的画)的时间以内还 没有收到字节(在串口接收中断服务函数中清定时器计数值)的话,就标示我收到的帧结束了,然后置标志位在主函数中回复上位机信息。

关于同步的问题,机制是这样的:MSP430侦头识别 功能,就是一串字符串,可以只相应第一个字符。我现在就是先开启这个功能,然手在响应第一个字符的中断服务函数里面(这个字符就是地址)判断和我这个单片机的地址是否相等,如果相等就关闭这个功能,那么以后的数据我都会接收了。在这里,而结束接收的办法就是,如果超过两个字节的时间我都没有继续接收到数据,那么我的定时器中断就到了,在定时器中断里面,我又开启这个侦头识别功能,那么就可以循环下去了。



也就相当于同步了,而连在这个网络上的其他单片机由于地址唯一,同一时刻也只会有一个单片机接收响应。

不知道你明白了我的做法了没有?


点评

看明白了,我只是根据目前能看到的代码提出几点疑问,由于你没有共享出定时器部分的代码,你刚刚说的几个问题如果不出来专门解释,是无法知晓的。 那个漏掉return语句的问题说小其实也不小,如果实际代码也是这样,  详情 回复 发表于 2014-10-25 14:44
 
 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

10
 
yl20084784 发表于 2014-10-25 13:14
关于第一个问题是我抄掉了一句 ,在MB_Rcv_Cnt++;以后,有一句return;直接返回。这样的话,就只有第一个 ...

看明白了,我只是根据目前能看到的代码提出几点疑问,由于你没有共享出定时器部分的代码,你刚刚说的几个问题如果不出来专门解释,是无法知晓的。
那个漏掉return语句的问题说小其实也不小,如果实际代码也是这样,可能会因此出问题。
既然你问的是可靠性问题,那么就让单片机先跑起来,一直到它出故障,然后在中间设置一个断点让它停下来,再观察数据有什么异常。

针对你新发现的问题,如果你的单片机是处于单步调试状态,那么观察数据会刷新。如果处于全速运行+低功耗状态,再去读寄存器数据,由于CPU已经关掉,寄存器数据将无法读出。至少在CCS中是这样,在IAR中是不是这样我就不清楚了。

点评

定时器的代码已经贴上了。我单步运行的时候其他位置的寄存器赋值都有变化,唯独这个没有....感觉有点怕怕的感觉,难道单片机有问题?20多块一片啊,为了这个小项目也买了6片了...都用完了。这一片是昨天刚焊接上去的  详情 回复 发表于 2014-10-25 17:32
 
 
 

回复

483

帖子

0

TA的资源

纯净的硅(初级)

11
 
qiushenghua 发表于 2014-10-25 14:44
看明白了,我只是根据目前能看到的代码提出几点疑问,由于你没有共享出定时器部分的代码,你刚刚说的几个 ...

定时器的代码已经贴上了。我单步运行的时候其他位置的寄存器赋值都有变化,唯独这个没有....感觉有点怕怕的感觉,难道单片机有问题?20多块一片啊,为了这个小项目也买了6片了...都用完了。这一片是昨天刚焊接上去的。关于这个故障问题,是这样的,前几天能跑,这几天就是不能跑...这几天连接收字符中断都不能进了..无哭无泪啊.
看来还是要借示波器了...
我刚才看淘宝的逻辑分析仪,299的比较多..国产的感觉不怎么放心...
 
 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

12
 
我说的是那种24M的saleae逻辑分析仪,也就二三十块钱。
那玩意其实就是用一个高速的单片机,把IO的状态(高、低)通过USB口发送到计算机上,再用上位软件将电平显示成图像。上位机软件可以对抓取到的信号做进一步分析。
由于通信一般是低速的,同时只有高低两种状态,所以这样的廉价逻辑分析仪已足以应付大多数需求。
注意抓信号要抓TTL侧,不要抓RS-485侧,不然不光看不出信号的值,还有可能因为高压损坏逻辑分析仪。

你这问题我还没遇到过,你可以新建一个简单工程,把其他的代码全部删去,专注调试这个串口的问题,排查一下是不是硬件故障。如果真是硬件故障那也没其他的办法,只能更换了。

点评

进不了串口接收中断的问题,初步确定了,你看下我传上去的第三张图片就懂了。这也是个细节问题,可能按照以前的方法有的时候是行得通,但是在某些情况下就是行不通了。还是注意的好。能够找到这个问题,也算是我的运  详情 回复 发表于 2014-10-26 15:26
 
 
 

回复

483

帖子

0

TA的资源

纯净的硅(初级)

13
 
本帖最后由 yl20084784 于 2014-10-26 17:55 编辑
qiushenghua 发表于 2014-10-25 17:54
我说的是那种24M的saleae逻辑分析仪,也就二三十块钱。
那玩意其实就是用一个高速的单片机,把IO的状态( ...

寄存器设置错误,不过奇怪的是,原来为什么又可以?不过设置会来还是进不了中断...
 
 
 

回复

2453

帖子

19

TA的资源

五彩晶圆(中级)

14
 
先烧TI的demo代码,看看行不行。排除是软件问题还是硬件。然后再在demo的基础上改就好了
 
个人签名    懒得很
 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

15
 
U0BR1=0x00;
U0BR0=0x03;
U0MCTL=0x4a;  

除了BRx还有MCTL也是U1的 注意一下,先改了看下

终于有时间打开电脑了,我去下载个UG帮你看一下。
 
个人签名电工
 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

16
 
看了下UG可以简单谈谈了,楼主的东西不是很了解,我只从UG上来说,不涉及你的程序,你可以对着检查

1、多机地址模式,还是蛮简单的,基本上从机是按照你的理解的状态机来就行了。

注解:楼主好像没有配置MM位。

2、关于串口配置部分,是否每次切换状态机都需要进行SWRST这个请大家给点看法,UG中的说明如下:



注解:上面两幅截图可以看出是需要进行SWRST的,所以在你从机程序中的切换状态机中需要完善串口重新配置部分的代码。

3、关于多机地址主机的程序,需要配置TXWAKE位来表示这个是地址,否则从机不会区分哪个是地址哪个是数据,可以用示波器抓一下主机发送地址和数据的波形差异,这个蛮有用的,如果你在产品中用这个多机地址的话。


注解:楼主没有提及到关于主机的东西,所以不好推测问题,不能够直接采用上位机哦,除非你可以产生TXWAKE位。

其他的,没有仔细看,是否一定要2 stop bits,如果不需要可以先用1 stop bit来实验,最好是有一个主机,两个从机,接仿真器来看。

恩,好好吧UG相关部分看一下,没什么问题的。另外,不建议楼主调通后开源,自己调的东西,自己留着吧,经验更重要,代码一点不重要。

点评

首先谢谢这位大大的热心解答。万幸的是,就在刚刚我戏剧性的解决了这个问题,两根信号线的焊接部分,在信号线往下压的时候就会通过本来预留是焊接TVS的焊盘处短路!本来是个很小的问题,但是不细心,但是没找到就是  详情 回复 发表于 2014-10-27 16:58
 
个人签名电工
 
 

回复

483

帖子

0

TA的资源

纯净的硅(初级)

17
 
lyzhangxiang 发表于 2014-10-27 09:08
看了下UG可以简单谈谈了,楼主的东西不是很了解,我只从UG上来说,不涉及你的程序,你可以对着检查

1、 ...

首先谢谢这位大大的热心解答。万幸的是,就在刚刚我戏剧性的解决了这个问题,两根信号线的焊接部分,在信号线往下压的时候就会通过本来预留是焊接TVS的焊盘处短路!本来是个很小的问题,但是不细心,但是没找到就是让人发狂。细节太重要了。我已经上图了。

 
 
 

回复

3471

帖子

11

TA的资源

五彩晶圆(高级)

18
 
祝贺楼主终于解决了问题啊,感谢楼主分享这么详细的经验。继续加油啊~~~~~~
 
 
 

回复

3025

帖子

0

TA的资源

五彩晶圆(初级)

19
 
细节决定成败,经过这次,从来都不是一句口号啊!说的很好
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

20
 
 
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表