|
|||||||||||
| 技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
用tl16c752扩展串口遇到的问题 |
| 作者:hexiaobo 栏目:通信技术 |
采用TMS320LF2407主控芯片,扩展一片TL16C752b,采用中断方式。通讯调试始终有问题: 1、关闭TL16C752的fifo,只打开接收中断或发送中断,接收或发送工作正常; 2、当同时打开接收、发送中断时,发送接收中断均不能正常进入; 3、打开fifo,关闭流控制,trigger level设为16byte,只打开接收中断时,接收数据基本正常,但每次time_out中断会多进入一次; 4、打开fifo时,发送始终不能正常工作。当连续往thr中存入多个数据时,tx脚不能发送数据;当仅往thr中存入一个数据时,数据可以发送出来,但其后程序再也不能进入中断处理程序。 请高手指点,调了一个星期,网上查了一大通,找不出毛病。另外流控制是否一定需要(包括硬件流、软件流)?多谢了! |
| 2楼: | >>参与讨论 |
| 作者: chunyang 于 2007/1/8 21:44:00 发布:
你应该仔细看器件手册,操作时序是决定性的 流控不是必要,只是为了提高效率,但会使编程时序复杂化,先期不要开启。 |
|
| 3楼: | >>参与讨论 |
| 作者: daguang72 于 2007/1/9 11:45:00 发布:
流控制统统关闭 我一直在用SC16C2550B,并口扩展2个串口,查询方式,5V系统,没问题,原来是3.3V系统,芯片不能正常工作,后换得5V系统才正常,问周理工技术支持这是怎么回事儿,他们也解释不了,你的系统是几伏的?
|
|
| 4楼: | >>参与讨论 |
| 作者: hexiaobo 于 2007/1/9 17:22:00 发布:
3.3V系统 TL16C752数据手册上写的是3.3V电源没问题。SC16C2550B是5V芯片吗?l16c752有64byteFIFO,其实用不到,价格还比较贵(40RMB)。而且在不使用FIFO时,芯片还有BUG(读数据时必须加延时),现在还没搞定,苦恼! |
|
| 5楼: | >>参与讨论 |
| 作者: daguang72 于 2007/1/11 17:47:00 发布:
哈哈 SC16C550说是2.5~5V均可用,实际我测试结果是只能用在5V 我相信芯片轻易不会出问题,估计还是你软件的问题,强烈建议用FIFO方式,这样能节省CPU大量处理时间,另外在每次查询到FIFO中有错误的时候要重新初始化一下这个芯片,这一点很重要
|
|
| 6楼: | >>参与讨论 |
| 作者: hexiaobo 于 2007/1/24 10:05:00 发布:
新的进展 停了两个星期,现在重新调,有了新的进展。 1、增加了对TL16C752读写指令周期,每次读写TL16C752寄存器额外再加2us延时,只开接收中断时(IER设0x01),接收数据正常,没有了原来time_out中断会多进入一次的问题; 2、每次初始化TL16C752后,一开发送中断(IER设0x02),芯片立刻提起中断,INT脚转为高电平(此时实际并未发送数据),此时读IIR寄存器,偶尔可以复位中断(INT脚转为低电平),多数情况下INT脚一直保持高电平,导致无法正常进入中断服务程序; 3、在主程序中如果直接循环发送数据,数据可以正常发出。 |
|
| 7楼: | >>参与讨论 |
| 作者: hexiaobo 于 2007/1/24 10:20:00 发布:
源程序 //中断服务程序 void interrupt INT6(void) { WORD ax,i; *XINT1CR|=0x8000; ax=IIR_FCR_EFR_A&0x3f; //RHR interrupt if(ax==0x04) { for(i=0;i<8;i++) { RecvBuffer[PtrRecv++]=RHR_THR_DLL_A; Delay(1); } } //RHR timeout interrupt else if(ax==0x0c) { do { RecvBuffer[PtrRecv++]=RHR_THR_DLL_A; Delay(1); }while(LSR_A&0x01); } //THR interrupt else if(ax==0x02) { //RHR_THR_DLL_A=0x5a; } else IIR_FCR_EFR_A=0x06; //Clear FIFO } //初始化 TL16C752 void InitializeCom(void) { UWORD i; *PFDATDIR|=0x0002; //RESET TL16C752 Delay(100); *PFDATDIR&=0xfffd; MCR_A=0x08; //Enable INT Delay(2); IIR_FCR_EFR_A=0x07; //Enable FIFO;Clear FIFO;8 byte FIFO Delay(2); LCR_A=0x80; //Set Baudrate Delay(2); if(System.Baudrate2>7)i=5; else i=System.Baudrate2; RHR_THR_DLL_A=LBaudrateTableCom[i]; Delay(2); IER_DLH_A=HBaudrateTableCom[i]; Delay(2); LCR_A=0x03; //8 data bit;1 stop bit;0 parity bit Delay(2); IER_DLH_A=0x02; //Enable RHR/THR interrupt } 从示波器上看,初始化程序最后一条指令一执行,INTA脚立刻变为高电平,进入中断服务程序后执行ax=IIR_FCR_EFR_A&0x3f(读IIR),大多数情况下INTA脚不能转为低电平,中段不能被复位,现在问题的症结就在这里了。 各位大佬一起帮忙分析一下,多谢! |
|
| 8楼: | >>参与讨论 |
| 作者: hexiaobo 于 2007/1/25 9:41:00 发布:
新进展 昨天又仔细看了芯片手册,发现读写的有效脉宽必须大于2倍输入时钟周期。现有的震荡器频率为3.072M,这样需要的读写宽度必须大于670ns,问题就在这里!dsp的主频40M,在增加了7个读写指令周期后,读写宽度也只到100ns,远远达不到芯片的要求。在换了10M的震荡器后,读IIR寄存器可以清除发送中断了。现在A口的发送接收均已正常,B口仍然不能正常操作。其实10M也没达到手册的要求时序,由于手头上没有更高频率的震荡器,因此还要再等等。 |
|
| 9楼: | >>参与讨论 |
| 作者: jake 于 2008/12/19 12:04:56 发布:
我们有比TL16C752性价更好的---XR16M752,我们的Data rate(3.3V)可以达到16M,请跟我联系:jakelei@baite-group.com 13723775328 |
|
|
|
| 免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |