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

📄 fps200.c

📁 《ARM嵌入式应用开发技术白金手册》源代码
💻 C
字号:
/*

测试FPS200

*/
#include "GloblDef.h"
#include "ioregs.h" 
#include "flash.h"
#include "put.h"
#include "fps200.h"

int s_addr;
void DelayRowCapture()
{
	// (28 + DTR_TIME) * 1/12M
	WORD i;
	for(i = 0;i<100;i++)
		i = i;
}

void DelayADConvert()
{
	// 6 * 1/12M
	WORD i;
	for(i = 0;i<15;i++)
		i = i;
}
void Delay30us()
{
	WORD i;
	for(i = 0;i<600;i++)
		i = i;
}
WORD FPSReadID()
{
	BYTE IDH,IDL;

	FPS_INDEX = FPS_CIDL;
	IDL = FPS_DATA;
	
	FPS_INDEX = FPS_CIDH;
	IDH = FPS_DATA;

	return (((WORD)IDH)<<8 | (WORD)IDL);
}
void FPSInitial()
{
	///////////
	// important initial

	// control register B
	FPS_INDEX = FPS_CTRLB;
	FPS_DATA = FPS_CTRLB_AUTOINCEN | FPS_CTRLB_ENABLE;	// row auto inc. inner 12MHz vibrator. no low-power state

	// wait for 30us
	Delay30us();
	
	// discharge time register
	FPS_INDEX = FPS_DTR;
	FPS_DATA = FPS_DTR_TIME;

	// discharge current register
	FPS_INDEX = FPS_DCR;
	FPS_DATA = FPS_DCR_CURRENT;
	
	// programmable gain control register
	FPS_INDEX = FPS_PGC;
	FPS_DATA = FPS_PGC_VALUE;	// default value

	/////////////
	// other initial

	FPS_INDEX = FPS_RAH;
	FPS_DATA = 0;

	FPS_INDEX = FPS_RAL;
	FPS_DATA = 0;

	FPS_INDEX = FPS_CAL;
	FPS_DATA = 0;

	FPS_INDEX = FPS_REH;
	FPS_DATA = 0;

	FPS_INDEX = FPS_REL;
	FPS_DATA = 0;

	FPS_INDEX = FPS_CEL;
	FPS_DATA = 0;

	FPS_INDEX = FPS_CTRLC;
	FPS_DATA = 0;
	
	FPS_INDEX = FPS_CTRLA;	// clear FPS_CTRLA_AINSEL
	FPS_DATA = 0;

	// interrupt control regsiter
	FPS_INDEX = FPS_ICR;
	FPS_DATA = FPS_ICR_IT0_LEVEL | FPS_ICR_IE0;	//faling edage, level triger, no mask, enable
   
	// Threshold Register
	FPS_INDEX = FPS_THR;
	FPS_DATA = FPS_THR_THV | FPS_THR_THC;
	
}

void FPSRow(WORD RowI)
{
	// First load the RAH and RAL registers with the address of the row to be fetched. Then write the CTRLA
	// register to initiate a GETROW operation. Finally, read the CTRLA register 256 times to retrieve the row
	// data.

	WORD i;
	// Write RAH
	FPS_INDEX = FPS_RAH;
	FPS_DATA = (BYTE)(RowI>>8);

	// Write RAL
	FPS_INDEX = FPS_RAL;
	FPS_DATA = (BYTE)RowI;

	// row capture
	FPS_INDEX = FPS_CTRLA;
	FPS_DATA = FPS_CTRLA_GETROW ;

	// Wait row capture time
	DelayRowCapture();

	for(i = 0;i<COL_NUM;i++)
	{
		//put_num8(FPS_DATA);
		//put_char(' ');
		//RAM_BYTE(s_addr++)=FPS_DATA;
		RAM_BYTE(s_addr)=FPS_DATA;
		DelayADConvert();
	}
	
}
/*
void FPSImg()
{
	// No row or column registers need to be loaded prior to starting a GETIMG operation. The sensor will
	// automatically begin A/D conversion at row zero, column zero.

	WORD row,col;

	// Write CTRLA with 0x02.
	FPS_INDEX = FPS_CTRLA;
	FPS_DATA = FPS_CTRLA_GETIMG ;

	for(row = 0; row < ROW_NUM; row++)
	{
		// Wait Row Capture Time.
		DelayRowCapture();
		for(col = 0; col < COL_NUM; col++)
		{
			// Read CTRLA.
			put_num8(FPS_DATA);

			// Wait A/D Conversion Time.
			DelayADConvert();
		}
	}
	
}

void FPSSub(WORD RowStart,WORD RowEnd,BYTE ColStart,BYTE ColEnd)
{
	WORD row,col;

	// Write RAH.
	FPS_INDEX = FPS_RAH;
	FPS_DATA = (BYTE)(RowStart>>8);

	// Write RAL.
	FPS_INDEX = FPS_RAL;
	FPS_DATA = (BYTE)RowStart;
	
	// Write CAL.
	FPS_INDEX = FPS_CAL;
	FPS_DATA = ColStart;

	// Write REH.	
	FPS_INDEX = FPS_REH;
	FPS_DATA = (BYTE)(RowEnd>>8);
	
	// Write REL.
	FPS_INDEX = FPS_REL;
	FPS_DATA = (BYTE)RowEnd;

	// Write CEL.
	FPS_INDEX = FPS_CEL;
	FPS_DATA = ColEnd;

	// Write CTRLA with 0x04.
	FPS_INDEX = FPS_CTRLA;
	FPS_DATA = FPS_CTRLA_GETSUB ;

	for(row = RowStart; row <= RowEnd; row++)
	{
		// Wait Row Capture Time.
		DelayRowCapture();

		for(col = ColStart; col <= ColEnd; col++)
		{
			// Read CTRLA.
			put_num8(FPS_DATA);

			// Wait A/D Conversion Time.
			DelayADConvert();
		}
	}
}

*/

