⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 seeddm642_uart.c

📁 这是测试SEED-VPM642系统中两路串口及开入与开出的程序
💻 C
字号:
/**************************************************************************/
/*  Copyright 2003 by SEED.                                               */
/*  All rights reserved. Property of SEED.                                */
/**************************************************************************/
 
/*
 *  ======== seeddm642_uart.c ========
 *  UART module for the SEEDDM642
 */
 
#include <csl.h>

#include "seeddm642.h"
#include "seeddm642_uart.h"

/***************************************************************************/
/*  ======== SEEDDM642_UART_rset ========								   */
/*  Set a UART register,设置寄存器										   */
/***************************************************************************/
void SEEDDM642_UART_rset(SEEDDM642_UART_Handle hUart, 
						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)
    {
        lcr = SEEDDM642_UART_rget(hUart, SEEDDM642_UART_LCR);
        SEEDDM642_waitusec(1);
        SEEDDM642_UART_rset(hUart, SEEDDM642_UART_LCR, lcr | 0x80);
        SEEDDM642_waitusec(1);
        SEEDDM642_rset(regindex, regval);
        SEEDDM642_waitusec(1);
        SEEDDM642_UART_rset(hUart, SEEDDM642_UART_LCR, lcr);
        SEEDDM642_waitusec(1);
    }
    else
    {
        
        SEEDDM642_rset(regindex, regval);
        SEEDDM642_waitusec(1);
    }
}
/**********************************************************************/
/*  ======== SEEDDM642_UART_rget ========							  */
/*  Get the value of a UART register,读出寄存器的值					  */
/**********************************************************************/
Int16 SEEDDM642_UART_rget(SEEDDM642_UART_Handle hUart, 
						 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)
    {
        lcr = SEEDDM642_UART_rget(hUart, SEEDDM642_UART_LCR);
        SEEDDM642_UART_rset(hUart, SEEDDM642_UART_LCR, lcr | 0x80);
        returnval = SEEDDM642_rget(regindex);
        SEEDDM642_UART_rset(hUart, SEEDDM642_UART_LCR, lcr);
    }
    else
    {
        returnval = SEEDDM642_rget(regindex);
    }
    
    return returnval;
}


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

    /*设置MCR*/
    SEEDDM642_UART_rset(hUart, SEEDDM642_UART_MCR,config -> regs[3]);
    /*将EFR寄存器的第4位关闭*/
    SEEDDM642_UART_rset(hUart, SEEDDM642_UART_EFR, dl);
    
    /*设置串口的MCR*/
    SEEDDM642_UART_rset(hUart, SEEDDM642_UART_MCR, config -> regs[3]);
    
    /*设置串口的IER*/
    SEEDDM642_UART_rset(hUart, SEEDDM642_UART_IER, config -> regs[0]);
    /*设置串口的FCR*/
    SEEDDM642_UART_rset(hUart, SEEDDM642_UART_FCR, config -> regs[1]);	
    /*设置串口的LCR*/
    SEEDDM642_UART_rset(hUart, SEEDDM642_UART_LCR, config -> regs[2]);

    /* Set up baud divisor clock,设置波待率 */
    dl = SEEDDM642_UART_rget(hUart, SEEDDM642_UART_MCR);
    if((dl & 0x80)==0x80)
    {
    	baudrate = (baudrate/4);	
    }
    SEEDDM642_UART_rset(hUart, SEEDDM642_UART_DLL, baudrate & 0xff);
    dl = SEEDDM642_UART_rget(hUart, SEEDDM642_UART_DLL);
    SEEDDM642_UART_rset(hUart, SEEDDM642_UART_DLH, (baudrate >> 8) & 0xff);
    dl = SEEDDM642_UART_rget(hUart, SEEDDM642_UART_DLH);
    /* Clear any outstanding receive characters,清空接收寄存器 */
    SEEDDM642_UART_rget(hUart, SEEDDM642_UART_RBR);
    
    return hUart;
}

/*********************************************************************/
/*  ======== SEEDDM642_UART_getChar ========							 */
/*  Get one character of data from the UART,读取数据			     */
/*********************************************************************/
Int16 SEEDDM642_UART_getChar(SEEDDM642_UART_Handle hUart)
{
    Int16 status;
    
    while(1)
    {
        status = SEEDDM642_UART_rget(hUart, SEEDDM642_UART_LSR);
        if ((status & 1) != 0)  // DR
            break;
    }
    
    return SEEDDM642_UART_rget(hUart, SEEDDM642_UART_RBR);
}

/*********************************************************************/
/*  ======== SEEDDM642_UART_putChar ========				     		 */
/*  Send one character of data to the UART,发送一个数据			     */
/*********************************************************************/
void SEEDDM642_UART_putChar(SEEDDM642_UART_Handle hUart, Uint16 data)
{
    Int16 status;
    
    while(1)
   {
        status = SEEDDM642_UART_rget(hUart, SEEDDM642_UART_LSR);
        if ((status & 0x20) != 0)  // THRE
            break;
    }
//    SEEDDM642_waitusec(3);    
    SEEDDM642_UART_rset(hUart, SEEDDM642_UART_THR, data);

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -