打印

求助!!!16c554寄存器无故被修改

[复制链接]
1600|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
daihelong|  楼主 | 2008-3-9 13:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在近期的一个项目中,用到了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。

相关帖子

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

本版积分规则

3

主题

11

帖子

1

粉丝