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

📄 dm642main.c

📁 DM642四路图像采集存储程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <csl.h>
#include <csl_emifa.h>
#include <csl_i2c.h>
#include <csl_gpio.h>
#include <csl_irq.h>
#include <csl_chip.h>
#include <csl_dat.h>
#include "iic.h"
#include "vportcap.h"
#include "vportdis.h"
#include "sa7121h.h"
#include "TVP51xx.h"

/*emifa设置结构*/
EMIFA_Config Seeddm642ConfigA ={
	   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,//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
	   			 	   \----------------/ */
	   0x22a28a22, /*cectl2 CE2 space control register value*/
       0xffffff03,//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*/
	   0x00000002,//0x00000073 /*cesec3 CE3 space secondary control register value*/	
};

/*SEEDDM642的IIC的设置结构*/
I2C_Config SEEDDM642IIC_Config = {
    0,  /* master mode,  i2coar;采用主模式   */
    0,  /* no interrupt, i2cimr;只写,不读,采用无中断方式*/
    (20-5), /* scl low time, i2cclkl;  */
    (20-5), /* scl high time,i2cclkh;  */
    1,  /* configure later, i2ccnt;*/
    0,  /* configure later, i2csar;*/
    0x4ea0, /* master tx mode,     */
            /* i2c runs free,      */
            /* 8-bit data + NACK   */
            /* no repeat mode      */
    (75-1), /* 4MHz clock, i2cpsc  */
};




CHIP_Config SEEDDM642percfg = {          //配置DSP工作环境,使能VP口,使能I2C模块 
	CHIP_VP2+\
	CHIP_VP1+\
	CHIP_VP0+\
	CHIP_I2C
};

I2C_Handle hSeeddm642i2c;
int portNumber;
int portNumber1;
int portNumber2;

extern SA7121H_ConfParams sa7121hPAL[45];
extern SA7121H_ConfParams sa7121hNTSC[45];
Uint8 vFromat = 0;//用于TVP5150寄存器配置
Uint8 misc_ctrl = 0x6D;//用于TVP5150寄存器配置
Uint8 output_format = 0x47;//用于TVP5150寄存器配置


// 地址为0 for cvbs port1,选择复合信号做为输入
Uint8 input_sel = 0x00;
/*地址为0xf,将Pin27设置成为CAPEN功能*/	
Uint8 pin_cfg = 0x02;
/*地址为1B*/
Uint8 chro_ctrl_2 = 0x14;
/*图像句柄的声明*/
VP_Handle vpHchannel0;
VP_Handle vpHchannel1;
VP_Handle vpHchannel2;

/*确定图像的参数*/
int numPixels = 720;//每行720个像素
int numLines  = 576;//每帧576行(PAL)
/*采集与存储缓冲区的首址*/
Uint32 capYbuffer  = 0x80000000;
Uint32 capCbbuffer = 0x800675c0;
Uint32 capCrbuffer = 0x8009b0a0;
//Uint32 capCbbuffer = 0x6190;  
//Uint32 capCrbuffer = 0x6190;

Uint32 disYbuffer  = 0x80100000;
Uint32 disCbbuffer = 0x801675c0; 
Uint32 disCrbuffer = 0x8019b0a0;


Uint32 disYbuffer1  = 0x80200000;
Uint32 disCbbuffer1 = 0x802675c0; 
Uint32 disCrbuffer1 = 0x8029b0a0;

Uint32 disYbuffer2  = 0x80300000;
Uint32 disCbbuffer2 = 0x803675c0; 
Uint32 disCrbuffer2 = 0x8039b0a0;


Uint32 disYbuffer3  = 0x80400000;
Uint32 disCbbuffer3 = 0x804675c0; 
Uint32 disCrbuffer3 = 0x8049b0a0;
/*图像格式标志*/
Uint8 NTSCorPAL = 0;
extern far void vectors();
/*图像采集完成标志*/
extern volatile Uint32 capNewFrame;//u4采集完成标志,在VP口采集完成中断程序中置一,
                                   //表示当前图像已经采集完成,下同。
extern volatile Uint32 capNewFrame1;//u2采集完成标志
extern volatile Uint32 capNewFrame2;//u7采集完成标志
extern volatile Uint32 capNewFrame3;//u9采集完成标志
extern volatile Uint32 disNewFrame;
/*EDMA打开标志与VP2口的A,B通道判断标志*/
extern volatile Uint8 ED;
extern volatile Uint8 WV;

