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

📄 dm642main.c

📁 奇想达QXD-DM642开发板提供的串口uart收发源码。
💻 C
字号:
/******************************************************/
/*  深圳市奇想达科技有限公司QXD-DM642开发板源程序     */
/*  网址:http://www.szqxd.com						  */
/******************************************************/


#include <csl.h>
#include <csl_emifa.h>
#include <csl_irq.h>
#include <csl_chip.h>

#include "QXDdm642.h"
#include "QXDRunLight_uart.h"

/*QXDDM642的emifa的设置结构*/
EMIFA_Config QXDdm642ConfigA ={
	   0x00052078,/*gblctl EMIFA(B)global control register value */
	   			  /*将CLK6、4、1使能;将MRMODE置1;使能EK2EN,EK2RATE*/
	   0xffffffd3,/*cectl0 CE0 space control register value*/
	   			  /*将CE0空间设为SDRAM*/
	   0x73a28e01,/*cectl1 CE1 space control register value*/
	   			  /*Read hold: 1 clock;
	   			    MTYPE : 0000,选择8位的异步接口
	   			    Read strobe :001110;14个clock宽度
	   			    TA:2 clock; Read setup 2 clock;
	   			    Write hold :2 clock; Write strobe: 14 clock
	   			    Write setup :7 clock
	   			    --					 ---------------
	   			  	  \		 14c		/1c
	   			 	   \----------------/ */
	   0x73a28e01, /*cectl2 CE2 space control register value*/
       0x22a28a42, /*cectl3 CE3 space control register value*/
	   0x57115000, /*sdctl SDRAM control register value*/
	   0x0000081b, /*sdtim SDRAM timing register value*/
	   0x001faf4d, /*sdext SDRAM extension register value*/
	   0x00000002, /*cesec0 CE0 space secondary control register value*/
	   0x00000002, /*cesec1 CE1 space secondary control register value*/
	   0x00000002, /*cesec2 CE2 space secondary control register value*/
	   0x00000073 /*cesec3 CE3 space secondary control register value*/	
};

QXDDM642_UART_Config UartConfig ={
	   0x00,/*寄存器IER*/
	   0x57,/*寄存器FCR*/
	   0x03,/*寄存器LCR*/
	   0x01,/*寄存器MCR*/
};

extern far void vectors();

Uint8 IOreadback;
Uint16 buffer;
Uint16 iValue;
QXDDM642_UART_Handle QXDuartHandleA;
QXDDM642_UART_Handle QXDuartHandleB;

/*此程序可将四个采集口的数据经过Video Port0送出*/
void main()
{
	
/*-------------------------------------------------------*/
/* perform all initializations                           */
/*-------------------------------------------------------*/
	/*Initialise CSL,初始化CSL库*/
	CSL_init();
/*----------------------------------------------------------*/
	/*EMIFA的初始化,将CE0设为SDRAM空间,CE1设为异步空间
	 注,DM642支持的是EMIFA,而非EMIF*/
	EMIFA_config(&QXDdm642ConfigA);
/*----------------------------------------------------------*/
	/*中断向量表的初始化*/
	//Point to the IRQ vector table
    IRQ_setVecs(vectors);
    
    
    
    /*----------------------------------------------------------*/
/*测试QXD-DM642的LED*/
   GPIO_RSET(GPGC,0x0);/*将GPIO0不做为GPINT使用*/
    GPIO_RSET(GPEN,0x108);
	GPIO_RSET(GPDIR,0x108);/*将GPIO0做为输出*/
	for(iValue=0;iValue<5;iValue++)
	{
		/*GPIO3输出为高*/
		GPIO_RSET(GPVAL,0x8);
   	QXDDM642_waitusec(5000);
    	/*GPIO3输出为低*/
		GPIO_RSET(GPVAL,0x0);
    	QXDDM642_waitusec(5000);
    	/*GPIO8输出为高*/
		GPIO_RSET(GPVAL,0x100);
   	QXDDM642_waitusec(5000);
    	/*GPIO8输出为低*/
		GPIO_RSET(GPVAL,0x0);
    	QXDDM642_waitusec(5000);

    }
//}
/* Spin in a delay loop for delay iterations */


    
    /*----------------------------------------------------------*/
/*测试QXDDM642的数字输入与输出*/    
    
    /*输出测试值*/
    QXDDM642_rset(QXDDM642_IOOUT, 0x55);
    /*延时1ms时间*/
    QXDDM642_waitusec(1);
    /*读回测试值*/
    IOreadback = QXDDM642_rget(QXDDM642_IOOUT);
    /*延时1ms时间*/
    QXDDM642_waitusec(1);
    
    /*输出测试值*/
    QXDDM642_rset(QXDDM642_IOOUT, 0xaa);
    /*延时1ms时间*/
    QXDDM642_waitusec(1);
    /*读回测试值*/
    IOreadback = QXDDM642_rget(QXDDM642_IOOUT);
    /*延时1ms时间*/
    QXDDM642_waitusec(1);
    
    /*输出测试值*/
    QXDDM642_rset(QXDDM642_IOOUT, 0x33);
    /*延时1ms时间*/
    QXDDM642_waitusec(1);
    /*读回测试值*/
    IOreadback = QXDDM642_rget(QXDDM642_IOOUT);
    /*延时1ms时间*/
    QXDDM642_waitusec(1);
/*----------------------------------------------------------*/
/*测试串口A*/
    /* Open UART */
    QXDuartHandleA = QXDDM642_UART_open(QXDDM642_UARTA, 
    									  QXDDM642_UART_BAUD9600, 
    									  &UartConfig);
     for (;;)
  {
        /*GPIO3输出为高*/
		GPIO_RSET(GPVAL,0x8);
   		QXDDM642_waitusec(50);
        buffer = QXDDM642_UART_getChar(QXDuartHandleA);
        /*GPIO3输出为低*/
		GPIO_RSET(GPVAL,0x0);
    	QXDDM642_waitusec(500);
    	
    	
    	/*GPIO8输出为高*/
		GPIO_RSET(GPVAL,0x100);
   		QXDDM642_waitusec(50);
        QXDDM642_UART_putChar(QXDuartHandleA, (buffer & 0xff));  
        /*GPIO8输出为低*/
		GPIO_RSET(GPVAL,0x0);
    	QXDDM642_waitusec(500);
    	
    }
} 
    
    //////////////////////////////QXDdm642_cpld.c///////////////Start
    
    /* Read an 8-bit value from a CPLD register */
Uint8 QXDDM642_rget(Int16 regnum)
{
    Uint8 *pdata;
    
    /* Return lower 8 bits of register */
    pdata = (Uint8 *)(QXDDM642_CPLD_BASE + regnum);
    return (*pdata & 0xff);
}

/* Write an 8-bit value to a CPLD register */
void QXDDM642_rset(Int16 regnum, Uint8 regval)
{
    Uint8 *pdata;
    
    /* Write lower 8 bits of register */
    pdata = (Uint8 *)(QXDDM642_CPLD_BASE + regnum);
    *pdata = (regval & 0xff);
}

/* Spin in a delay loop for delay iterations */
void QXDDM642_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 QXDDM642_waitusec(Uint32 delay)
{
    QXDDM642_wait(delay * 1000);
}

    
    //////////////////////////////QXDdm642_cpld.c///////////////End
    
    //**********************************************************
    //////////////////////////////QXDdm642_uart.c///////////////Start
    
    /**************************************************************************/
/*  Copyright 2003 by QXD.                                               */
/*  All rights reserved. Property of QXD.                                */
/**************************************************************************/
 
/*
 *  ======== QXDdm642_uart.c ========
 *  UART module for the QXDDM642
 */
 


