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

📄 i2c.c

📁 源程序是在VisualDSP环境下开发出来的
💻 C
字号:
#include <sysreg.h>
#include <builtins.h>
#include <defTS101.h>

#define SCL_START_COUNT 1200
#define SDA_START_COUNT 1200
#define SCL_START_REMAIN 600
#define SDA_SETUP 240
#define SCL_HIGH_COUNT 1200
#define SCL_LOW_COUNT 720
#define SCL_ACK_COUNT 720
#define SDA_STOP_COUNT 1200
#define SCL_LOW_REC 1200
#define SCL_HIGH_REC_PRE 480
#define SCL_HIGH_REC_LAT 720

extern void ack_function();
extern int ack_value;

void i2c(void);

void SDA_HIGH(void);
void SDA_LOW(void);
void SCL_HIGH(void);
void SCL_LOW(void);

void i2c_initial(void);
void i2c_start(void);
void i2c_stop(void);
int i2c_wrbyte(unsigned char data);
unsigned char i2c_rdbyte(void);
void i2c_ack(void);
void delay(int count);

int sqctl_reg;

void SDA_HIGH(void)
{
	sqctl_reg = sqctl_reg | 0x04000000;
	
	__builtin_sysreg_write(__SQCTL, sqctl_reg);
}

void SDA_LOW(void)
{
	sqctl_reg = sqctl_reg & 0xFBFFFFFF;
	
	__builtin_sysreg_write(__SQCTL, sqctl_reg);
}

void SCL_HIGH(void)
{
	sqctl_reg = sqctl_reg | 0x08000000;
	
	__builtin_sysreg_write(__SQCTL, sqctl_reg);
}

void SCL_LOW(void)
{
	sqctl_reg = sqctl_reg & 0xF7FFFFFF;
	
	__builtin_sysreg_write(__SQCTL, sqctl_reg);
}

void i2c_initial(void)
{
	sqctl_reg = __builtin_sysreg_read(__SQCTL);
	sqctl_reg = sqctl_reg | 0x00F00000;
	sqctl_reg = sqctl_reg | 0x0C000000;
	sqctl_reg = sqctl_reg & 0xFCFFFFFF;
	__builtin_sysreg_write(__SQCTL, sqctl_reg);
}

void i2c_start(void)
{
	SDA_HIGH();
	SCL_HIGH();
	delay(SCL_START_COUNT);
	SDA_LOW();
	delay(SDA_START_COUNT);
	SCL_LOW();
}

void i2c_stop(void)
{
	SDA_LOW();
	delay(SDA_SETUP);
	SCL_HIGH();
	delay(SDA_STOP_COUNT);
	SDA_HIGH();
}

int i2c_wrbyte(unsigned char data)
{	
	int i;
	int ack = 1;
	sqctl_reg = sqctl_reg | 0x00400000;
	__builtin_sysreg_write(__SQCTL, sqctl_reg);
	
	for(i=0;i<8;i++)
	{
		if((data<<i)&0x80) SDA_HIGH();
		else
			SDA_LOW();
		delay(SDA_SETUP);
		SCL_HIGH();
		delay(SCL_HIGH_COUNT);
		SCL_LOW();
		delay(SCL_LOW_COUNT);
	}
		
	sqctl_reg = sqctl_reg & 0xFFBFFFFF;
	sqctl_reg = sqctl_reg | 0x02000000;
	__builtin_sysreg_write(__SQCTL, sqctl_reg);
	
	SCL_HIGH();
	delay(SCL_ACK_COUNT);
	
	ack_function();	
	ack = ack_value;
	SCL_LOW();
	delay(SCL_LOW_COUNT);
	sqctl_reg = sqctl_reg | 0x00400000;
	sqctl_reg = sqctl_reg & 0xFDFFFFFF;
	__builtin_sysreg_write(__SQCTL, sqctl_reg);
	return(ack);
}

unsigned char i2c_rdbyte(void)
{
	int i;
	unsigned char data_rec = 0;
	
	sqctl_reg = sqctl_reg & 0xFFBFFFFF;
	sqctl_reg = sqctl_reg | 0x02000000;
	__builtin_sysreg_write(__SQCTL, sqctl_reg);
	
	for(i=0;i<8;i++)
	{
		SCL_LOW();
		delay(SCL_LOW_REC);
		SCL_HIGH();
		delay(SCL_HIGH_REC_PRE);
		ack_function();
		data_rec = data_rec <<1;
		if (ack_value==1) data_rec = data_rec | 0x01;
		delay(SCL_HIGH_REC_LAT);
	}
	
	sqctl_reg = sqctl_reg | 0x0040000;
	sqctl_reg = sqctl_reg & 0xFDFFFFFF;
	__builtin_sysreg_write(__SQCTL, sqctl_reg);
	
	SCL_LOW();
	delay(SCL_LOW_COUNT);
	return data_rec;
}	

void i2c_ack(void)
{
	SDA_LOW();
	delay(SCL_HIGH_REC_PRE);
	SCL_HIGH();
	delay(SCL_HIGH_COUNT);
	SCL_LOW();
	delay(SCL_HIGH_REC_PRE);
}	
	
void delay(int count)
{
	int i;
	for(i=0;i<count;i++)
	{	}
}

