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

📄 i2c_control.c

📁 一个LCD TV的源程序, 用的是realtek的IC
💻 C
字号:
/*********************************************************************

      COPYRIGHT  (C)  Himax Technologies, Inc.

      File name     : i2c_control.c

      Description   : Implement i2c relative control function

      Author        : Taylor

      Create date   :

      Modifications :

*********************************************************************/

#define _I2C_CONTROL_C

/********************** Include Section *****************************/

#include "i2c_control.h"

/**************** Function Implement Section ************************/

/* ================================================================
    Name    : Init_I2C
    Purpose : Initial I2C Bus
    Passed  : None
    Notes   : None
   ================================================================ */

void Init_I2C(void)
{
	ioI2cScl = 1;
	ioI2cSda = 1;

}

/* ================================================================
    Name    : Start
    Purpose : Start I2C Bus Protocol
    Passed  : None
    Notes   : None
   ================================================================ */

void Start(void)
{
	ioI2cSda = BIT1;
	_nop_();
	ioI2cScl = BIT1;
	_nop_();
	ioI2cSda = BIT0;
	_nop_();
	ioI2cScl = BIT0;
}


/* ================================================================
    Name    : Stop
    Purpose : Stop I2C Bus Protocol
    Passed  : None
    Notes   : None
   ================================================================ */

void Stop(void)
{
	ioI2cSda = BIT0;
	_nop_();
	ioI2cScl = BIT1;
	_nop_();
	ioI2cSda = BIT1;
	_nop_();
}


/* ================================================================
    Name    : Write
    Purpose : I2C Write one byte
    Passed  : One Byte Data or Command
    Notes   : Compare with other code, it's size is smallest !!
              Compare Time at 0910
   ================================================================ */

Bool Write(Byte byData)
{
  Byte byBitPos;
	Bool bAck;

	byBitPos = 0x80;
	while(byBitPos)
	{
		ioI2cScl = BIT0;
		_nop_();
		ioI2cSda  = (byData & byBitPos) ? BIT1 : BIT0;
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		ioI2cScl = BIT1;
		_nop_();
		ioI2cScl = BIT0;
		byBitPos >>= 1;
		_nop_();
	}
	ioI2cSda = BIT1;
	_nop_();
	ioI2cScl = BIT1;
	bAck = (ioI2cSda == BIT0) ? BIT1 :BIT0;
	ioI2cScl = BIT0;
	_nop_();
	ioI2cSda = BIT0;
  return bAck;
}

/* ================================================================
    Name    : Read
    Purpose : I2C Read One Byte
    Passed  : None
    Notes   :
   ================================================================ */

Byte Read(void)
{
	Byte byBitPos = 0x80;
	Byte c = 0;

	ioI2cSda = BIT1;
	while(byBitPos)
	{
		ioI2cScl = BIT1;
		while(ioI2cScl == BIT0);
		_nop_();
		if(ioI2cSda) c |= byBitPos;
		ioI2cScl = BIT0;
		_nop_();
		byBitPos >>= 1;
	}
	ioI2cSda=BIT1;
	_nop_();
	ioI2cScl=BIT1;
	_nop_();
	ioI2cScl=BIT0;
	_nop_();
	return c;
}

/* ================================================================
    Name    : I2CWriteByte
    Purpose : Write i2c device one byte
    Passed  : Pass I2C Device Address, subaddr & wanted-write data
    Notes   :
   ================================================================ */

Bool I2CWriteByte(Byte device, Byte subadr0, Byte c)
{
    Bool iAck;
    Again:
    Start();
    iAck = Write(device | I2C_W);
    if(iAck)      // Iack == 1 means ack
    {
			iAck = Write(subadr0);
			if(iAck)
        {
					iAck = Write(c);
        }
       else
       	goto Again;
    }
    else
    	goto Again;
    Stop();
    return iAck;
}

/* ================================================================
    Name    : I2CWrite2Byte
    Purpose : Write i2c Device 2 bytes command
    Passed  : Pass I2C Device Address, subaddr & wanted-write 2data
    Notes   :
   ================================================================ */

Bool I2CWrite2Byte(Byte device, Byte subadr0, Byte c1, Byte c2)
{
    Bool iAck;
    Start();
    iAck = Write(device | I2C_W);
    if(iAck)
    {
	   iAck = Write(subadr0);
	   if(iAck)
       {
         iAck = Write(c1);
       }
	   if(iAck)
       {
         iAck = Write(c2);
       }
    }
    Stop();
    return iAck;
}

