📄 i2cmiddle.c
字号:
#include "std.h"
#include "IOCtrl.h"
#include "i2c.h"
#define ACK 0
#include "IOCtrl.h"
Void I2CDelay1(Void)
{
// BYTE uc = 0x01;
// while(uc --);
}
/**
* Send SCL via I2C bus.
*
* @param (Byte) ucState's value is 0 or 1.
*
* @return None.
*
* @see tdI2CSCL
*/
Void tdI2CSCL1(Byte state)
{
I2CDelay1();
HI2C_SDA_INMODE; //added by ivan
if(state)
{
HI2C_SCL_SET;
}
else
{
HI2C_SCL_CLR;
}
HI2C_SDA_OUTMODE; //added by ivan
}
/**
* Send SDA via I2C bus.
*
* @param (Byte) bState's value is 0 or 1.
*
* @return None.
*
* @see tdI2CSDA
*/
Void tdI2CSDA1(Byte state)
{
I2CDelay1();
HI2C_SCL_INMODE;
if(state)
{
HI2C_SDA_SET;
}
else
{
HI2C_SDA_CLR;
}
HI2C_SCL_OUTMODE;
}
/**
* Read SDA via I2C bus.
*
* @param None.
*
* @return (byte).
*
* @see tdI2CReadSDA
*/
Byte tdI2CReadSDA1(Void)
{
Bool bReceive;
HI2C_SDA_INMODE;
I2CDelay1();
if(HI2C_SDA_ISTRUE)
bReceive = _TRUE_;
else
bReceive = _FALSE_;
HI2C_SDA_OUTMODE;
return bReceive;
}
Byte tdI2CReadSCL1(Void)
{
Bool bReceive;
HI2C_SCL_INMODE;
I2CDelay1();
if(HI2C_SCL_ISTRUE)
bReceive = _TRUE_;
else
bReceive = _FALSE_;
HI2C_SCL_OUTMODE;
return bReceive;
}
Void tdI2COpen1(Void)
{
HI2C_SDA_SET;
HI2C_SCL_SET;
HI2C_ALL_OUTMODE;
}
Void tdI2CClose1(Void)
{
HI2C_ALL_INMODE;
}
Void tdI2CEnableSDAIn1(Void)
{
HI2C_SDA_INMODE;
}
Void wait_6u(Void)
{
Byte i;
for (i = 0; i<20; i++) asm("nop");
}
Void tdI2CEnableSDAWrite(Void)
{
HI2C_SDA_OUTMODE;
}
Void tdI2CEnableSDARead(Void )
{
HI2C_SDA_INMODE;
}
/**
* Sends 8 bits to the device via I2C bus.
*
* @param ucByte - The 8 bits to the device.
*
* @return _TRUE_ - Succeeded.
* _FALSE_ - Failed.
*
* @see tdI2CReceiveByte
*/
Bool tdI2CSendByte(Byte ucByte)
{
Byte ucData;
Byte ucResult;
for(ucData = 0; ucData < 8; ucData++)
{
if(ucByte & 0x80)
{
tdI2CSDA1(1);
}
else
{
tdI2CSDA1(0);
}
tdI2CSCL1(1);
wait_6u();
tdI2CSCL1(0);
wait_6u();
ucByte <<= 1;
}
tdI2CEnableSDARead();
wait_6u();
tdI2CSCL1(1);
wait_6u();
ucData = tdI2CReadSDA1();
tdI2CSCL1(0);
tdI2CEnableSDAWrite();
return ucData == ACK;
}
/**
* Receives 8 bits from the device via I2C bus.
*
* @param None.
*
* @return (Byte) The 8 bits from the device.
*
* @see tdI2CSendByte
*/
Byte tdI2CReceiveByte(Void)
{
Byte ucB2,ucData;
ucData = 0;
tdI2CEnableSDARead();
for(ucB2 = 0; ucB2 < 8; ucB2++)
{
tdI2CSCL1(1);
wait_6u();
ucData <<= 1;
if(tdI2CReadSDA1())
ucData |= 1;
tdI2CSCL1(0);
}
tdI2CEnableSDAWrite();
return ucData;
}
/**
* Sends Start signal to the device via I2C bus.
*
* @param None.
*
* @return None.
*
* @see tdStop
* @see tdACK
* @see tdNOACK
*/
Void tdStart(Void)
{
tdI2CSDA1(1);
wait_6u();
tdI2CSCL1(1);
wait_6u();
tdI2CSDA1(0);
wait_6u();
tdI2CSCL1(0);
wait_6u();
}
/**
* Sends Stop signal to the device via I2C bus.
*
* @param None.
*
* @return None.
*
* @see tdStart
* @see tdACK
* @see tdNOACK
*/
Void tdStop(Void)
{
tdI2CSDA1(0);
tdI2CSCL1(1);
wait_6u();
tdI2CSDA1(1);
wait_6u();
}
/**
* Sends ACK signal to the device via I2C bus.
*
* @param None.
*
* @return None.
*
* @see tdStart
* @see tdStop
* @see tdNOACK
*/
Void tdACK(Void)
{
tdI2CSDA1(0);
wait_6u();
tdI2CSCL1(1);
wait_6u();
tdI2CSCL1(0);
wait_6u();
}
/**
* Sends NOACK signal to the device via I2C bus.
*
* @param None.
*
* @return None.
*
* @see tdStart
* @see tdStop
* @see tdACK
*/
Void tdNOACK(Void)
{
tdI2CSDA1(1);
wait_6u();
tdI2CSCL1(1);
wait_6u();
tdI2CSCL1(0);
wait_6u();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -