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

📄 iic.c

📁 myson的MTV332的DEMO程序 主要功能有菜单的设计和无线遥控以及视频参数的调节
💻 C
字号:
#include "global.h"

#define EEPROM_PBYTE 16   // 24c16
#define EEPROM_PTIME 7     // wait 7 ms


/****************************************************************************/
void Short_Delay(BYTE Time)
{ 
	while(Time --);
}

void DoWait(WORD Time)             // delay   1ms
{
	BYTE   Counter;
   
	for(; Time > 0;   Time --)
	{
		Counter   = 250;
		while(--Counter);

		Counter   = 250;
		while(--Counter);
	}
}

/****************************************************************************/
//                                     Software IIC
/****************************************************************************/
#ifdef _IICSW_

//---------------------------------------------------------------------------
void IIC_Start(void)
{
	ResSDA;
	ResSCL;
}

//---------------------------------------------------------------------------
void IIC_Stop(void)
{
	SetSDA;
	ResSDA;
	SetSCL;
	while(!GetSCL);
	SetSDA;
}

//---------------------------------------------------------------------------
void Initial_I2C(void)
{
	EEP_Wait = 0;

	IIC_Stop();
}

//---------------------------------------------------------------------------
void IIC_Send1Byte(BYTE senddata)
{
	BYTE i;

	for(i = 0; i < 8; i++)
	{
		if(senddata & 0x80)
			SetSDA;
		else
			ResSDA;
		
		senddata <<=1;		

		SetSCL;
              while(!GetSCL);
		ResSCL;	  
	}
	
	ResSCL;
	SetSDA;
	SetSCL;
       while(!GetSCL);

	if (GetSDA)
		bNoAck = 1;
	else
		bNoAck = 0;
	ResSCL;

}

//---------------------------------------------------------------------------
BYTE IIC_Read1Byte(BIT noack)
{
	BYTE i,readdata=0;

	for(i = 0; i < 8; i++)
	{
		readdata <<= 1;

		SetSDA;
		SetSCL;
		while(!GetSCL);
		
		if(GetSDA)
			readdata |= 0x01;
		ResSCL;
	}	
	if(noack)
		SetSDA;
	else
		ResSDA;

	SetSCL;
      while(!GetSCL);
	ResSCL;

	return readdata;

}

/****************************************************************************/
//	IIC write address
/****************************************************************************/
void IICSW_Write(BYTE id,BYTE addr,BYTE *databuf,WORD number)
{
	int i;
	BYTE count = 0;
	
do
{
	count++;
	
// Stop
	IIC_Stop();
Short_Delay(20);

// Start
	IIC_Start();

// Slave ID	
	IIC_Send1Byte(id); 

if (bNoAck)
	continue;

// Address
	IIC_Send1Byte(addr);

if (bNoAck)
	continue;

// data
	for(i = 0; i < number; i++)
	{
		IIC_Send1Byte(databuf[i]);
		if(bNoAck)
			break;
	}

if (bNoAck)
	continue;

// Stop
	IIC_Stop();
}
while(bNoAck && count < 10);

}

/****************************************************************************/
//	IIC Read address
/****************************************************************************/
void IICSW_Read(BYTE id,BYTE addr,BYTE *databuf,WORD number)
{
	int i;
	BYTE count = 0;
	
do
{
	count++;
	
// Stop
	IIC_Stop();
Short_Delay(20);

// Start
	IIC_Start();

// Slave ID	
	IIC_Send1Byte(id); 

if (bNoAck)
	continue;

// Address
	IIC_Send1Byte(addr);

if (bNoAck)
	continue;

   SetSDA;
   SetSCL;
   while(!GetSCL);
	IIC_Start();

// Slave ID 
	IIC_Send1Byte(id | 0x01);

if (bNoAck)
	continue;

// data
	for(i = 0; i < number-1; i++)
	{
		databuf[i] = IIC_Read1Byte(0);
	}

	databuf[i] = IIC_Read1Byte(1);

// Stop
	IIC_Stop();
}
while(bNoAck && count < 10);

}
#endif  //  #ifdef _IICSW_


/****************************************************************************/
//                                  Hardware IIC
/****************************************************************************/
#ifdef _IICHW_
//--------------------------------------------------------
void Initial_I2C(void)
{
	EEP_Wait = 0;

	byMTV_IIC_CTR = 0x0;				  // STOP
	byMTV_IIC_CTR = 0x2;				  // STOP
}

//--------------------------------------------------------
// Wait for MBUFL flag and clear it, return 1 if time out
//--------------------------------------------------------
void Wait_IIC_Ack(void)
{
	Short_Delay(10);
	IIC_Timer = 1;

	while(IIC_Timer > 0 && (byMTV_IIC_INTFLG & 0x1) == 0);

	if ((byMTV_IIC_STUS1 & 0x01 ) == 0)
		bNoAck = 0;
	else
		bNoAck = 1; 

	byMTV_IIC_INTFLG = 0;
}

