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

📄 download.c

📁 TMS320c6000系列DSP做图像处理的应用举例
💻 C
字号:
#include <stdio.h>
#include <c6x.h>
#include "download.h"

#define MTVFPGA_PGM		0xa030000c
#define DTVFPGA_PGM		0xa0300010
#define FPAG_DATA		0xa0300014
#define	SYS_STATE		0xa0300020

#define	I2C_REG			0xa0300004
#define	LED_REG			0xa0300008

#define SYSRREG			0xA020000c 
#define UART_BASE_ADDR		0xa0300000 

#define OFFSET              	4

#define RBR					0xa0300000
#define THR					0xa0300000
#define IIER				0xa0300004
#define IIR					0xa0300008
#define FCR					0xa0300008
#define LCR					0xa030000c
#define MCR					0xa0300010
#define LSR					0xa0300014
#define MSR					0xa0300018
#define SCR					0xa030001c
#define DLL					0xa0300000
#define DLM					0xa0300004

unsigned int uFPGAAddress=0x80020000;
unsigned char * file_buffer;
#pragma DATA_SECTION(fpga_buffer,".bss1")
unsigned char * fpga_buffer;
/*******************************************************************************
* Function prototypes
*******************************************************************************/
void DelayMSEC(short msec);
int  Timer0Read();
void Timer0Start();
void Timer0Init();
unsigned int GetIOPort(void);
void SetInitBuffer();

//unsigned int 	count; 
int MSPeriod = 1;                                   

#define		COLORBAR	0xc7;
#define		WORKCOLOR	0x47;

/*******************************************************************************
* IIC Function prototypes
*******************************************************************************/
void StartIIC(void);
void StopIIC(void);
void AckIIC(void);
void WriteIIC(unsigned char data);

void Init7111(void);
void Init7190(void);
unsigned char Val713_1[25] = 
{	
			     0xf8,0xc0,0x33,0x00,0x00,0xe9,0x0d,
				0xb8,0x01,0x80,0x47,0x40,0x00,0x01,0x2a,
				0x00,0x0c,0x38,0x00,0x00
/*
 		        0xf8,0xc0,0x33,0x00,0x00,0xd8,0xff,
				0xb8,0x01,0x80,0x47,0x40,0x00,0x01,0x2a,
				0x00,0x0c,0xc8,0x00,0x00
*/
};
unsigned char Val713_2[4] = {0x00,0x00,0x00,0x00};

unsigned char Val713_3[0x21] = {
				0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,							
				0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,							
				0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,							
				0x00,0x54,0x07,0x83,0xff,0xff,0x00,0x00
//				0x03,0x54,0x07,0x83,0xff,0xff,0x00,0x00
				};							

unsigned char Val76[0x36] = {	
				0x11,0x20,0x62,0x00,0x00,0x00,0x00,0x00,
				0x04,0x00,0x08,0x00,0xcb,0x8a,0x09,0x2a,
				0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
				0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
				0x00,0x00,0x00,0x44,0x20,0x00,0xff,0xff,
				0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
				0xff,0xff,0xff,0xff,0xff,0x70};
