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

📄 iic.c

📁 NOVATEK公司的LCD_CONTROLLER源代码 液晶显示器驱动板源代码NT68521
💻 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 + -