void i2c(void)
{
	unsigned char i2c_data ;
	unsigned char i2c_rev_data = 0;
	
/* cdc318a test */
	i2c_initial();
	i2c_start();
	i2c_data = 0xd2;
	i2c_wrbyte(i2c_data);
	i2c_data = 0xff;
	i2c_wrbyte(i2c_data);
	i2c_data = 0xff;
	i2c_wrbyte(i2c_data);
	i2c_data = 0xff;
	i2c_wrbyte(i2c_data);
	i2c_data = 0xff;
	i2c_wrbyte(i2c_data);
	i2c_data = 0xff;
	i2c_wrbyte(i2c_data);	
	i2c_stop();	

/* ks0127_a test*/
	//set CMDA address:0x01 value:2d
	i2c_initial();
	i2c_start();
	i2c_data = 0xd8;
	i2c_wrbyte(i2c_data);
	i2c_data = 0x01;
	i2c_wrbyte(i2c_data);
	i2c_data = 0x2d;
	i2c_wrbyte(i2c_data);
	i2c_stop();	
	
	i2c_start();
	i2c_data = 0xd8;
	i2c_wrbyte(i2c_data);
	i2c_data = 0x01;
	i2c_wrbyte(i2c_data);
	i2c_stop();	
	
	i2c_start();
	i2c_data = 0xd9;
	i2c_wrbyte(i2c_data);
	i2c_rev_data = i2c_rdbyte();
	i2c_stop();	
	
	//set OFMTA address:0x1e value:10
	i2c_initial();
	i2c_start();
	i2c_data = 0xd8;
	i2c_wrbyte(i2c_data);
	i2c_data = 0x1e;
	i2c_wrbyte(i2c_data);
	i2c_data = 0x10;
	i2c_wrbyte(i2c_data);
	i2c_stop();	
	
	i2c_start();
	i2c_data = 0xd8;
	i2c_wrbyte(i2c_data);
	i2c_data = 0x1e;
	i2c_wrbyte(i2c_data);
	i2c_stop();	
	
	i2c_start();
	i2c_data = 0xd9;
	i2c_wrbyte(i2c_data);
	i2c_rev_data = i2c_rdbyte();
	i2c_stop();	
	
	//set REFCOD address:0x31 value:80
	i2c_initial();
	i2c_start();
	i2c_data = 0xd8;
	i2c_wrbyte(i2c_data);
	i2c_data = 0x31;
	i2c_wrbyte(i2c_data);
	i2c_data = 0x80;
	i2c_wrbyte(i2c_data);
	i2c_stop();	
	
	i2c_start();
	i2c_data = 0xd8;
	i2c_wrbyte(i2c_data);
	i2c_data = 0x31;
	i2c_wrbyte(i2c_data);
	i2c_stop();	
	
	i2c_start();
	i2c_data = 0xd9;
	i2c_wrbyte(i2c_data);
	i2c_rev_data = i2c_rdbyte();
	i2c_stop();	
	
/* ks0127_b test*/
		//set CMDA address:0x01 value:2d
	i2c_initial();
	i2c_start();
	i2c_data = 0xde;
	i2c_wrbyte(i2c_data);
	i2c_data = 0x01;
	i2c_wrbyte(i2c_data);
	i2c_data = 0x2d;
	i2c_wrbyte(i2c_data);
	i2c_stop();	
	
	i2c_start();
	i2c_data = 0xde;
	i2c_wrbyte(i2c_data);
	i2c_data = 0x01;
	i2c_wrbyte(i2c_data);
	i2c_stop();	
	
	i2c_start();
	i2c_data = 0xdf;
	i2c_wrbyte(i2c_data);
	i2c_rev_data = i2c_rdbyte();
	i2c_stop();	
	
	//set OFMTA address:0x1e value:10
	i2c_initial();
	i2c_start();
	i2c_data = 0xde;
	i2c_wrbyte(i2c_data);
	i2c_data = 0x1e;
	i2c_wrbyte(i2c_data);
	i2c_data = 0x10;
	i2c_wrbyte(i2c_data);
	i2c_stop();	
	
	i2c_start();
	i2c_data = 0xde;
	i2c_wrbyte(i2c_data);
	i2c_data = 0x1e;
	i2c_wrbyte(i2c_data);
	i2c_stop();	
	
	i2c_start();
	i2c_data = 0xdf;
	i2c_wrbyte(i2c_data);
	i2c_rev_data = i2c_rdbyte();
	i2c_stop();	
	
	//set REFCOD address:0x31 value:80
	i2c_initial();
	i2c_start();
	i2c_data = 0xde;
	i2c_wrbyte(i2c_data);
	i2c_data = 0x31;
	i2c_wrbyte(i2c_data);
	i2c_data = 0x80;
	i2c_wrbyte(i2c_data);
	i2c_stop();	
	
	i2c_start();
	i2c_data = 0xde;
	i2c_wrbyte(i2c_data);
	i2c_data = 0x31;
	i2c_wrbyte(i2c_data);
	i2c_stop();	
	
	i2c_start();
	i2c_data = 0xdf;
	i2c_wrbyte(i2c_data);
	i2c_rev_data = i2c_rdbyte();
	i2c_stop();	
	
/* adv7176 test	*/
	//set Mode Register 0,MR06 bit to "1"
	i2c_initial();
	i2c_start();
	i2c_data = 0x54;
	i2c_wrbyte(i2c_data);
	i2c_data = 0x00;
	i2c_wrbyte(i2c_data);
	i2c_data = 0x64;       //将MOde Register0寄存器设置为0x 6 4,使得输出为CVBS+RGB方式	
	i2c_wrbyte(i2c_data);
	i2c_stop();	
	
	i2c_start();
	i2c_data = 0x54;
	i2c_wrbyte(i2c_data);
	i2c_data = 0x00;
	i2c_wrbyte(i2c_data);
	i2c_start();
	i2c_data = 0x55;
	i2c_wrbyte(i2c_data);
	i2c_rev_data = i2c_rdbyte();
	i2c_stop();	
	
	//set Timing Register0 address:07 value:4a
	i2c_initial();
	i2c_start();
	i2c_data = 0x54;
	i2c_wrbyte(i2c_data);
	i2c_data = 0x07;
	i2c_wrbyte(i2c_data);
	i2c_data = 0x4a;       
	i2c_wrbyte(i2c_data);
	i2c_stop();	
	
	i2c_start();
	i2c_data = 0x54;
	i2c_wrbyte(i2c_data);
	i2c_data = 0x07;
	i2c_wrbyte(i2c_data);
	i2c_start();
	i2c_data = 0x55;
	i2c_wrbyte(i2c_data);
	i2c_rev_data = i2c_rdbyte();
	i2c_stop();	
	
	//set Mode Register 1 address:01 value:00
	i2c_initial();
	i2c_start();
	i2c_data = 0x54;
	i2c_wrbyte(i2c_data);
	i2c_data = 0x01;
	i2c_wrbyte(i2c_data);
	i2c_data = 0x00;       
	i2c_wrbyte(i2c_data);
	i2c_stop();	
	
	i2c_start();
	i2c_data = 0x54;
	i2c_wrbyte(i2c_data);
	i2c_data = 0x01;
	i2c_wrbyte(i2c_data);
	i2c_start();
	i2c_data = 0x55;
	i2c_wrbyte(i2c_data);
	i2c_rev_data = i2c_rdbyte();
	i2c_stop();	
	
}	
		

⌨️ 快捷键说明

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