//--------------------------------------------------------
//	IIC write address
//--------------------------------------------------------
void IIC_Write(BYTE id,BYTE addr,BYTE *databuf,WORD number)
{
	int i;
	BYTE count = 0;

do
{
	count++;
	
// Stop
	byMTV_IIC_CTR = 0x00;
	byMTV_IIC_CTR = 0x02;
Short_Delay(20);

	byMTV_IIC_INTFLG = 0x00;	

// Slave ID	
	byMTV_IIC_MBUF = id; 

// Start
	byMTV_IIC_CTR = 0x00;
	byMTV_IIC_CTR = 0x01;

	Wait_IIC_Ack();

if (bNoAck)
	continue;

// Address
	byMTV_IIC_MBUF = addr;

	Wait_IIC_Ack();

if (bNoAck)
	continue;

// data
	for(i = 0; i < number; i++)
	{
		byMTV_IIC_MBUF = databuf[i];
		
		Wait_IIC_Ack();
		if(bNoAck)
			break;
	}

}
while(bNoAck && count < 10);

// Stop
	byMTV_IIC_CTR = 0x00;
	byMTV_IIC_CTR = 0x02; 
}

//--------------------------------------------------------
//	IIC Read address
//--------------------------------------------------------
void IIC_Read(BYTE id,BYTE addr,BYTE *databuf,WORD number)
{
	int i;
	BYTE count = 0;

do
{
	count++;
	
// Stop
	byMTV_IIC_CTR = 0x00;
	byMTV_IIC_CTR = 0x02; 
Short_Delay(20);

	byMTV_IIC_INTFLG = 0x00;	

// Slave ID	
	byMTV_IIC_MBUF = id; 

// Start
	byMTV_IIC_CTR = 0x00;
	byMTV_IIC_CTR = 0x01;
	
	Wait_IIC_Ack();

if (bNoAck)
	continue;

// Address
	byMTV_IIC_MBUF = addr;

	Wait_IIC_Ack();

if (bNoAck)
	continue;

// Stop		
	byMTV_IIC_CTR = 0;
	byMTV_IIC_CTR = 0x2;
Short_Delay(20);

// Slave ID 
	byMTV_IIC_MBUF = id | 0x01;

// Start
	byMTV_IIC_CTR = 0x0;
	byMTV_IIC_CTR = 0x1;
	
	Wait_IIC_Ack();

if (bNoAck)
	continue;

// useless data
	databuf[0] = byMTV_IIC_MBUF;	

// data
	for(i = 0; i < number-1; i++)
	{
		Wait_IIC_Ack();
		if(bNoAck)
			break;
		 databuf[i] = byMTV_IIC_MBUF; 
	}

if(bNoAck)
	continue;
		
	byMTV_IIC_CTR = 0x05;

	Wait_IIC_Ack();

if (bNoAck)
	continue;

	databuf[i] = byMTV_IIC_MBUF; 

}
while(bNoAck && count < 10);

// Stop
	byMTV_IIC_CTR = 0x00;
	byMTV_IIC_CTR = 0x02;
}
#endif  //  #ifdef _IICSW_


/****************************************************************************/
void EEPROM_Write(WORD addr,BYTE *databuf,WORD number)
{
	BYTE id,temp;
	union W_TEMP addr1;

	addr1.valW = addr;
	
	while( number > 0)
	{
		id = I2C_EEP_ADDR + (addr1.valB[0] << 1);
		temp = EEPROM_PBYTE -(addr1.valB[1]&(EEPROM_PBYTE-1));
		if( temp > number)
			temp = number;


		while(EEP_Wait > 0);

		WriteData(id,addr1.valB[1],databuf,temp);
		EEP_Wait = EEPROM_PTIME;
	
		number -= temp;
		addr1.valW += temp;
		databuf += temp;
	}
	
}

/****************************************************************************/
void EEPROM_Read(WORD addr,BYTE *databuf,WORD number)
{
	BYTE id;
	union W_TEMP addr1;

	addr1.valW = addr;
	id = I2C_EEP_ADDR + (addr1.valB[0] << 1);
	while(EEP_Wait > 0);

	ReadData(id,addr1.valB[1],databuf,number);

}
/****************************************************************************/
void CS7111_Read(WORD addr,BYTE *databuf,WORD number)
{
	ReadData(I2C_CS7111_ADDR,addr,databuf,number);   
}

/****************************************************************************/
void CS7111_Write(BYTE addr,BYTE databuf)
{
	WriteData(I2C_CS7111_ADDR,addr,&databuf,1);

}

⌨️ 快捷键说明

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