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