unsigned int ChipID;
unsigned int Temp;
void Download_FPGA(int cmd);
void InitSys()
{
	int i;
	DelayMSEC(1);

	for(i=0;i<0xff;i++)
	{
		StartIIC();
		StopIIC();
		DelayMSEC(5);
	}	    
	Init7190();
	Init7111();
}
void InitIDKM()
{
	register int i;

	CSR=0x100;		
	IER=1;			
	ICR=0xffff;		


	*(unsigned volatile int *)EMIF_GCR = 0x3300;    	
	*(unsigned volatile int *)EMIF_CE1 = CE1_32;    	
	*(unsigned volatile int *)EMIF_SDCTRL = 0x07126000; 
	*(unsigned volatile int *)EMIF_CE0 = 0x30;      	
	*(unsigned volatile int *)EMIF_SDRP = 0x61a;    	
	*(unsigned volatile int *)EMIF_SDEXT= 0x54529;  	
	*(unsigned volatile int *)EMIF_CE2 = CE2_32_max;    
	*(unsigned volatile int *)EMIF_CE3 = CE3_32;		

	InitSys();
		
	file_buffer = (unsigned char *)0xa0000000;
	fpga_buffer = (unsigned char *)uFPGAAddress;
	*(unsigned volatile int *)EMIF_CE2 = CE2_32_max & 0xffffff0f;            
	for ( i=0;i<0x40000;i++,fpga_buffer++,file_buffer++ )
	{
		(*fpga_buffer)= (*file_buffer);
	}
	*(unsigned volatile int *)EMIF_CE2 = CE2_32_max;            
	fpga_buffer = (unsigned char *)uFPGAAddress;
		Download_FPGA(0);

}
#pragma CODE_SECTION(Download_FPGA,".text1")
void far Download_FPGA(int cmd)
{
	register int i,ii;
	unsigned char fpga_data;

		do{
			*(unsigned volatile int *)MTVFPGA_PGM = 0xfe;
			i = *(unsigned volatile int *)LED_REG;
		}while((i&0x20) != 0);
		do{
			*(unsigned volatile int *)MTVFPGA_PGM = 0xff;
			i = *(unsigned volatile int *)LED_REG;
		}while((i&0x20) == 0);
		ii = 0;
		do{
			fpga_data = *fpga_buffer++;
			for(i=0;i<8;i++)
			{
				if ((fpga_data & 0x80)==0)
				{
					*(unsigned volatile int *)FPAG_DATA = 0;
				}
				else
				{
					*(unsigned volatile int *)FPAG_DATA = 0xff;
				}
				fpga_data <<= 1;
			}
			ii++;
		}while(ii<0x1A5CB);
	fpga_buffer = (unsigned char *)(uFPGAAddress+0x1ffb8);
		do
		{
			*(unsigned volatile int *)DTVFPGA_PGM = 0xfe;
			i = *(unsigned volatile int *)LED_REG;
		}while((i&0x80) != 0);
		do
		{
			*(unsigned volatile int *)DTVFPGA_PGM = 0xff;
			i = *(unsigned volatile int *)LED_REG;
		}while((i&0x80) == 0);
		ii = 0;
		do{
			ii++;
			fpga_data = *fpga_buffer++;
			for(i=0;i<8;i++)
			{
				if ((fpga_data & 0x80)==0)
				{
					*(unsigned volatile int *)FPAG_DATA = 0;
				}
				else
				{
					*(unsigned volatile int *)FPAG_DATA = 0xff;
				}
				fpga_data <<= 1;
			}
		}while(ii<0x1A5CB);
}

#pragma CODE_SECTION(DelayMSEC,".text2")
void DelayMSEC(short msec)
{
  /* Assume 150 MHz CPU, timer peirod = 4/150 MHz */
/*  int timer_limit = (msec*9375)<<2;			*/
  int timer_limit = (msec*9375);
  int time_start;

  Timer0Start();
  time_start = Timer0Read();
  while ((Timer0Read()-time_start) < timer_limit);
}

/*******************************************************************************
* FUNCTION : Timer0Read
*
* ARGUMENTS :
*   VOID
*
* DESCRIPTION :
*   Read and return the count in timer 0.
*
* OUTPUTS :
*   INT                   <-- Returns the count in timer 0
*
*******************************************************************************/
#pragma CODE_SECTION(Timer0Read,".text2")
int Timer0Read()
{
  int i;

  i = *(unsigned volatile int *)TIMER1_COUNT;
  return i;
}

/*******************************************************************************
* FUNCTION : Timer0Start
*
* ARGUMENTS :
*   VOID
*
* DESCRIPTION :
*   Start timer 0 after initializing it for 32-bit count and no interrupt.
*
* OUTPUTS :
*   VOID
*
*******************************************************************************/
#pragma CODE_SECTION(Timer0Start,".text2")
void Timer0Start()
{
  /* Hold the timer */
  *(unsigned volatile int *)TIMER1_CTRL &= 0xff3f;

  /* Use CPU CLK/4 */
  *(unsigned volatile int *)TIMER1_CTRL |= 0x200;

  /* Set for 32 bit counter */
  *(unsigned volatile int *)TIMER1_PRD  |= 0xffffffff;

  /* Start the timer */
  *(unsigned volatile int *)TIMER1_CTRL |= 0xC0;
}

/*******************************************************************************
* FUNCTION : Timer0Init
*
* ARGUMENTS :
*   VOID
*
* DESCRIPTION :
*   Start timer 0 after initializing it for a short period (~13.7 micro seconds)
*   with interrupt.
*
* OUTPUTS :
*   VOID
*
*******************************************************************************/
#pragma CODE_SECTION(Timer0Init,".text2")
void Timer0Init()
{
  /* Hold the timer */
  *(unsigned volatile int *)TIMER1_CTRL &= 0xff3f;

  /* Use CPU CLK/4 */
  *(unsigned volatile int *)TIMER1_CTRL |= 0x200;

  /* Set for a short period */
  *(unsigned volatile int *)TIMER1_PRD   = 0x200;

  /* Start the timer, enable timer0 int */
  *(unsigned volatile int *)TIMER1_CTRL |= 0x3C0;
}

void StartIIC(void)
{
	*(unsigned volatile int *)I2C_REG = 0x025;		/*	"00100101":sda,scl = '1' */
	DelayMSEC(1);
	*(unsigned volatile int *)I2C_REG = 0x024;		/*	"00100100":sda= '0',scl = '1' */
	DelayMSEC(1);
}
void StopIIC(void)
{	
	*(unsigned volatile int *)I2C_REG = 0x024;		/*	"00100101":sda = '0',scl = '1' */
	DelayMSEC(1);
	*(unsigned volatile int *)I2C_REG = 0x025;		/*	"00100101":sda,scl = '1' */
	DelayMSEC(1);
}		
void AckIIC(void)
{
	*(unsigned volatile int *)I2C_REG = 0x020;		/*	"00100101":sda='z',scl = '0' */
	*(unsigned volatile int *)I2C_REG = 0x022;		/*	"00100101":sda='z',scl = '0' */
	DelayMSEC(1);
	*(unsigned volatile int *)I2C_REG = 0x026;		/*	"00100101":sda='z',scl = '1' */
	DelayMSEC(1);
	*(unsigned volatile int *)I2C_REG = 0x022;		/*	"00100101":sda='z',scl = '0' */
	DelayMSEC(1);
	*(unsigned volatile int *)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;
	*(unsigned volatile int *)I2C_REG = 0x20;		/*SCL 置低 sda 置低*/
	DelayMSEC(1);						/*延时*/
	do{
		Temp = data;
		reg_val &= 0x0fffffffb;
		*(unsigned volatile int *)I2C_REG = reg_val;		/*SCL 置低*/
		DelayMSEC(1);						/*延时*/
		
		if((Temp&0x80)==0x80)
			reg_val |= 0x01;	/*如果最高位是1*/
		else
			reg_val &= 0x0fffffe;
		*(unsigned volatile int *)I2C_REG = reg_val;		/*设置SDA*/
		DelayMSEC(1);						/*延时*/

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

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

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

void Init7111(void)
{
	int i;
	
	StartIIC();
	WriteIIC(0x4a);			
	AckIIC();
	WriteIIC(0x01);
	AckIIC();
	for(i=0;i<0x14;i++){
		WriteIIC(Val713_1[i]);
		AckIIC();
		}
	StopIIC();
	DelayMSEC(1);

	StartIIC();
	WriteIIC(0x4a);			
	AckIIC();
	WriteIIC(0x15);
	AckIIC();
	for(i=0;i<4;i++){
		WriteIIC(Val713_2[i]);
		AckIIC();
		}
	StopIIC();
	DelayMSEC(1);
	
	StartIIC();
	WriteIIC(0x4a);			
	AckIIC();
	WriteIIC(0x40);
	AckIIC();
	for(i=0;i<0x20;i++){
		WriteIIC(Val713_3[i]);
		AckIIC();
		}
	StopIIC();
	DelayMSEC(1);
	
}

#pragma CODE_SECTION(Init7190,".text3")
void Init7190(void)
{
	int i;

	StartIIC();
	WriteIIC(0xd6);	
	AckIIC();
	WriteIIC(0x00);	
	AckIIC();
	for(i=0x0;i<0x36;i++){
		WriteIIC(Val76[i]);
		AckIIC();
	}
	StopIIC();
	DelayMSEC(5);
}

void SetInitBuffer(unsigned int uAddress)
{
	uFPGAAddress=uAddress;
}
/* END OF FILE */

⌨️ 快捷键说明

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