📄 dm642main.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 + -