/***************************************************************************/
/*  ======== QXDDM642_UART_rset ========								   */
/*  Set a UART register,设置寄存器										   */
/***************************************************************************/
void QXDDM642_UART_rset(QXDDM642_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 = QXDDM642_UART_rget(hUart, QXDDM642_UART_LCR);
        QXDDM642_waitusec(1);
        QXDDM642_UART_rset(hUart, QXDDM642_UART_LCR, lcr | 0x80);
        QXDDM642_waitusec(1);
        QXDDM642_rset(regindex, regval);
        QXDDM642_waitusec(1);
        QXDDM642_UART_rset(hUart, QXDDM642_UART_LCR, lcr);
        QXDDM642_waitusec(1);
    }
    else
    {
        
        QXDDM642_rset(regindex, regval);
        QXDDM642_waitusec(1);
    }
}
/**********************************************************************/
/*  ======== QXDDM642_UART_rget ========							  */
/*  Get the value of a UART register,读出寄存器的值					  */
/**********************************************************************/
Int16 QXDDM642_UART_rget(QXDDM642_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 = QXDDM642_UART_rget(hUart, QXDDM642_UART_LCR);
        QXDDM642_UART_rset(hUart, QXDDM642_UART_LCR, lcr | 0x80);
        returnval = QXDDM642_rget(regindex);
        QXDDM642_UART_rset(hUart, QXDDM642_UART_LCR, lcr);
    }
    else
    {
        returnval = QXDDM642_rget(regindex);
    }
    
    return returnval;
}


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

    /*设置MCR*/
    QXDDM642_UART_rset(hUart, QXDDM642_UART_MCR,config -> regs[3]);
    /*将EFR寄存器的第4位关闭*/
    QXDDM642_UART_rset(hUart, QXDDM642_UART_EFR, dl);
    
    /*设置串口的MCR*/
    QXDDM642_UART_rset(hUart, QXDDM642_UART_MCR, config -> regs[3]);
    
    /*设置串口的IER*/
    QXDDM642_UART_rset(hUart, QXDDM642_UART_IER, config -> regs[0]);
    /*设置串口的FCR*/
    QXDDM642_UART_rset(hUart, QXDDM642_UART_FCR, config -> regs[1]);	
    /*设置串口的LCR*/
    QXDDM642_UART_rset(hUart, QXDDM642_UART_LCR, config -> regs[2]);

    /* Set up baud divisor clock,设置波待率 */
    dl = QXDDM642_UART_rget(hUart, QXDDM642_UART_MCR);
    if((dl & 0x80)==0x80)
    {
    	baudrate = (baudrate/4);	
    }
    QXDDM642_UART_rset(hUart, QXDDM642_UART_DLL, baudrate & 0xff);
    dl = QXDDM642_UART_rget(hUart, QXDDM642_UART_DLL);
    QXDDM642_UART_rset(hUart, QXDDM642_UART_DLH, (baudrate >> 8) & 0xff);
    dl = QXDDM642_UART_rget(hUart, QXDDM642_UART_DLH);
    /* Clear any outstanding receive characters,清空接收寄存器 */
    QXDDM642_UART_rget(hUart, QXDDM642_UART_RBR);
    
    return hUart;
}

/*********************************************************************/
/*  ======== QXDDM642_UART_getChar ========							 */
/*  Get one character of data from the UART,读取数据			     */
/*********************************************************************/
Int16 QXDDM642_UART_getChar(QXDDM642_UART_Handle hUart)
{
    Int16 status;
    
    while(1)
    {
        status = QXDDM642_UART_rget(hUart, QXDDM642_UART_LSR);
        if ((status & 1) != 0)  // DR
            break;
    }
    
    return QXDDM642_UART_rget(hUart, QXDDM642_UART_RBR);
}

/*********************************************************************/
/*  ======== QXDDM642_UART_putChar ========				     		 */
/*  Send one character of data to the UART,发送一个数据			     */
/*********************************************************************/
void QXDDM642_UART_putChar(QXDDM642_UART_Handle hUart, Uint16 data)
{
    Int16 status;
    
    while(1)
   {
        status = QXDDM642_UART_rget(hUart, QXDDM642_UART_LSR);
        if ((status & 0x20) != 0)  // THRE
            break;
    }
//    QXDDM642_waitusec(3);    
    QXDDM642_UART_rset(hUart, QXDDM642_UART_THR, data);

}


    
    //////////////////////////////QXDdm642_uart.c///////////////End
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
   


//void QXDDM642_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 QXDDM642_waitusec(Uint32 delay)
//{
 //   QXDDM642_wait(delay * 1000);
//}




     

⌨️ 快捷键说明

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