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

📄 iic.c

📁 车载DVD的主控MCU的源程序
💻 C
字号:
/*==========================================
==========================================*/
#include "include.h"
////////////////////////////////////////////////////////
/*==========================================
==========================================*/
void DDC2(void)
{
//	ISCL = 0;		//sherry ????
//	ISCL = 1;
}
/*==========================================
==========================================*/
void SetISCL(Bit flag)
{
	if(flag)
		PTB_REG |= PB4;
	else
		PTB_REG &= ~PB4;
}
void SetISDA(Bit flag)
{
	if(flag)
		PTB_REG |= PB5;
	else
		PTB_REG &= ~PB5;
}
void IIC_Start(void)
{
	SetISCL(1);
    	_nop_();
	_nop_();
    	SetISDA(1);
	_nop_();
	_nop_();
    	SetISDA(0);
	SetISCL(0);
}
/*==========================================
==========================================*/
void IIC_Stop(void)
{
	SetISDA(0);
	SetISCL(1);
	_nop_();
	_nop_();
	SetISDA(1);
}
Bit ReadISDA()
{
	Byte tmp;
	RDPB_REG |= 0x20;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	tmp=PTB_REG & PB5;
	RDPB_REG &= 0xdf;
	if(tmp == PB5)
		return 1;
	else
		return 0;
}
void IIC_ReStart(void)  //s0310
{
	SetISCL(1);
    	_nop_();
	_nop_();
    	SetISDA(1);
	_nop_();
	_nop_();
    	SetISDA(0);
	SetISCL(0);
}
/*==========================================
==========================================*/
void CheckIIC(void)
{
//	ISCL = 1;
//	ISDA = 1;
//	while(!ISDA || !ISCL)	//waiting for IIC released
//		{
//		ISCL = 0;
//		IIC_Stop();
//		}
}
/*==========================================
==========================================*/
Byte IIC_Tx(Byte Data)
{	//subroutine total time 630us
	Byte AckLoop,Ack;
	Byte i;

	for(i=0;i<8;i++)
		{
	    SetISCL(0);
		_nop_();
		_nop_();
		SetISDA((Data & 0x80));
	    _nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		SetISCL(1);
		_nop_();
		_nop_();
		_nop_(); 
		Data =Data<<1;
		}

       
	SetISCL(0);
	_nop_();
	_nop_(); 
	SetISDA(1);
	SetISCL(1);
	Ack = NACK;
	for(AckLoop=0;AckLoop<50;AckLoop++) //260us
		{
		if(!(ReadISDA()))
			{
			Ack = ACK;
			break;
			}
		}
	SetISCL(0);
	return Ack;			//return success=0 / failure=1

}
/*==========================================
==========================================*/
Byte IIC_Rx(Bit Ack)
{
	Byte Data;
	Byte i;
	Data = 0;
	for(i=0;i<8;i++)
		{
		Data <<= 1;
		SetISCL(0);
		SetISDA(1);
		SetISCL(1);
        CLRWDT = 0x55;
		if((ReadISDA()))
			Data |= 1;
		else
			Data &= 0xfe;
		}
	SetISCL(0);
	SetISDA(Ack);
	SetISCL(1);
	SetISCL(0);
	return Data;

}
/*==========================================
==========================================*/
void WriteIIC(Byte device,Byte addr,Byte ch)
{
	IIC_Start();
	IIC_Tx(device);
	IIC_Tx(addr);
	IIC_Tx(ch);
	IIC_Stop();
}
/*==========================================
==========================================*/
void WriteIIC563(unsigned short addr,unsigned char ch)
{
	CheckRegPage(addr);
	IIC_Start();	
	IIC_Tx(SCALER_ADDR);	
	IIC_Tx(addr);	
	IIC_Tx(ch);
	IIC_Stop();
}
/*==========================================
==========================================*/
void WriteWordIIC563(unsigned short addr,unsigned short value)
{
	CheckRegPage(addr);
	IIC_Start();
	IIC_Tx(SCALER_ADDR);
	IIC_Tx((Byte)addr);
	IIC_Tx((Byte)value);
	IIC_Tx((Byte)(value>>8));	
	IIC_Stop();
}
/*==========================================
==========================================*/
unsigned char ReadIIC563(unsigned short addr)
{
	Byte value;
	CheckRegPage(addr);
	IIC_Start();
	IIC_Tx(SCALER_ADDR);
	IIC_Tx(addr);
	IIC_ReStart();
	IIC_Tx(SCALER_ADDR+1);
	value = IIC_Rx(NACK);	//nack
	IIC_Stop();
	return value;
}
/*==========================================
==========================================*/
unsigned short ReadWordIIC563(unsigned short addr)
{
	Byte temp;
	Word value;
	CheckRegPage(addr);
	IIC_Start();
	IIC_Tx(SCALER_ADDR);
	IIC_Tx(addr);
	IIC_ReStart();
	IIC_Tx(SCALER_ADDR+1);
	temp = IIC_Rx(ACK);
	value = IIC_Rx(NACK);	//nack
	value <<= 8;
	value += temp;
	IIC_Stop();
	return value;
}
/*==========================================
==========================================*/
void CheckRegPage(unsigned short addr)
{
	Byte page;
	IIC_Start();
	IIC_Stop();
	page = (Byte)((addr/256) & 0x003);
	if(page != RegPage)
		{
		RegPage = page;
		WriteIIC(SCALER_ADDR,0xff,RegPage);
		}
}
/*
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(device,addr,ch);
	WaitEEprom();
}

void WaitEEprom(void)
{
	Byte i,ack;
	for(i=0;i<100;i++)  //10ms 
		{
		IIC_Start();
		ack = IIC_Tx(0xa0);	//polling ACKnowledge
		IIC_Stop();
		if(ack == ACK){
			break;}
		CLRWDT = 0x55;
		}
}
*/
void WriteIIC_Video(Byte Subaddr,Byte Data)
{
	IIC_Start();
	IIC_Tx(0xba);
	IIC_Tx(Subaddr);
	IIC_Tx(Data);
	IIC_Stop();
}
/*==========================================
==========================================*/
Byte ReadIIC_Video(Byte Subaddr)
{
	Byte value;
	IIC_Start();
	IIC_Tx(0xba);
	IIC_Tx(Subaddr);
	IIC_ReStart();
	IIC_Tx(0xbb);
	value = IIC_Rx(NACK);	//nack
	IIC_Stop();
	return value;
}

⌨️ 快捷键说明

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