网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 61IC中国电子在线 >> DSP >> 代码示例 >> ADI DSP代码示例 >> Blackfin >> 文章正文
  TL16C752 串口扩展芯片驱动源代码         ★★★ 【字体:
TL16C752 串口扩展芯片驱动源代码
作者:61IC    文章来源:本站原创    点击数:    更新时间:2007-1-22    

#include "uart.h"

/***************************************************************************/
/*  ======== UART_rset ========           */
/*  Set a UART register,设置寄存器             */
/***************************************************************************/
void UART_rset(Int16 regnum,Int16 regval)
{
    Int16 regindex, lcr;
   
    /* Register index is determined by lower 3 bits and the target UART */
   
    //regindex = regnum & 0x7;
//    if (hUart == 1)
//        regindex += 8;
    /*是否为高位的寄存器*/
    /* If regnum between 0x08 and 0x0F, set bit 7 of LCR to access register */
    //if ((regnum & 0x18) == 0x8)
    if((regnum >= 0x10) && (regnum <= 0x1e))
    {
        lcr = rget(TL_UART_LCR);
        waitusec(1);
        rset(TL_UART_LCR, lcr | 0x80);
        waitusec(1);
        rset(regnum, regval);
        waitusec(1);
        rset(TL_UART_LCR, lcr);
        waitusec(1);
    }
    else
    {
       
        rset(regnum, regval);
        waitusec(1);
    }
}

/**********************************************************************/
/*  ======== UART_rget ========         */
/*  Get the value of a UART register,读出寄存器的值       */
/**********************************************************************/
Int16 UART_rget(Int16 regnum)
{
    Int16 regindex, returnval, lcr;
   
    /* Register index is determined by lower 3 bits and the target UART */
    //regindex = regnum & 0x7;
//    if (hUart == 1)
//        regindex += 8;
   
    /* If regnum between 0x08 and 0x0F, set bit 7 of LCR to access register */
    //if ((regnum & 0x18) == 0x8)
    if((regnum >= 0x10) && (regnum <= 0x1e))
    {
        lcr = rget(TL_UART_LCR);
        rset(TL_UART_LCR, lcr | 0x80);
        returnval = rget(regnum);
        rset(TL_UART_LCR, lcr);
    }
    else
    {
        returnval = rget(regnum);
    }
   
    return returnval;
}

/**************************************************************************/
/*  ======== UART_open ========                                 */
/*  Initialize UART and return handle           */
/* 描述:打开相应的串口,并进行相应的配置          */
/* 输入参数:                    */
/*  devid: 选择UART的通路             */
/*  baudrate: 选择正确的波待率            */
/*     config:   其它配置其它的参数组           */
/**************************************************************************/
void UART_open(Int16 baudrate,UART_Config *config)
{
//    UART_Handle hUart;
    //Int16 dl;
    Int8 dl,test;
    /* Assign handle */
//    hUart = devid;
   
    /* Set registers based on config structure */

    /*设置MCR*/
    UART_rset(TL_UART_MCR,config -> regs[3]);
    //test = UART_rget(TL_UART_MCR);
    /*将EFR寄存器的第4位关闭*/
    dl = UART_rget(TL_UART_EFR);
    UART_rset(TL_UART_EFR, dl & 0xEF);
    //test = UART_rget(TL_UART_EFR);
   
    /*设置串口的MCR*/
    UART_rset(TL_UART_MCR, config -> regs[3]);
    //test = UART_rget(TL_UART_MCR);
   
    /*设置串口的IER*/
    UART_rset(TL_UART_IER, config -> regs[0]);
    //test = UART_rget(TL_UART_IER);
    /*设置串口的FCR*/
    UART_rset(TL_UART_FCR, config -> regs[1]);
    //test = UART_rget(TL_UART_FCR); 
    /*设置串口的LCR*/
    UART_rset(TL_UART_LCR, config -> regs[2]);
    //test = UART_rget(TL_UART_LCR);

    /* Set up baud divisor clock,设置波待率 */
    dl = UART_rget(TL_UART_MCR);
    if((dl & 0x80)==0x80)
    {
     baudrate = (baudrate/4); 
    }
    //UART_rset(TL_UART_DLL, baudrate & 0xff);
    UART_rset(TL_UART_DLL, 0x50);
    dl = UART_rget(TL_UART_DLL);
    //UART_rset(TL_UART_DLH, (baudrate >> 8) & 0xff);
    UART_rset(TL_UART_DLH, 0x00);
    dl = UART_rget(TL_UART_DLH);
    /* Clear any outstanding receive characters,清空接收寄存器 */
    UART_rget(TL_UART_RBR);
   
//    return hUart;
}

/*********************************************************************/
/*  ======== UART_getChar ========        */
/*  Get one character of data from the UART,读取数据        */
/*********************************************************************/
Int16 UART_getChar(void)
{
    Int16 status;
   
    while(1)
    {
        status = UART_rget(TL_UART_LSR);
        if ((status & 1) != 0)  // DR
            break;
    }
   
    return
     UART_rget(TL_UART_RBR);
}

/*********************************************************************/
/*  ======== UART_putChar ========            */
/*  Send one character of data to the UART,发送一个数据        */
/*********************************************************************/
void UART_putChar(Uint16 data)
{
    Int16 status;
   
    while(1)
    {
        status = UART_rget(TL_UART_LSR);
        if ((status & 0x20) != 0)  // THRE
            break;
    }
//    SEEDDM642_waitusec(3);   
    UART_rset(TL_UART_THR, data);

}

void UART_puts(const char *s)
{
 while (*s) {
  UART_putChar(*s++);
 }
}

/* Spin in a delay loop for delay iterations */
void wait(Uint32 delay)
{
    volatile Uint32 i, n;
   
    n = 0;
    for (i = 0; i < delay; i++)
    {
        n = n + 1;
    }
}

/* Spin in a delay loop for delay microseconds */
void waitusec(Uint32 delay)
{
    wait(delay * 21);
}

Uint8 rget(Int16 regnum)
{
    Uint8 *pdata;
   
    /* Return lower 8 bits of register */
    pdata = (Uint8 *)(UART_BASE + regnum);
    return (*pdata & 0xff);
}

void rset(Int16 regnum, Uint8 regval)
{
    Uint8 *pdata;
   
    /* Write lower 8 bits of register */
    pdata = (Uint8 *)(UART_BASE + regnum);
    *pdata = (regval & 0xff);
}

               欢迎点击进入:TI德州中文网   (国内唯一针对TI应用的中文技术网站)    文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    矩阵乘法源代码
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61IC 湘ICP备05002478号