//============================================
Bool i2c_SendByte( BYTE value )
{
BYTE i;
Bool result;
for( i = 0; i < 8; i++ ) // Send data via i2c pin
{
if( value & BIT7 )
{
SET_I2C_SDA();
SET_I2C_SDA_IN(); //external pull high
}
else
{
CLR_I2C_SDA();
SET_I2C_SDA_OUT();
}
DELAY4US();
SET_I2C_SCL();
DELAY4US(); //ygp //simon 070118 change for not use CSI 24C04
value <<= 1;
CLR_I2C_SCL();
DELAY4US(); //20100317
}
//SET_I2C_SDA();
//DELAY4US();
SET_I2C_SDA_IN(); // I2C BUS Add By Jonson 20100916
SET_I2C_SCL();
DELAY4US(); //ygp//simon 070118 change for not use CSI 24C04
result = IS_I2C_SDA_LO(); // see if ACK
//SET_I2C_BUS_OUT();// I2C BUS Add By Jonson 20100916
CLR_I2C_SCL();//<===here
SET_I2C_SCL_OUT();
DELAY4US();
CLR_I2C_SDA();//<===here
SET_I2C_SDA_OUT();
DELAY4US(); //20100317
return result;
}
想问下,最后的
CLR_I2C_SCL(); 和
CLR_I2C_SDA(); 怎么理解,mark掉又会出问题,为什么我们同样的项目使用不同的Scaler ic时
别的ic可以不加这两条语句。如下
BYTE CI2cSendByte(BYTE ucValue)
{
BYTE cnt;
for(cnt=0; cnt<8; cnt++)
{
if((bit)(ucValue & 0x80))
{
SETI2CSDA();
}
else
{
CLRI2CSDA();
}
SETI2CSCL();
Delay5us();
CLRI2CSCL();
Delay5us();
ucValue = ucValue << 1;
}
if(CI2cGetAck())
{
CI2cStop();
return _I2C_BUSY;
}
else
{
return _I2C_OK;
}
}
|