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

📄 demo.c

📁 这是基于5402DSP的C语言程序
💻 C
字号:
//////////////////////////////////////////////
// 1.在程序中"break point"注释行语句上加软件断点
// 2.菜单view->graph->Image:
//     color space                  = RGB
//     Start Address -R Source      = y
//     Start Address -G Source      = y
//     Start Address -B Source      = y
//     Lines Per Display            = 96
//     Pixels Per Line              = 120
//     Byte Packing to Fill 32 Bits = No
//     Image Origin                 = Top Left
// 3.按F5运行到断点可显示采集图像
// 4.转动摄像头后再按F5可再次采集
///////////////////////////////////////
#include "math.h"
#include "scancode.h"
#include "stdio.h"

#define SPSA0 *(unsigned int *)0x38
#define SPSD0 *(unsigned int *)0x39
#define REGISTERCLKMD (*(unsigned int *)0x58)
#define REGISTERCLK (*(unsigned int *)0x29)
#define WAITSTATUS (*(unsigned int *)0x28)

#define IDKCCMDRESET 2
#define IDKCCMDCAPTURE 4
#define IDKCCMDRESETRP 8
#define IDKCCMDRESETWP 0x10
#define IDKCCMDCOLOR 0x20
#define IDKIMGREADY 2

ioport unsigned char port8000;	
ioport unsigned char port8001;	
ioport unsigned char port8002;	
ioport unsigned char port8007;	
ioport unsigned char porta000;	
ioport unsigned char porta001;	
ioport unsigned char porta004;	
ioport unsigned int porta005;	
ioport unsigned int porta006;	
ioport unsigned char porta008;	
ioport unsigned char porta00c;	
#define I2C_REG porta008

void Delay(unsigned int nTime);
void StartIIC(void);
void StopIIC(void);
void AckIIC(void);
void WriteIIC(unsigned char data);
void Init5150(void);
void DelayMSEC(unsigned int nDelay);
void Close5150(void);

void SaveAsBMPFile(int nWidth,int nHeight);

#define VIDEOWIDTH 722
#define VIDEOHEIGHT 288
#define IMGWIDTH 120
#define IMGHEIGHT 96
#define XSTART 300
#define YSTART 100
#define XSAMPLE 2
#define YSAMPLE 1

unsigned char buffer[724],y[IMGWIDTH*IMGHEIGHT];

 unsigned long imgoffset;

ioport unsigned int port0;

main()
{
   	int i,j,x,xx,xxx;
	int c,xstart,ystart,xsample,ysample;
	unsigned int uWork;
    
    port0=1;
    
	xx=1;
	for ( j=0;j<72;j++ )
	{
		for ( i=0;i<90;i++ )
			y[j*90+i]=0;
	}
	port8000=0;	// 初始化ICETEK-CTR
	port8000=0x80;
	port8000=0;
	port8007=0;
	port8007=0x40;

	c=0;
	xsample=XSAMPLE;
	ysample=YSAMPLE;
	xstart=XSTART;
	ystart=YSTART;
	REGISTERCLKMD=0;	// DSP低速运行
	REGISTERCLK=0x6002;	// 设置CLKOUT输出
	WAITSTATUS&=0x08fff;	// 等待状态
	Init5150();		// 初始化ICETEK-TVP5150-E
	REGISTERCLKMD=0x09007;	// DSP提速运行
	WAITSTATUS=0x09fff;	// 至少1个等待状态
	REGISTERCLK=0x6002;
	xxx=porta00c;
	
	while ( 1 )
	{
		if ( xx )
		{
			porta000=IDKCCMDRESET; porta000=0;	//复位ICETEK-TVP5150-E
			Delay(16);
			porta000=IDKCCMDRESETWP;		// 复位FIFO写指针
			porta000=IDKCCMDCAPTURE;		// 开始采集图象
			do
			{
				xxx=porta00c;			// 读状态寄存器
			} while ( (xxx&2)==0 );			// 等待图象准备好
			porta000=0;
		}
		x=0;
		porta000=IDKCCMDRESETRP;			// 复位FIFO读指针
		Delay(16);		
		porta000=0;	
		Delay(16);		
		uWork=porta004;					// 读取首个数据并放弃
		Delay(16);		
		x=0;
		for ( i=0;i<724;i++ )	buffer[i]=0;
		for ( i=0;i<c;i++ )	uWork=porta004;
		for ( j=0;j<VIDEOHEIGHT;j++ )			// 读取整幅图象722x288
		{						// 并抽样生成120x96图象
			for ( i=0;i<VIDEOWIDTH;i++ )
			{
				buffer[i]=porta004;
			}
			if ( x<IMGHEIGHT && j>=ystart &&(j%ysample==0) )
			{
				for ( i=0;i<IMGWIDTH;i++ )
				{
					y[x*IMGWIDTH+i]=buffer[i*xsample+xstart];
				}
				x++;
			}
		}
		xxx=porta00c;
		SaveAsBMPFile(VIDEOWIDTH,VIDEOHEIGHT);
		x=0;		// BREAK POINT 
		x=0;
		x=0;
	}
}               

