登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

用tl16c752扩展串口遇到的问题

作者:hexiaobo 栏目:通信技术
TL16C752扩展串口遇到的问题
采用TMS320LF2407主控芯片,扩展一片TL16C752b,采用中断方式。通讯调试始终有问题:
1、关闭TL16C752的fifo,只打开接收中断或发送中断,接收或发送工作正常;
2、当同时打开接收、发送中断时,发送接收中断均不能正常进入;
3、打开fifo,关闭流控制,trigger level设为16byte,只打开接收中断时,接收数据基本正常,但每次time_out中断会多进入一次;
4、打开fifo时,发送始终不能正常工作。当连续往thr中存入多个数据时,tx脚不能发送数据;当仅往thr中存入一个数据时,数据可以发送出来,但其后程序再也不能进入中断处理程序。
  请高手指点,调了一个星期,网上查了一大通,找不出毛病。另外流控制是否一定需要(包括硬件流、软件流)?多谢了!

2楼: >>参与讨论
chunyang
你应该仔细看器件手册,操作时序是决定性的
流控不是必要,只是为了提高效率,但会使编程时序复杂化,先期不要开启。

3楼: >>参与讨论
daguang72
流控制统统关闭
我一直在用SC16C2550B,并口扩展2个串口,查询方式,5V系统,没问题,原来是3.3V系统,芯片不能正常工作,后换得5V系统才正常,问周理工技术支持这是怎么回事儿,他们也解释不了,你的系统是几伏的?

4楼: >>参与讨论
hexiaobo
3.3V系统
TL16C752数据手册上写的是3.3V电源没问题。SC16C2550B是5V芯片吗?l16c752有64byteFIFO,其实用不到,价格还比较贵(40RMB)。而且在不使用FIFO时,芯片还有BUG(读数据时必须加延时),现在还没搞定,苦恼!

5楼: >>参与讨论
daguang72
哈哈
SC16C550说是2.5~5V均可用,实际我测试结果是只能用在5V
我相信芯片轻易不会出问题,估计还是你软件的问题,强烈建议用FIFO方式,这样能节省CPU大量处理时间,另外在每次查询到FIFO中有错误的时候要重新初始化一下这个芯片,这一点很重要

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

7楼: >>参与讨论
hexiaobo
源程序
//中断服务程序
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
新进展
昨天又仔细看了芯片手册,发现读写的有效脉宽必须大于2倍输入时钟周期。现有的震荡器频率为3.072M,这样需要的读写宽度必须大于670ns,问题就在这里!dsp的主频40M,在增加了7个读写指令周期后,读写宽度也只到100ns,远远达不到芯片的要求。在换了10M的震荡器后,读IIR寄存器可以清除发送中断了。现在A口的发送接收均已正常,B口仍然不能正常操作。其实10M也没达到手册的要求时序,由于手头上没有更高频率的震荡器,因此还要再等等。

9楼: >>参与讨论
jake
我们有比TL16C752性价更好的---XR16M752,我们的Data rate(3.3V)可以达到16M,请跟我联系:jakelei@baite-group.com  13723775328
参与讨论
昵称:
讨论内容:
 
 
相关帖子
求助:TC35I总是找不到网络
SIM300回音问题
那位有电话线插座的pcb封装图,手头上一个在板子上搞不精确
USB线加长以后设备不能识别,如何解决啊,请教!!!
向熟悉无线数传模块的朋友求助!
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号