/* ================================================================
    Name    : I2CReadByte
    Purpose : Read i2c device one byte
    Passed  : Pass Device Addr, subaddress, then read one byte
    Notes   :
   ================================================================ */

Byte I2CReadByte(Byte device, Byte subaddress)
{
    Bool iAck;
    Byte c;
    Start();
    iAck = Write(device | I2C_W);
    if(iAck)
    {
			iAck = Write(subaddress);
			if(iAck)
			{
		  	Start();
    	  iAck = Write(device | I2C_R);
	    }
  	  if(iAck)
  	  	c = Read();
	    Stop();
  	  return c;
    }
}

/* ================================================================
    Name    : I2CWrtCNByte
    Purpose : Write Command Array to I2C Device
    Passed  : Pass Device Addr, code-array, start reg address, length
    Notes   :
   ================================================================ */

Bool I2CWrtCNByte(Byte byDEV, Byte code *ptr, Byte byStartReg, Byte byLen)
{
    Byte i;
    Bool iAck;

	EX0	= 0;
	Start();
	iAck = Write(byDEV);
	if (iAck)
	{
		 iAck = Write(byStartReg);
  	     if (iAck)
  	     {
 			for (i = 0; i < byLen; i++)
            {
 			    if(!Write(*ptr++))
 			    {
 	  		      Stop();
                  EX0 = 1;
   			      return FALSE;
   		        }
  	        }
	     }
    }
    Stop();
	EX0 = 1;
    return iAck;
}

/* ================================================================
    Name    : I2CWrite3Byte
    Purpose : Write I2C Device three bytes
    Passed  : Pass Device Addr, code-array, start reg address, length
    Notes   :
   ================================================================ */

Bool I2CWrite3Byte(Byte device, Byte subadr0, Byte c1, Byte c2, Byte c3 )
{
    Bool iAck;
    Start();
    iAck = Write(device | I2C_W);
    if(iAck)
    {
	   iAck = Write(subadr0);
	   if(iAck) iAck = Write(c1);
	   if(iAck) iAck = Write(c2);
	   if(iAck) iAck = Write(c3);
    }
    Stop();
    return iAck;
}

/* ----------------------------------------------------------
    Name    : I2CWrtHead -
    Purpose :
    Passed  : device : device slave address
    					subadr : register address
    Returns : return TRUE if success, otherwise return FALSE.
    Notes   :
   ----------------------------------------------------------*/

Bool I2CWrtHead(Byte device, Byte subadr)
{
  Bool iAck;

  Start();
  iAck = Write(device | I2C_W);
  if (iAck)
  	iAck = Write(subadr);
  return iAck;

}

/* ----------------------------------------------------------
    Name    : I2CReadWord -
    Purpose :
    Passed  : device : device slave address
    					subadr : register address
    Returns : return TRUE if success, otherwise return FALSE.
    Notes   :
   ----------------------------------------------------------*/
/*
Bool I2CReadWord( Byte device , Byte subaddress, Word  idata *c)
{
	if (I2CReadByte(device, subaddress,(Byte idata *)c+1) && I2CReadByte(device, subaddress+1,(Byte idata *)c))
		return 1;
	else
		return 0;
}
*/
/* ----------------------------------------------------------
    Name    : ReadWord
    Purpose : Only Used for VPC3230
    Passed  :
    Returns :
    Notes   :
   ----------------------------------------------------------*/

Word ReadWord(void)
{
	Byte byBitPos;
	Byte c,d;

	byBitPos = 0x80;
	c = 0;
	while(byBitPos)
	{
		ioI2cScl=BIT1;
		while(ioI2cScl == BIT0);
		_nop_();
		if(ioI2cSda) c |= byBitPos;
		ioI2cScl=BIT0;
		_nop_();
		byBitPos >>= 1;
	}
	ioI2cSda = BIT0;
	_nop_();
	ioI2cScl = BIT1;
	_nop_();
	ioI2cScl = BIT0;
	_nop_();
	ioI2cSda = BIT1;
	_nop_();

	d = 0;
	byBitPos = 0x80;
	while(byBitPos)
	{
		ioI2cScl=BIT1;
		while(ioI2cScl == BIT0);
		_nop_();
		if(ioI2cSda)
			d |= byBitPos;
		ioI2cScl=BIT0;
		_nop_();
		byBitPos >>= 1;
	}
	ioI2cSda=BIT1;
	_nop_();
	ioI2cScl=BIT1;
	_nop_();
	ioI2cScl=BIT0;
	_nop_();
	return c*0x0100 + d;
}

⌨️ 快捷键说明

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