void Delay(unsigned int nDelay)
{
	int i,j,k=0;
	for ( i=0;i<nDelay;i++ )
		for ( j=0;j<64;j++ )
			k++;
}

void StartIIC(void)
{
	I2C_REG = 0x05;		/*	"00100101":sda,scl = '1' */
	DelayMSEC(1);
	I2C_REG = 0x04;		/*	"00100100":sda= '0',scl = '1' */
	DelayMSEC(1);
}
void StopIIC(void)
{	
	I2C_REG = 0x024;		/*	"00100101":sda = '0',scl = '1' */
	DelayMSEC(1);
	I2C_REG = 0x025;		/*	"00100101":sda,scl = '1' */
	DelayMSEC(1);
}		
void AckIIC(void)
{
	I2C_REG = 0x020;		/*	"00100101":sda='z',scl = '0' */
	I2C_REG = 0x022;		/*	"00100101":sda='z',scl = '0' */
	DelayMSEC(1);
	I2C_REG = 0x026;		/*	"00100101":sda='z',scl = '1' */
	DelayMSEC(1);
	I2C_REG = 0x022;		/*	"00100101":sda='z',scl = '0' */
	DelayMSEC(1);
	I2C_REG = 0x021;		/*	"00100101":sda='1',scl = '0' */
	DelayMSEC(1);
}	
void WriteIIC(unsigned char data)
{
	unsigned char BitCounter = 8;
	unsigned char Temp;
	unsigned int reg_val;
	
	reg_val = 0x020;
	I2C_REG = 0x20;		/*SCL 置低 sda 置低*/
	DelayMSEC(1);						/*延时*/
	do{
		Temp = data;
		reg_val &= 0x0fffffffb;
		I2C_REG = reg_val;		/*SCL 置低*/
		DelayMSEC(1);						/*延时*/
		
		if((Temp&0x80)==0x80)
			reg_val |= 0x01;	/*如果最高位是1*/
		else
			reg_val &= 0x0fffffe;
		I2C_REG = reg_val;		/*设置SDA*/
		DelayMSEC(1);						/*延时*/

		reg_val |= 0x004;
		I2C_REG = reg_val;		/*SCL 置高*/
		DelayMSEC(1);						/*延时*/

		Temp = data<<1;
		data = Temp;
		BitCounter --;
	}while(BitCounter);

	reg_val &= 0x0fffffffb;
	I2C_REG = reg_val;		/*SCL 置低*/
	DelayMSEC(3);						/*延时*/
}	

void Init5150(void)
{	
	StartIIC();
	WriteIIC(0x0ba);			
	AckIIC();
	WriteIIC(0x03);		// TVP5150控制寄存器3,取值0x8F
	AckIIC();
	WriteIIC(0x08f);
	AckIIC();
	StopIIC();
	DelayMSEC(10);
}

void DelayMSEC(unsigned int nDelay)
{
	unsigned int i,k;
	
	for ( i=0;i<nDelay*64;i++ )
	{
		k++;
	}
}

void SaveAsBMPFile(int nWidth,int nHeight)
{
	FILE *fp;
	unsigned int uWork;
	int i,j;
	if ( fp=fopen("video.bmp","wb+") )
	{
		uWork=0x42; fwrite(&uWork,1,1,fp);	// BM
		uWork=0x4d; fwrite(&uWork,1,1,fp);
		uWork=0x36; fwrite(&uWork,1,1,fp);	// size=14+40+720*288+4*256
		uWork=0x31; fwrite(&uWork,1,1,fp);//00,03,2e,36
		uWork=0; fwrite(&uWork,1,1,fp);
		uWork=0; fwrite(&uWork,1,1,fp);
		uWork=0; fwrite(&uWork,1,1,fp);	// reserved
		uWork=0; fwrite(&uWork,1,1,fp);
		uWork=0; fwrite(&uWork,1,1,fp);
		uWork=0; fwrite(&uWork,1,1,fp);
		uWork=36; fwrite(&uWork,1,1,fp);	// image offset=54
		uWork=4; fwrite(&uWork,1,1,fp);
		uWork=0; fwrite(&uWork,1,1,fp);
		uWork=0; fwrite(&uWork,1,1,fp);
		uWork=40; fwrite(&uWork,1,1,fp);	// struct size=40
		uWork=0; fwrite(&uWork,1,1,fp);
		uWork=0; fwrite(&uWork,1,1,fp);
		uWork=0; fwrite(&uWork,1,1,fp);
		uWork=0x78; fwrite(&uWork,1,1,fp);	// width=720
		uWork=0; fwrite(&uWork,1,1,fp);//00,00,02,d0
		uWork=0; fwrite(&uWork,1,1,fp);
		uWork=0; fwrite(&uWork,1,1,fp);
		uWork=0x60; fwrite(&uWork,1,1,fp);	// height=288
		uWork=0; fwrite(&uWork,1,1,fp);//00,00,01,20
		uWork=0; fwrite(&uWork,1,1,fp);
		uWork=0; fwrite(&uWork,1,1,fp);
		uWork=1; fwrite(&uWork,1,1,fp);	// Planes & BitCount=0x080001
		uWork=0; fwrite(&uWork,1,1,fp);
		uWork=8; fwrite(&uWork,1,1,fp);
		uWork=0; fwrite(&uWork,1,1,fp);
		uWork=0; fwrite(&uWork,1,1,fp);	// Compression=0
		uWork=0; fwrite(&uWork,1,1,fp);
		uWork=0; fwrite(&uWork,1,1,fp);
		uWork=0; fwrite(&uWork,1,1,fp);
		uWork=0x00; fwrite(&uWork,1,1,fp);	// image size=720*288
		uWork=0x2d; fwrite(&uWork,1,1,fp);//00,03,2a,00
		uWork=0; fwrite(&uWork,1,1,fp);
		uWork=0; fwrite(&uWork,1,1,fp);
		uWork=0x0c4; fwrite(&uWork,1,1,fp);	// x pixels/m=3780
		uWork=0x0e; fwrite(&uWork,1,1,fp);
		uWork=0; fwrite(&uWork,1,1,fp);
		uWork=0; fwrite(&uWork,1,1,fp);
		uWork=0x0c4; fwrite(&uWork,1,1,fp);	// y pixels/m=3780
		uWork=0x0e; fwrite(&uWork,1,1,fp);
		uWork=0; fwrite(&uWork,1,1,fp);
		uWork=0; fwrite(&uWork,1,1,fp);
		uWork=0; fwrite(&uWork,1,1,fp);	// color used=0
		uWork=0; fwrite(&uWork,1,1,fp);
		uWork=0; fwrite(&uWork,1,1,fp);
		uWork=0; fwrite(&uWork,1,1,fp);
		uWork=0; fwrite(&uWork,1,1,fp);	// important color=0
		uWork=0; fwrite(&uWork,1,1,fp);
		uWork=0; fwrite(&uWork,1,1,fp);
		uWork=0; fwrite(&uWork,1,1,fp);
		for ( i=0;i<256;i++ )
		{
			uWork=i;
			fwrite(&uWork,1,1,fp);
			fwrite(&uWork,1,1,fp);
			fwrite(&uWork,1,1,fp);
			uWork=0;
			fwrite(&uWork,1,1,fp);
		}
		
		for(j=95;j>=0;j--)
		{
		    imgoffset=(unsigned long int)j*120+2;			
			imgoffset%=11520;
			for ( i=0;i<120;i++,imgoffset++ )
			{							
				uWork=y[imgoffset];
				fwrite(&uWork,1,1,fp);
			}
			
		}  
		fclose(fp);
	}
}

⌨️ 快捷键说明

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