📄 main.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"
#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);
#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];
main()
{
int i,j,k,x,c1,c2,c3,xx,yy,uu,vv,xxx;
float rr,gg,bb;
unsigned int www=722,bGoodFrame,dbScanCode;
int a,b,c,xstart,ystart,xsample,ysample;
unsigned int uWork;
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;
a=288;
b=722;
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;
x=0; // BREAK POINT 在此设置软件断点
x=0;
x=0;
}
exit(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)
{
int i;
StartIIC();
WriteIIC(0x0ba);
AckIIC();
WriteIIC(0x03); // TVP5150控制寄存器3,取值0x8F
AckIIC();
WriteIIC(0x08f);
AckIIC();
StopIIC();
DelayMSEC(10);
}
void DelayMSEC(unsigned int nDelay)
{
unsigned int i,j,k;
for ( i=0;i<nDelay*64;i++ )
{
k++;
}
}
/* END OF FILE */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -