打印

用tl16c752扩展串口遇到的问题

[复制链接]
3485|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hexiaobo|  楼主 | 2007-1-8 18:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
采用tms320lf2407主控芯片,扩展一片tl16c752b,采用中断方式。通讯调试始终有问题:
1、关闭tl16c752的fifo,只打开接收中断或发送中断,接收或发送工作正常;
2、当同时打开接收、发送中断时,发送接收中断均不能正常进入;
3、打开fifo,关闭流控制,trigger level设为16byte,只打开接收中断时,接收数据基本正常,但每次time_out中断会多进入一次;
4、打开fifo时,发送始终不能正常工作。当连续往thr中存入多个数据时,tx脚不能发送数据;当仅往thr中存入一个数据时,数据可以发送出来,但其后程序再也不能进入中断处理程序。
  请高手指点,调了一个星期,网上查了一大通,找不出毛病。另外流控制是否一定需要(包括硬件流、软件流)?多谢了!

相关帖子

沙发
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
我相信芯片轻易不会出问题,估计还是你软件的问题,强烈建议用FIFO方式,这样能节省CPU大量处理时间,另外在每次查询到FIFO中有错误的时候要重新初始化一下这个芯片,这一点很重要

使用特权

评论回复
5
hexiaobo|  楼主 | 2007-1-24 10:05 | 只看该作者

新的进展

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

使用特权

评论回复
6
hexiaobo|  楼主 | 2007-1-24 10:20 | 只看该作者

源程序

//中断服务程序
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;
    Delay(2);
    IER_DLH_A=HBaudrateTableCom;
    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脚不能转为低电平,中段不能被复位,现在问题的症结就在这里了。
各位大佬一起帮忙分析一下,多谢!

使用特权

评论回复
7
hexiaobo|  楼主 | 2007-1-25 09:41 | 只看该作者

新进展

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

使用特权

评论回复
8
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

粉丝