📄 i2c.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 + -