打印

16c554寄存器无故被修改,痛苦的调试过程

[复制链接]
3014|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
daihelong|  楼主 | 2008-3-9 13:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    在近期的一个项目中,用到了TL16C554芯片,进行扩展串口。
我的系统还是51单片机系统。由于第一次接触554,我把datasheet看了N遍
包括中文和英文,以及不同公司的:ST,TI,NXP(飞利浦)的datasheet我都
对照看了一下,以加深理解。
    言归正传,我系统用到了4个串口,单片机串口本身有一个串口,因此
只用了554的3个串口,串口A-串口C。凭借多年的51经验,很快就把程序写出来
了,加上仿真器(伟福的V8T)运行,ok,收发正常!当时只写了一个串口-串口B,
觉得应该没事了,开始编写其他程序......
    当程序基本完成后,开始系统联调,问题出现了:串口A工作不正常,
程序都一样的,为什么呢??当时马上把串口A的发送端通过电平转换,插到
计算机的RS232口进行监视,郁闷,发现能发数,但是发的数变样了,于是再继续
检查发送程序,感觉没有什么问题,那么难道是波特率不对?检查了一番程序后感觉
还是没有问题。
    这下我开始怀疑是不是554芯片的波特率寄存器被修改了,于是马上加入
读寄存器语句进行监视,并在仿真器里设下断点,唉,搞了半天,波特率寄存器没被
修改。我并没有放弃,于是又监视别的554芯片的寄存器,折腾了一段,终于发现了!!
是554串口A的LCR(线路控制寄存器被修改了,变为0,就意味着接收和发送的长度变为5
,而不是8位)。
    然后我又对程序特别是访问外部端口,以及XDATA类型的数组都检查了一番,怀疑
是不是程序那里给乱写了数,通过断点,还有屏蔽部分可疑程序等方法,折腾了一段时间
还是没有结果。又仔细分析了一下原理图,以及时序,再对照了几个公司的datasheet的时序图,
看是不是那里有点不对,但是还是没有结果。
    这下郁闷坏了,我又想到了一个方法,就是把554串口A的片选/CSA接到我的单片机的一个
外部中断1上,然后程序上打开外部中断1,用仿真器设下断点,利用仿真器的跟踪功能,
当断下来之后,向前检查跟踪的代码,看最近的哪个代码使/CSA变低了。结果出人意料!
居然没有中断,也就是/CSA一直为高!巨汗!!居然会出现片选不打开的情况下还能对寄存器
进行修改!!!这是什么芯片!骂了一会,又恢复冷静,找了台示波器检查片选,的确一直为
高。
    我几乎晕倒!心里怀疑这芯片是不是正品?但是采购不在,今天我是加班,于是还是
继续查问题吧。
    于是我在程序里定义了一个和554串口A的LCR地址一样的XDATA类型,通过仿真器就可以
随时看LCR的值,因为每断下来,仿真器就会读这个地址的值,然后显示到观察窗口。
就这样,对相关代码进行了单步执行,费了N多时间,终于出现了!我的天!不得不大叫一声。
现象是这样的:
    每当串口B接收到数据时(我的串口都定义的为FIFO,8字节模式),第一次读取串口B的
接收BUF时就能引起串口A的LCR变为0。而且次次都是这样。我立即加了一行程序,就是在第一次读
的后面加上:LCRA=0x03;然后单步继续走,居然后面的读串口B的操作不再把LCRA清零,也就是只有
接收到数后的第一次读操作产生对LCRA清0。
    我再一次对时序怀疑,因为datasheet上,地址线(A0-A2)早于片选CS ,但我的设计中几乎
是同时的,因为CS与A0-A2同时接到单片机的地址线上(P2口上),然后我就不用总线访问,用IO口
模拟读操作,先A0-A2,然后CS,然后再RD置低,结果发现,每每RD置低,串口A的 LCR就变为0了。现象
和总线访问的一样。
    现在我只能怀疑芯片问题了,那位同仁遇到过类似问题?请帮帮我

总结现象:
    条件:51,芯片TL16C554A,晶体频率:3.6864M,使用了554里的3个串口:A,B,C
    这3个串口都一样的配置:8字节FIFO模式,554的接发送中断开启。
    现象:
    每当串口B接收到数据时,第一次读取串口B的接收BUF时,引起串口A的LCR变为0。

相关帖子

沙发
工控秀才| | 2008-3-9 22:06 | 只看该作者

呵呵, 用我的扩展

做产品的话,有量直接帮你进行程序设计.
一定不会让你这么痛苦的.

使用特权

评论回复
板凳
daihelong|  楼主 | 2008-3-10 10:22 | 只看该作者

请问楼上

你见过我的这种情况没?是什么地方不对呢

使用特权

评论回复
地板
来与君| | 2008-3-10 10:46 | 只看该作者

调试几个口时

先分别调通每个口,再统调。

使用特权

评论回复
5
后学| | 2008-3-10 16:37 | 只看该作者

查找问题时,

要有清晰的思路,钢铁的意思,和水滴石穿的耐心。。。

使用特权

评论回复
6
至尊宝| | 2008-3-10 17:27 | 只看该作者

你的554reset脚是如何接的?

使用特权

评论回复
7
hotpower| | 2008-3-11 00:40 | 只看该作者

哈哈~~~俺一片ARM7上挂了4片554也没事呀...不解

使用特权

评论回复
8
古道热肠| | 2008-3-11 10:00 | 只看该作者

分清共性和个性,分清软件和硬件

分清共性和个性:

最简单的办法就是焊3-5块样品,看看是否都一样。假如都一样,是共性问题,故障存在有其必然性,假如是个性,可能是硬件芯片故障或其它故障。

分清软件和硬件:
最好能找个用此芯片的实验板,先保证硬件万无一失的情况下调试您的驱动程序是否能用得起来。

再次提醒,最好直接将程序烧写后试一试,仿真器是仿真,有时会带来副作用。

使用特权

评论回复
9
daihelong|  楼主 | 2008-3-11 13:25 | 只看该作者

可以结帖了!!

在这里感谢各位给我帮助,我叫采购买了飞利浦的原装的芯片,用上就全好了,真是教训深刻呀,坛子的兄弟们也引以为戒,用这芯片千万要用原装的,避免带来诸多麻烦。

使用特权

评论回复
10
古道热肠| | 2008-3-11 14:35 | 只看该作者

哈哈,早给假冒伪劣“戒”了多少次了

使用特权

评论回复
11
hotpower| | 2008-3-11 20:17 | 只看该作者

记得管脚有处不同...

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

11

帖子

1

粉丝