void FPSAin()
{
	// ROW
	FPS_INDEX = FPS_CTRLA;
	FPS_DATA = FPS_CTRLA_GETROW | FPS_CTRLA_AINSEL;
	
	DelayADConvert();
	put_num8(FPS_DATA);
	
	// IMG
	FPS_INDEX = FPS_CTRLA;
	FPS_DATA = FPS_CTRLA_GETIMG | FPS_CTRLA_AINSEL;
	
	DelayADConvert();
	put_num8(FPS_DATA);
	
	// Write CTRLA with 0x04.
	FPS_INDEX = FPS_CTRLA;
	FPS_DATA = FPS_CTRLA_GETSUB | FPS_CTRLA_AINSEL;
	
	DelayADConvert();
	put_num8(FPS_DATA);
}

/*
// delay more
void FPSAin2()
{
	WORD i;
	// ROW
	FPS_INDEX = FPS_CTRLA;
	FPS_DATA = FPS_CTRLA_GETROW | FPS_CTRLA_AINSEL;
	
		for(i=0;i<100;i++)
	DelayADConvert();
	put_num8(FPS_DATA);
	
	// IMG
	FPS_INDEX = FPS_CTRLA;
	FPS_DATA = FPS_CTRLA_GETIMG | FPS_CTRLA_AINSEL;
	
	for(i=0;i<100;i++)
		DelayADConvert();
	put_num8(FPS_DATA);
	
	// Write CTRLA with 0x04.
	FPS_INDEX = FPS_CTRLA;
	FPS_DATA = FPS_CTRLA_GETSUB | FPS_CTRLA_AINSEL;
	
	for(i=0;i<100;i++)
		DelayADConvert();
	put_num8(FPS_DATA);
}

void FPSToggle()
{
	FPS_INDEX = FPS_CTRLC;
	//FPS_DATA = 0;	//p0 is 0
	FPS_DATA = 0x04;	// p0 is toggle
}
*/
/*
// 测试SRA中标志位是否清除,当读完最后一个byte.如果清除,说明内部寄存器在计数
// 说明内部已经启动了图像的转化。
BYTE FPSImgIncTest()
{
	WORD row,col;
	BYTE temp;
	
	//FPS_INDEX = FPS_CTRLB;
	//FPS_DATA =  FPS_CTRLB_ENABLE;	// row auto inc. inner 12MHz vibrator. no low-power state

	// GET IMG TEST
	FPS_INDEX = FPS_CTRLA;
	FPS_DATA = FPS_CTRLA_GETIMG ;

	for(row = 0; row < ROW_NUM; row++)
	{
		// Wait Row Capture Time.
		DelayRowCapture();
		for(col = 0; col < COL_NUM; col++)
		{
			// test SRA
			FPS_INDEX = FPS_SRA;
			if(FPS_DATA != FPS_CTRLA_GETIMG)
				return 0;
				
			// Read CTRLA.
			FPS_INDEX = FPS_CTRLA;
			temp = FPS_DATA;
			
			// Wait A/D Conversion Time.
			DelayADConvert();
		}
	}
	put_char('a');
	FPS_INDEX = FPS_SRA;
	if(FPS_DATA != 0)
		return 0;
	put_char('b');
	
	// GET ROW TEST
	// Write RAH
	FPS_INDEX = FPS_RAH;
	FPS_DATA = 0;

	// Write RAL
	FPS_INDEX = FPS_RAL;
	FPS_DATA = 0;

	// row capture
	FPS_INDEX = FPS_CTRLA;
	FPS_DATA = FPS_CTRLA_GETROW ;

	// Wait row capture time
	DelayRowCapture();

	for(col = 0;col<COL_NUM;col++)
	{
		// test SRA
		FPS_INDEX = FPS_SRA;
		if(FPS_DATA != FPS_CTRLA_GETROW)
			return 0;
		// AD busy?
		FPS_INDEX = FPS_CTRLB;
		if((FPS_DATA & 0x20) == 0)
			put_char('!');
			
		// Read CTRLA.
		FPS_INDEX = FPS_CTRLA;
		temp = FPS_DATA;
		DelayADConvert();
	}
	put_char('c');
	
	FPS_INDEX = FPS_CTRLB;
	put_num8(FPS_DATA);
	
	FPS_INDEX = FPS_SRA;
	if(FPS_DATA != 0)
	{
		put_num8(FPS_DATA);
		return 0;
	}
	put_char('d');
	
	// GET SUB test
	// Write RAH.
	FPS_INDEX = FPS_RAH;
	FPS_DATA = 0;

	// Write RAL.
	FPS_INDEX = FPS_RAL;
	FPS_DATA = 0;
	
	// Write CAL.
	FPS_INDEX = FPS_CAL;
	FPS_DATA = 0;

	// Write REH.	
	FPS_INDEX = FPS_REH;
	FPS_DATA = 0;
	
	// Write REL.
	FPS_INDEX = FPS_REL;
	FPS_DATA = 10;

	// Write CEL.
	FPS_INDEX = FPS_CEL;
	FPS_DATA = 0;

	// Write CTRLA with 0x04.
	FPS_INDEX = FPS_CTRLA;
	FPS_DATA = FPS_CTRLA_GETSUB ;

	for(row = 0; row <= 0; row++)
	{
		// Wait Row Capture Time.
		DelayRowCapture();

		for(col = 0; col <= 10; col++)
		{
			// test SRA
			FPS_INDEX = FPS_SRA;
			if(FPS_DATA != FPS_CTRLA_GETSUB)
				return 0;
				
			// Read CTRLA.
			FPS_INDEX = FPS_CTRLA;
			temp = FPS_DATA;
			
			// Wait A/D Conversion Time.
			DelayADConvert();
		}
	}
	put_char('e');
	FPS_INDEX = FPS_CTRLB;
	put_num8(FPS_DATA);
	FPS_INDEX = FPS_SRA;
	if(FPS_DATA != 0)
	{
		return 0;
	}
	put_char('f');
	
	return 1;
}
*/	
	

	
BYTE FPSMode()
{
	BYTE value;
	FPS_INDEX = FPS_CTRLB;
	value = FPS_DATA;

	return (value>>6);
}

BYTE RegTest(BYTE reg,BYTE value)
{
	FPS_INDEX = reg;
	FPS_DATA = value;
	if(FPS_DATA != value)
		return FALSE;
	else
		return TRUE;
}
/*
BYTE FPSRegTest()
{
	WORD i;
	BYTE temp;

	//////////
	// test write read 0--255 to some regs

	for(i = 0, temp = 0; i < 256; i++, temp++)
	{
		// RAH REH
		if(i < 0x2)
		{
			if(RegTest(FPS_RAH,temp) == FALSE)
				return FALSE;
			if(RegTest(FPS_REH,temp) == FALSE)
				return FALSE;
		}

		// FPS_RAL FPS_CAL FPS_REL FPS_CEL FPS_ICR
		if(i < 256)
		{
			if(RegTest(FPS_RAL,temp) == FALSE)
				return FALSE;
			if(RegTest(FPS_CAL,temp) == FALSE)
				return FALSE;
			if(RegTest(FPS_REL,temp) == FALSE)
				return FALSE;
			if(RegTest(FPS_CEL,temp) == FALSE)
				return FALSE;
			if(RegTest(FPS_ICR,temp) == FALSE)
				return FALSE;
			if(RegTest(FPS_CTRLC,temp) == FALSE)
				return FALSE;
		}

		// FPS_DTR
		if(i < 0x80)
		{
			if(RegTest(FPS_DTR,temp) == FALSE)
				return FALSE;
		}

		// FPS_DCR
		if(i < 0x20)
		{
			if(RegTest(FPS_DCR,temp) == FALSE)
				return FALSE;
		}

		
		if(i < 0x10)
		{
			// FPS_PGC
			if(RegTest(FPS_PGC,temp) == FALSE)
				return FALSE;

			// FPS_CTRLB
			FPS_INDEX = FPS_CTRLB;
			FPS_DATA = temp&0x0f;
			if((FPS_DATA &0x0f) != temp)
				return FALSE;

		}

		// FPS_THR
		if(i < 0x40)
		{
			if(RegTest(FPS_THR,temp) == FALSE)
				return FALSE;
		}

		// test FPS_SRA reflect FPS_CTRLA
		if(i == FPS_CTRLA_GETSUB || i == FPS_CTRLA_GETIMG || i == FPS_CTRLA_GETROW ||
			i == (FPS_CTRLA_GETSUB | FPS_CTRLA_AINSEL) || i == (FPS_CTRLA_GETIMG | FPS_CTRLA_AINSEL) || 
			i == (FPS_CTRLA_GETROW || FPS_CTRLA_AINSEL))
		{
			FPS_INDEX = FPS_CTRLA;
			FPS_DATA = temp;
			FPS_INDEX = FPS_SRA;
			if(FPS_DATA	!= temp)
				return FALSE;
		}
	}

	// FPS_TST
	if(RegTest(FPS_THR,0) == FALSE)
		return FALSE;

	// FPS_CIDH == 0x20, and can't change
	FPS_INDEX = FPS_CIDH;
	temp = FPS_DATA;
	FPS_DATA = temp + 1;
	if(FPS_DATA	!= temp)
		return FALSE;

	// FPS_CIDL can't change
	FPS_INDEX = FPS_CIDL;
	temp = FPS_DATA;
	FPS_DATA = temp + 1;
	if(FPS_DATA	!= temp)
		return FALSE;
	return 1;
}
*/
/*void FPSChangePara(BYTE t,BYTE i,BYTE g)
{
	// discharge time register
	FPS_INDEX = FPS_DTR;
	FPS_DATA = t;

	// discharge current register
	FPS_INDEX = FPS_DCR;
	FPS_DATA = i;
	
	// programmable gain control register
	FPS_INDEX = FPS_PGC;
	FPS_DATA = g;	// default value
}
void GetPara()
{
	static BYTE t=1,i=1,g=0;
	
	switch(get_char())
	{
		case 't':
			t += 0x3a;
			if(t>0x7f)
				t = 1;
			break;
		case 'i':
			i += 0x0a;
			if(i>0x1f)
				i = 1;
			break;
		case 'g':
			g += 0x07;
			if(g > 0x0f)
				g = 0;
			break;
		default:
			put_char('e');
	}
	put_num8(t);
	put_num8(i);
	put_num8(g);
	FPSChangePara(t,i,g);
}
*/	
void  C_vMain(void)
{
	DWORD i,j,k;
	
	get_char();
		
	put_num16(FPSReadID());
	
	put_num8(FPSMode());
	
	//////////////////
	// test regs
	
/*	if(FPSRegTest() == 1)
		put_char('o');
	else
		put_char('f');
*/		
	FPSInitial();
	////////////////////
	// anolog input
	/*
	put_char('\n');
	put_char('A');
	put_char('\n');
	FPSAin();
	*/
	///////////////
	//  get image
	/*
	put_char('I');
	put_char('\n');
	FPSImg();*/
	
	/////////////////
	//get image by row
	s_addr=0;
		while(1);{
		for(j=0;j<300;j++)
		FPSRow(j);}
	put_char('O');
	
	s_addr=0;
	k=0;
	for(j=0;j<256*300;j++){
			
		put_num8(RAM_BYTE(s_addr++));
		put_char(' ');
		k++;
		if(k==8000)
			{get_char();
			k=0;}
		
	}	
	while(1);
	////////////////////
	// get sub
	/*
	put_char('\n');
	put_char('S');
	put_char('\n');
	FPSSub();
	*/
}

⌨️ 快捷键说明

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