在近期的一个项目中,用到了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。 |