📄 iic.c
字号:
#include "stdio.h"
#include "8051.H"
#include "RAM.H"
#include "IIC.H"
#include "MCU.H"
#include "ROM_MAP.H"
#include "MyDef.H"
#include "F63REG.H"
#include "UserAdj.H"
#include "Scaler.H"
#include "SAA7114.H"
unsigned char Read24C16(unsigned short addr16)
{
unsigned char ch;
unsigned short device,addr;
addr = addr16 & 0x0ff;
device = (addr16 >> 7) & 0x0e;
device |= EEPROM;
ch = ReadIIC_HW(device,addr);
return ch;
}
void InitEEPROM(void)
{
unsigned short addr;
for(addr=0; addr<0x280; addr=addr+16){
WritePage24C16(addr,addr,MCU_DataMap);
}
for(addr=0; addr<50; addr++){
Write24C16(0x290+addr*2,MCU_DataMap[0x104+addr*8]);
Write24C16(0x291+addr*2,MCU_DataMap[0x105+addr*8]);
}
Write24C16(0xe8,0x55);
Write24C16(0xe9,0xaa);
Write24C16(0xea,Version);
Write24C16(0xeb,Reversion);
}
void Write24C16(unsigned short k,unsigned char ch)
{
unsigned char device,addr;
addr = (unsigned char)k;
device = (unsigned char)((k>>7)&0x0e);
device |= EEPROM;
WriteIIC_HW(device,addr,ch);
Sleep(12);
}
void WritePage24C16(unsigned short addr1,unsigned short addr2,unsigned char *p)
{
unsigned char i,ch;
i = (unsigned char)((addr1 >>7 ) & 0x0e);
i |= EEPROM;
/* start bit */
/* transmit device */
INTIIC1_FLG = 0xff;
IIC1_DATA = i;
IIC1_CLK = 0x20 | IIC_BaudRate;
IIC1_CON = 0x00;
/* transmit addr */
MasterSendByte(addr1);
/* transmit data */
for(i=0; i<16; i++){
ch = p[addr2 + i];
MasterSendByte(ch);
}
/* transmit dumy data for stop bit */
WaitTx();
/* stop bit */
IIC1_CLK = 0xA0|IIC_BaudRate;
// IIC1_CON = 0x00;
WaitStop();
Sleep(12);
}
void WriteWordIIC_HW(unsigned char device,unsigned char addr,unsigned short value)
{
/* start bit */
/* transmit device */
INTIIC1_FLG = 0xff;
IIC1_DATA = device;
IIC1_CLK = 0x20 | IIC_BaudRate;
IIC1_CON = 0x00;
/* transmit addr */
MasterSendByte(addr);
/* transmit data */
MasterSendByte((unsigned char)value);
MasterSendByte((unsigned char)(value >> 8));
/* transmit dumy data for stop bit */
WaitTx();
/* stop bit */
IIC1_CLK = 0xA0|IIC_BaudRate;
// IIC1_CON = 0x00;
WaitStop();
}
void LoadDDCData(unsigned char ddcsw)
{
unsigned char *p,i;
unsigned short device,addr;
DDC_CTRL = 0;
p = &DDCPtr;
if(ddcsw == 0){
/* if((PortC & BIT_1) == 0){ //digital
flag2 &= ~BIT_7;
addr = (unsigned char)DDC_EEP_Addr_D;
device = (unsigned char)(DDC_EEP_Addr_D >> 7) & 0x0e;
if((flag3 & BIT_2) != 0x00)
printf("Load Digital EDID\r\n");
}
else{ //analog
flag2 |= BIT_7;
addr = (unsigned char)DDC_EEP_Addr_A;
device = (unsigned char)(DDC_EEP_Addr_A >> 7) & 0x0e;
if((flag3 & BIT_2) != 0x00)
printf("Load Analog EDID\r\n");
}*/
}
else if(ddcsw == 1){ //analog
flag2 |= BIT_7;
addr = (unsigned char)DDC_EEP_Addr_A;
device = (unsigned char)(DDC_EEP_Addr_A >> 7) & 0x0e;
if((flag3 & BIT_2) != 0x00)
printf("\n Load Analog EDID\r\n");
}
else{ //digital
flag2 &= ~BIT_7;
addr = (unsigned char)DDC_EEP_Addr_D;
device = (unsigned char)(DDC_EEP_Addr_D >> 7) & 0x0e;
if((flag3 & BIT_2) != 0x00)
printf("Load Digital EDID\r\n");
}
device |= EEPROM;
/* start bit */
/* transmit device */
INTIIC1_FLG = 0xff;
IIC1_DATA = device;
IIC1_CLK = 0x20 | IIC_BaudRate;
/* transmit addr */
MasterSendByte(addr);
/* transmit dumy data for restart bit */
WaitTx();
/* stop bit */
IIC1_CLK = 0xA0|IIC_BaudRate;
// IIC1_CON = 0x00;
/* restart bit */
WaitStop();
/* transmit device */
IIC1_DATA = device+1;
IIC1_CLK = 0x60 | IIC_BaudRate;
WaitTx();
/* read data */
for(i=128; i>0; i--){
*p = MasterReadByte(i);
p++;
}
/* no ack */
/* stop bit */
// IIC1_CLK = 0xA0|IIC_BaudRate;
// IIC1_CON = 0x00;
WaitStop();
DDC_CTRL = (EN_DDC |WPT_DDC | CLR_UPD | CLR_PTR);
// if((flag3 & BIT_0) == 0)
// DDC_CTRL = (EN_DDC | WPT_DDC | MODE_DDC);
// else
DDC_CTRL = (EN_DDC | MODE_DDC);
}
void SaveDDCData(unsigned char ddcsw)
{
unsigned char *p,i;
LED_GrnOff();
LED_RedOn();
DDC_CTRL = (EN_DDC | MODE_DDC | CLR_UPD);
Timer3 = DDC_DelayTime;
while(Timer3 != 0){
if((INTIIC0_FLG & INTSTOP) != 0){
INTIIC0_FLG = INTSTOP;
Timer3 = DDC_DelayTime;
}
if((DDC_REG & UPD_DDC) != 0){ //up date ddc
DDC_CTRL = (EN_DDC | MODE_DDC | CLR_UPD);
Timer3 = DDC_DelayTime;
}
}
p = &DDCPtr;
if(ddcsw == 0){
/* if((PortC & BIT_1) == 0){ //digital
for(i=0; i<128; i=i+16){
do{
DDC_REG = WR_SUCC;
WritePage24C16(DDC_EEP_Addr_D+i,i,p);
if((DDC_REG & UPD_DDC) != 0){ //up date ddc
return;
}
}while((DDC_REG & WR_SUCC) == 0); //unsuccessful
}
}
else{ //analog c
for(i=0; i<128; i=i+16){
do{
DDC_REG = WR_SUCC;
WritePage24C16(DDC_EEP_Addr_A+i,i,p);
if((DDC_REG & UPD_DDC) != 0){ //up date ddc
return;
}
}while((DDC_REG & WR_SUCC) == 0); //unsuccessful
}
}*/
}
else if(ddcsw == 1){ //analog
for(i=0; i<128; i=i+16){
do{
DDC_REG = WR_SUCC;
WritePage24C16(DDC_EEP_Addr_A+i,i,p);
if((DDC_REG & UPD_DDC) != 0){ //up date ddc
return;
}
}while((DDC_REG & WR_SUCC) == 0); //unsuccessful
}
}
else{ //digital
for(i=0; i<128; i=i+16){
do{
DDC_REG = WR_SUCC;
WritePage24C16(DDC_EEP_Addr_D+i,i,p);
if((DDC_REG & UPD_DDC) != 0){ //up date ddc
return;
}
}while((DDC_REG & WR_SUCC) == 0); //unsuccessful
}
}
LED_GrnOn();
LED_RedOff();
}
void WriteIIC_HW(unsigned char device,unsigned char addr,unsigned char ch)
{
/* start bit */
/* transmit device */
INTIIC1_FLG = 0xff;
IIC1_DATA = device;
IIC1_CLK = 0x20 | IIC_BaudRate;
IIC1_CON = 0x00;
/* transmit addr */
MasterSendByte(addr);
/* transmit data */
MasterSendByte(ch);
/* transmit dumy data for stop bit */
WaitTx();
/* stop bit */
IIC1_CLK = 0xA0|IIC_BaudRate;
// IIC1_CON = 0x00;
WaitStop();
}
void MasterSendByte(unsigned char i)
{
Timer1 = 100;
while((INTIIC1_FLG & INTTX) == 0){
if(Timer1 == 0){
if((flag3 & BIT_2) != 0x00){
printf("ACK Fail2\r\n");
}
EA = 0;
break;
}
}
INTIIC1_FLG = INTTX;
IIC1_DATA = i;
}
void WaitTx(void)
{
Timer1 = 100;
while((INTIIC1_FLG & INTTX) == 0){
if(Timer1 == 0){
if((flag3 & BIT_2) != 0x00){
printf("ACK Fail3\r\n");
}
EA = 0;
break;
}
}
INTIIC1_FLG = INTTX;
}
void WriteIICV_HW(unsigned char device,unsigned char addr,unsigned char ch)
{
/* start bit */
/* transmit device */
INTIIC1_FLG = 0xff;
IIC1_DATA = device;
IIC1_CLK = 0x20 | IIC_BaudRate;
IIC1_CON = 0x00;
/* transmit addr */
MasterSendByte(addr);
/* transmit data */
MasterSendByteV(ch);
/* transmit dumy data for stop bit */
WaitTx();
/* stop bit */
IIC1_CLK = 0xA0|IIC_BaudRate;
// IIC1_CON = 0x00;
WaitStop();
}
void MasterSendByteV(unsigned char i)
{
Timer1 = 100;
while((INTIIC1_FLG & INTTX) == 0){
if(Timer1 == 0){
if((flag3 & BIT_2) != 0x00){
printf("ACK Fail6\r\n");
}
EA = 0;
break;
}
}
INTHV_FLG |= INT_V;
Timer1 = 40;
while(Timer1 != 0){
if((INTHV_FLG & INT_V) != 0)
break;
}
INTIIC1_FLG = INTTX;
IIC1_DATA = i;
if(Timer1 == 0){
BackLightOff();
flag2 |= BIT_0;
H_SYNC_Temp = 0xffff;
V_SYNC_Temp = 0xffff;
if((flag3 & BIT_2) != 0x00){
printf("Mode change\r\n");
}
}
}
#if 0
unsigned long ReadDWordIIC_HW(unsigned char device,unsigned char addr)
{
typedef union
{
unsigned long dw;
unsigned short w[2];
unsigned char b[4];
}Union;
Union value;
/* start bit */
/* transmit device */
INTIIC1_FLG = 0xff;
IIC1_DATA = device;
IIC1_CLK = 0x20 | IIC_BaudRate;
/* transmit addr */
MasterSendByte(addr);
/* transmit dumy data for restart bit */
WaitTx();
/* stop bit */
IIC1_CLK = 0xA0|IIC_BaudRate;
// IIC1_CON = 0x00;
/* restart bit */
WaitStop();
/* transmit device */
IIC1_DATA = device+1;
IIC1_CLK = 0x60 | IIC_BaudRate;
WaitTx();
/* read data */
IIC1_CON = 0x00;
value.b[0] = MasterReadByte();
IIC1_CON = 0x00;
value.b[1] = MasterReadByte();
IIC1_CON = 0x00;
value.b[2] = MasterReadByte();
IIC1_CON = 0x02;
value.b[3] = MasterReadByte();
/* no ack */
/* stop bit */
// IIC1_CLK = 0xA0|IIC_BaudRate;
// IIC1_CON = 0x00;
WaitStop();
return(value.dw);
}
#endif
unsigned short ReadWordIIC_HW(unsigned char device,unsigned char addr)
{
unsigned char ch;
unsigned short value;
/* start bit */
/* transmit device */
INTIIC1_FLG = 0xff;
IIC1_DATA = device;
IIC1_CLK = 0x20 | IIC_BaudRate;
/* transmit addr */
MasterSendByte(addr);
/* transmit dumy data for restart bit */
WaitTx();
/* stop bit */
IIC1_CLK = 0xA0|IIC_BaudRate;
// IIC1_CON = 0x00;
/* restart bit */
WaitStop();
/* transmit device */
IIC1_DATA = device+1;
IIC1_CLK = 0x60 | IIC_BaudRate;
WaitTx();
/* read data */
// IIC1_CON = 0x00;
ch = MasterReadByte(2);
// IIC1_CON = 0x02;
value = MasterReadByte(1);
value <<= 8;
value |= ch;
/* no ack */
/* stop bit */
// IIC1_CLK = 0xA0|IIC_BaudRate;
// IIC1_CON = 0x00;
WaitStop();
return(value);
}
unsigned char ReadIIC_HW(unsigned char device,unsigned char addr)
{
unsigned char value;
/* start bit */
/* transmit device */
INTIIC1_FLG = 0xff;
IIC1_DATA = device;
IIC1_CLK = 0x20 | IIC_BaudRate;
/* transmit addr */
MasterSendByte(addr);
/* transmit dumy data for restart bit */
WaitTx();
/* stop bit */
IIC1_CLK = 0xA0|IIC_BaudRate;
// IIC1_CON = 0x00;
/* restart bit */
WaitStop();
/* transmit device */
IIC1_DATA = device+1;
IIC1_CLK = 0x60 | IIC_BaudRate;
WaitTx();
/* read data */
// IIC1_CON = 0x02;
value = MasterReadByte(1);
/* no ack */
/* stop bit */
// IIC1_CLK = 0xA0|IIC_BaudRate;
// IIC1_CON = 0x00;
WaitStop();
return(value);
}
unsigned char MasterReadByte(unsigned char k)
{
unsigned char i;
Timer1 = 100;
while((INTIIC1_FLG & INTRX) == 0){
if(Timer1 == 0){
if((flag3 & BIT_2) != 0x00){
printf("ACK Fail4\r\n");
}
EA = 0;
break;
}
}
if(k == 1){
IIC1_CON = 0x02;
}
else{
IIC1_CON = 0x00;
}
INTIIC1_FLG = INTRX;
i = IIC1_DATA;
return i;
}
void WaitStop(void)
{
Timer1 = 100;
while((IIC1_CON & STOP) == 0){
if(Timer1 == 0){
if((flag3 & BIT_2) != 0x00){
printf("Stop Fail\r\n");
}
EA = 0;
break;
}
}
IIC1_CON = 0x00;
}
void CheckDevice(void)
{
DeviceFlag = 0;
//check SAA7114
if((flag3 & BIT_2) != 0x00){
printf("Video Decoder ");
}
VideoEnable();
Sleep(10);
if(TestIIC_HW(SAA7114) == 0)
DeviceFlag &= ~BIT_0;
else
DeviceFlag |= BIT_0;
VideoDisable();
}
unsigned char TestIIC_HW(unsigned char device)
{
unsigned char value;
/* start bit */
/* transmit device */
INTIIC1_FLG = 0xff;
IIC1_DATA = device + 1;
IIC1_CLK = 0x60 | IIC_BaudRate;
// IIC1_CON = 0x00;
Timer1 = 100;
while((INTIIC1_FLG & INTTX) == 0){
if(Timer1 == 0){
break;
}
}
INTIIC1_FLG = INTTX;
/* read data */
IIC1_CON = 0x02;
Timer1 = 100;
while((INTIIC1_FLG & INTRX) == 0){
if(Timer1 == 0)
break;
}
if(Timer1 == 0){
IIC1_CLK = 0xA0|IIC_BaudRate;
IIC1_CON = 0x00;
value = 0;
if((flag3 & BIT_2) != 0x00){
printf("not install\r\n");
}
}
else{
value = IIC1_DATA;
value |= BIT_1;
/* no ack */
/* stop bit */
// IIC1_CLK = 0xA0|IIC_BaudRate;
// IIC1_CON = 0x00;
WaitStop();
if((flag3 & BIT_2) != 0x00){
printf("install\r\n");
}
}
return(value);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -