📄 i2c_control.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 + -