/*此程序可将四个采集口的数据经过Video Port0送出*/
void main()
{
	Uint8 addrI2C;
	int i;
/*-------------------------------------------------------*/
/* perform all initializations                           */
/*-------------------------------------------------------*/
	/*Initialise CSL,初始化CSL库*/
	CSL_init();
	CHIP_config(&SEEDDM642percfg);
/*----------------------------------------------------------*/
	/*EMIFA的初始化,将CE0设为SDRAM空间,CE1设为异步空间
	 注,DM642支持的是EMIFA,而非EMIF*/
	EMIFA_config(&Seeddm642ConfigA);
/*----------------------------------------------------------*/
	/*中断向量表的初始化*/
	//Point to the IRQ vector table
    IRQ_setVecs(vectors);
    IRQ_nmiEnable();
    IRQ_globalEnable();
    IRQ_map(IRQ_EVT_VINT1, 11);//即将VP1通道中断对应为CPU中断11.
    IRQ_map(IRQ_EVT_VINT0, 10);//即将VP0通道中断对应为CPU中断10.
    IRQ_map(IRQ_EVT_VINT2, 12);//即将VP2通道中断对应为CPU中断12.
    IRQ_reset(IRQ_EVT_VINT1);
    IRQ_reset(IRQ_EVT_VINT1);
    /*打开一个数据拷贝的数据通路*/
    DAT_open(DAT_CHAANY, DAT_PRI_LOW, DAT_OPEN_2D);	
/*----------------------------------------------------------*/	
	/*进行IIC的初始化*/
	hSeeddm642i2c = I2C_open(I2C_PORT0,I2C_OPEN_RESET);
	I2C_config(hSeeddm642i2c,&SEEDDM642IIC_Config);
/*----------------------------------------------------------*/
/*烧写flash时设置标志位*/
    GPIO_RSET(GPGC,0x0);
    GPIO_RSET(GPEN,0xffff);
    
	GPIO_RSET(GPDIR,0xffff);
/*	for(;;)
	{
	GPIO_RSET(GPVAL,0xffff);
	EVMDM642_waitusec(100000);
	GPIO_RSET(GPVAL,0x0);
	EVMDM642_waitusec(100000);
	}
*/

	/*进行TVP5150pbs的初始化*/
	/*选择TVP5150,设置第三通路*/
	GPIO_RSET(GPGC,0x0);/*将GPIO0不做为GPINT使用*/
	GPIO_RSET(GPDIR,0x1);/*将GPIO0做为输出*/
	GPIO_RSET(GPVAL,0x0);/*GPIO0输出为高,选择IIC1总线,配置
						   各路采集通道,顺序依次为u4,u2,u7,u9*/
	addrI2C = 0xB8 >>1;
    _IIC_write(hSeeddm642i2c, addrI2C,0x00, input_sel);//四个参数依次为I2C Handle(I2C_open函数返回值),
                                                       //从器件地址,寄存器地址,需要配置的寄存器值
    _IIC_write(hSeeddm642i2c, addrI2C,0x03, misc_ctrl);
    _IIC_write(hSeeddm642i2c, addrI2C,0x0D, output_format);
    _IIC_write(hSeeddm642i2c, addrI2C,0x0F, pin_cfg);
    _IIC_write(hSeeddm642i2c, addrI2C,0x1B, chro_ctrl_2);
    /*回读当前摄像设备的格式,不需要关注*/
   _IIC_read(hSeeddm642i2c, addrI2C,0x8c, &vFromat);
       vFromat = vFromat & 0xff;
	switch (vFromat)
	{
		case TVP51XX_NTSCM:
		case TVP51XX_NTSC443:
			NTSCorPAL = 1;/*系统为NTSC的模式*/
			break;
		case TVP51XX_PALBGHIN:
		case TVP51XX_PALM:
			NTSCorPAL = 0;/*系统为PAL的模式*/
			break;
		default:
			NTSCorPAL = 2;/*系统为不支持的模式*/
			break;
	}
	if(NTSCorPAL ==2)
	{
		/*系统不支持的模式,重新配置*/
		for(;;)
		{}
	}  		  
    
    addrI2C = 0xBA >>1;
    _IIC_write(hSeeddm642i2c, addrI2C,0x00, input_sel);
    _IIC_write(hSeeddm642i2c, addrI2C,0x03, misc_ctrl);
    _IIC_write(hSeeddm642i2c, addrI2C,0x0D, output_format);
    _IIC_write(hSeeddm642i2c, addrI2C,0x0F, pin_cfg);
    _IIC_write(hSeeddm642i2c, addrI2C,0x1B, chro_ctrl_2);
    
    
    GPIO_RSET(GPVAL,0x1);
	EVMDM642_waitusec(100);
	addrI2C = 0xBA >>1;
    _IIC_write(hSeeddm642i2c, addrI2C,0x00, input_sel);
    _IIC_write(hSeeddm642i2c, addrI2C,0x03, misc_ctrl);
    _IIC_write(hSeeddm642i2c, addrI2C,0x0D, output_format);
    _IIC_write(hSeeddm642i2c, addrI2C,0x0F, pin_cfg);
    _IIC_write(hSeeddm642i2c, addrI2C,0x1B, chro_ctrl_2);
    
    
    EVMDM642_waitusec(100);
	addrI2C = 0xB8 >>1;
    _IIC_write(hSeeddm642i2c, addrI2C,0x00, input_sel);
    _IIC_write(hSeeddm642i2c, addrI2C,0x03, misc_ctrl);
    _IIC_write(hSeeddm642i2c, addrI2C,0x0D, output_format);
    _IIC_write(hSeeddm642i2c, addrI2C,0x0F, pin_cfg);
    _IIC_write(hSeeddm642i2c, addrI2C,0x1B, chro_ctrl_2);
    EVMDM642_waitusec(100);
    

⌨️ 快捷键说明

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