用tl16c752扩展串口遇到的问题

[复制链接]
 楼主| hexiaobo 发表于 2007-1-8 18:08 | 显示全部楼层 |阅读模式
采用tms320lf2407主控芯片,扩展一片tl16c752b,采用中断方式。通讯调试始终有问题:<br />1、关闭tl16c752的fifo,只打开接收中断或发送中断,接收或发送工作正常;<br />2、当同时打开接收、发送中断时,发送接收中断均不能正常进入;<br />3、打开fifo,关闭流控制,trigger&nbsp;level设为16byte,只打开接收中断时,接收数据基本正常,但每次time_out中断会多进入一次;<br />4、打开fifo时,发送始终不能正常工作。当连续往thr中存入多个数据时,tx脚不能发送数据;当仅往thr中存入一个数据时,数据可以发送出来,但其后程序再也不能进入中断处理程序。<br />&nbsp;&nbsp;请高手指点,调了一个星期,网上查了一大通,找不出毛病。另外流控制是否一定需要(包括硬件流、软件流)?多谢了!
chunyang 发表于 2007-1-8 21:44 | 显示全部楼层

你应该仔细看器件手册,操作时序是决定性的

流控不是必要,只是为了提高效率,但会使编程时序复杂化,先期不要开启。
daguang72 发表于 2007-1-9 11:45 | 显示全部楼层

流控制统统关闭

我一直在用SC16C2550B,并口扩展2个串口,查询方式,5V系统,没问题,原来是3.3V系统,芯片不能正常工作,后换得5V系统才正常,问周理工技术支持这是怎么回事儿,他们也解释不了,你的系统是几伏的?
daguang72 发表于 2007-1-11 17:47 | 显示全部楼层

哈哈

SC16C550说是2.5~5V均可用,实际我测试结果是只能用在5V<br />我相信芯片轻易不会出问题,估计还是你软件的问题,强烈建议用FIFO方式,这样能节省CPU大量处理时间,另外在每次查询到FIFO中有错误的时候要重新初始化一下这个芯片,这一点很重要
 楼主| hexiaobo 发表于 2007-1-24 10:05 | 显示全部楼层

新的进展

停了两个星期,现在重新调,有了新的进展。<br />1、增加了对tl16c752读写指令周期,每次读写tl16c752寄存器额外再加2us延时,只开接收中断时(IER设0x01),接收数据正常,没有了原来time_out中断会多进入一次的问题;<br />2、每次初始化tl16c752后,一开发送中断(IER设0x02),芯片立刻提起中断,INT脚转为高电平(此时实际并未发送数据),此时读IIR寄存器,偶尔可以复位中断(INT脚转为低电平),多数情况下INT脚一直保持高电平,导致无法正常进入中断服务程序;<br />3、在主程序中如果直接循环发送数据,数据可以正常发出。
 楼主| hexiaobo 发表于 2007-1-24 10:20 | 显示全部楼层

源程序

//中断服务程序<br />void&nbsp;interrupt&nbsp;INT6(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;ax,i;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;*XINT1CR|=0x8000;<br />&nbsp;&nbsp;&nbsp;&nbsp;ax=IIR_FCR_EFR_A&0x3f;<br />//RHR&nbsp;interrupt<br />&nbsp;&nbsp;&nbsp;&nbsp;if(ax==0x04)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt8;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RecvBuffer[PtrRecv++]=RHR_THR_DLL_A;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Delay(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />//RHR&nbsp;timeout&nbsp;interrupt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if(ax==0x0c)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RecvBuffer[PtrRecv++]=RHR_THR_DLL_A;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Delay(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}while(LSR_A&0x01);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />//THR&nbsp;interrupt<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if(ax==0x02)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />//RHR_THR_DLL_A=0x5a;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;IIR_FCR_EFR_A=0x06;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Clear&nbsp;FIFO<br />}<br /><br />//初始化&nbsp;TL16C752<br />void&nbsp;InitializeCom(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;UWORD&nbsp;i;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;*PFDATDIR|=0x0002;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//RESET&nbsp;TL16C752<br />&nbsp;&nbsp;&nbsp;&nbsp;Delay(100);<br />&nbsp;&nbsp;&nbsp;&nbsp;*PFDATDIR&=0xfffd;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;MCR_A=0x08;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Enable&nbsp;INT<br />&nbsp;&nbsp;&nbsp;&nbsp;Delay(2);<br />&nbsp;&nbsp;&nbsp;&nbsp;IIR_FCR_EFR_A=0x07;&nbsp;&nbsp;&nbsp;&nbsp;//Enable&nbsp;FIFO;Clear&nbsp;FIFO;8&nbsp;byte&nbsp;FIFO<br />&nbsp;&nbsp;&nbsp;&nbsp;Delay(2);<br />&nbsp;&nbsp;&nbsp;&nbsp;LCR_A=0x80;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Set&nbsp;Baudrate<br />&nbsp;&nbsp;&nbsp;&nbsp;Delay(2);<br />&nbsp;&nbsp;&nbsp;&nbsp;if(System.Baudrate2&gt7)i=5;<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;i=System.Baudrate2;<br />&nbsp;&nbsp;&nbsp;&nbsp;RHR_THR_DLL_A=LBaudrateTableCom;<br />&nbsp;&nbsp;&nbsp;&nbsp;Delay(2);<br />&nbsp;&nbsp;&nbsp;&nbsp;IER_DLH_A=HBaudrateTableCom;<br />&nbsp;&nbsp;&nbsp;&nbsp;Delay(2);<br />&nbsp;&nbsp;&nbsp;&nbsp;LCR_A=0x03;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//8&nbsp;data&nbsp;bit;1&nbsp;stop&nbsp;bit;0&nbsp;parity&nbsp;bit<br />&nbsp;&nbsp;&nbsp;&nbsp;Delay(2);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;IER_DLH_A=0x02;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Enable&nbsp;RHR/THR&nbsp;interrupt<br />}<br /><br />从示波器上看,初始化程序最后一条指令一执行,INTA脚立刻变为高电平,进入中断服务程序后执行ax=IIR_FCR_EFR_A&0x3f(读IIR),大多数情况下INTA脚不能转为低电平,中段不能被复位,现在问题的症结就在这里了。<br />各位大佬一起帮忙分析一下,多谢!<br />
 楼主| hexiaobo 发表于 2007-1-25 09:41 | 显示全部楼层

新进展

昨天又仔细看了芯片手册,发现读写的有效脉宽必须大于2倍输入时钟周期。现有的震荡器频率为3.072M,这样需要的读写宽度必须大于670ns,问题就在这里!dsp的主频40M,在增加了7个读写指令周期后,读写宽度也只到100ns,远远达不到芯片的要求。在换了10M的震荡器后,读IIR寄存器可以清除发送中断了。现在A口的发送接收均已正常,B口仍然不能正常操作。其实10M也没达到手册的要求时序,由于手头上没有更高频率的震荡器,因此还要再等等。
freeqwg 发表于 2011-11-23 21:08 | 显示全部楼层
很久的帖子了,看到没有解决,续个尾。
INTA脚不能转为低电平,因为采用中断方式时,datasheet中在说明FCR时,
FCR[1]和FCR[2]均要求:
Clears the receive/ transmit FIFO and resets counter logic to zero. Will return to zero after clearing FIFO.
只要TLr和fcr的参数设置正确,上面的话能够理解,楼主的问题就能解决!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

8

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部