📄 iopin.c
字号:
#include "ICETEK-C6713-A.h"
//////////////////////////////////////////////
// 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 = 288
// Pixels Per Line = 720
// Byte Packing to Fill 32 Bits = No
// Image Origin = Top Left
// 3.看小图:菜单view->graph->Image:
// color space = RGB
// Start Address -R Source = buffer
// Start Address -G Source = buffer
// Start Address -B Source = buffer
// Lines Per Display = 96
// Pixels Per Line = 120
// Byte Packing to Fill 32 Bits = No
// Image Origin = Top Left
// 4.按F5运行到断点可显示采集图像
// 5.转动摄像头后再按F5可再次采集
///////////////////////////////////////
#define IDKCCMDRESET 2
#define IDKCCMDCAPTURE 4
#define IDKCCMDRESETRP 8
#define IDKCCMDRESETWP 0x10
#define IDKCCMDCOLOR 0x20
#define IDKIMGREADY 2
#define IMAGEWIDTH 120
#define IMAGEHEIGHT 96
#define PLL_BASE_ADDR 0x01b7c000
#define PLL_PID ( PLL_BASE_ADDR + 0x000 )
#define PLL_CSR ( PLL_BASE_ADDR + 0x100 )
#define PLL_MULT ( PLL_BASE_ADDR + 0x110 )
#define PLL_DIV0 ( PLL_BASE_ADDR + 0x114 )
#define PLL_DIV1 ( PLL_BASE_ADDR + 0x118 )
#define PLL_DIV2 ( PLL_BASE_ADDR + 0x11C )
#define PLL_DIV3 ( PLL_BASE_ADDR + 0x120 )
#define PLL_OSCDIV1 ( PLL_BASE_ADDR + 0x124 )
#define CSR_PLLEN 0x00000001
#define CSR_PLLPWRDN 0x00000002
#define CSR_PLLRST 0x00000008
#define CSR_PLLSTABLE 0x00000040
#define DIV_ENABLE 0x00008000
float fHistogram[256];
void Delay(unsigned int nTime); // 延时
void StartIIC(void); // 启动I2C总线传输
void StopIIC(void); // 停止I2C总线传输
void AckIIC(void);
void WriteIIC(unsigned char data); // 写字节数据到I2C总线
void Init5150(void); // 初始化ICETEK-TVP5150-E
void DelayMSEC(unsigned int nDelay); // 延时
void Close5150(void); // 关闭ICETEK-TVP5150-E
void init_pll( void ); // 设置DSP主频
unsigned char buffer[120*96],y[720*288]; // Y存放图象
void Histogram(unsigned char *pImage,int nWidth,int nHeight,float fHisto[256]);
main()
{
int i,j,x,c1,c2,c3,xx,yy,uu,vv,xxx;
float rr,gg,bb;
unsigned int www=722,bGoodFrame,dbScanCode;
int a,b,c,d,e,f,g,h;
unsigned char uWork;
init_emif(); // 初始化emif
InitCTR(); // 初始化ICETEK-CTR
xx=1;
for ( j=0;j<72;j++ )
for ( i=0;i<90;i++ )
y[j*90+i]=0;
a=288;
b=722;
c=0;
d=8;
e=4;
f=1;
g=576;
h=0;
Init5150(); // 初始化ICETEK-TVP5150-E
init_pll();
while ( 1 )
{
if ( xx )
{
IDKCGR=IDKCCMDRESET; IDKCGR=0; // 复位FIFO
Delay(16);
IDKCGR=IDKCCMDRESETWP; // 复位FIFO写指针
IDKCGR=IDKCCMDCAPTURE; // 启动采集
Delay(2560);
IDKCGR=0;
Delay(2560);
}
x=0;
IDKCGR=IDKCCMDRESETRP; // 复位FIFO读指针
Delay(16);
IDKCGR=0;
Delay(16);
uWork=IDKCDATA; // 读取首个数据并放弃
Delay(16);
for ( i=0;i<724;i++ ) buffer[i]=0;
for ( i=0;i<c;i++ ) buffer[i]=IDKCDATA;
for ( j=0;j<a;j++ ) // 读取整幅图象722x288
{
for ( i=0;i<b;i++ )
{
y[j*720+i]=buffer[i]=IDKCDATA;
}
}
// 将图象缩小后观察
for ( j=0;j<288;j+=3 )
for ( i=0;i<720;i+=6 )
buffer[j/3*120+i/6]=y[j*720+i];
xxx=IDKCSTATUS;
Histogram(buffer,IMAGEWIDTH,IMAGEHEIGHT,fHistogram);
x=0; // BREAK POINT 在此设置软件断点
x=0;
x=0;
}
exit(0);
}
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++ )
{
// for ( j=0;j<6144;j++ )
k++;
}
}
void init_pll( void )
{
*(int *)PLL_CSR &= ~CSR_PLLEN; // Enable PLL
*(int *)PLL_CSR |= CSR_PLLRST; // Asserts RESET to PLL
*(int *)PLL_DIV0 = DIV_ENABLE + 0; // div0 enable
*(int *)PLL_MULT = 4;//8; // 25MHz×8=200MHz
*(int *)PLL_OSCDIV1 = DIV_ENABLE + 4;
*(int *)PLL_DIV3 = DIV_ENABLE + 3;
*(int *)PLL_DIV2 = DIV_ENABLE + 3;
*(int *)PLL_DIV1 = DIV_ENABLE + 1;
*(int *)PLL_CSR &= ~CSR_PLLRST;
*(int *)PLL_CSR |= CSR_PLLEN;
}
void Histogram(unsigned char *pImage,int nWidth,int nHeight,float fHisto[256])
{
int i,j;
unsigned int uWork;
unsigned char *pWork;
for ( i=0;i<256;i++ ) fHisto[i]=0.0f;
pWork=pImage;
for ( i=0;i<nHeight;i++ )
{
for ( j=0;j<nWidth;j++,pWork++ )
{
uWork=(unsigned int)(*pWork);
fHisto[uWork]++;
}
}
uWork=nWidth*nHeight;
for ( i=0;i<256;i++ )
{
fHisto[i]/=uWork;
fHisto[i]*=100;
}
}
/* END OF FILE */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -