I2C是一种串行总线,使用主从架构。
开始信号、7个地址位、1个读写位、1个应答位、8个数据位、1个应答位、结束信号
开始条件和停止条件
传输格式
Bool Panel_i2c_Start( void )
{
Set_Panel_I2C_SDA();
Set_Panel_I2C_SCL();
Panel_i2c_Delay();
if( Panel_I2C_SDALo() || Panel_I2C_SCLLo() )
return FALSE;
Clr_Panel_I2C_SDA();
Panel_i2c_Delay();
Clr_Panel_I2C_SCL();
Panel_i2c_Delay();
return TRUE;
}
Bool Panel_i2c_SendByte( BYTE value )
{
BYTE i;
Bool result;
for( i = 0; i < 8; i++ ) // Send data via i2c pin
{
if( value & BIT7 )
Set_Panel_I2C_SDA();
else
Clr_Panel_I2C_SDA();
Panel_i2c_Delay();
Set_Panel_I2C_SCL();
Panel_i2c_Delay();
value <<= 1;
Clr_Panel_I2C_SCL();
}
Set_Panel_I2C_SDA();
Panel_i2c_Delay();
result = Panel_Wait_i2C_Ack();
Set_Panel_I2C_SCL();
Panel_i2c_Delay();
Clr_Panel_I2C_SCL();
Panel_i2c_Delay();
Clr_Panel_I2C_SDA();
return result;
}
Bool Panel_Wait_i2C_Ack( void )
{
BYTE i;
for( i = 0; i < 5; i++ )
{
if( Panel_I2C_SDALo() )
return TRUE;
Panel_i2c_Delay();
}
if( Panel_I2C_SDALo() )
return TRUE;
else
return FALSE;
}
void Panel_i2c_Stop( void )
{
// SCL=L, SDA=L, Stop condition.
Clr_Panel_I2C_SCL();
Clr_Panel_I2C_SDA();
Panel_i2c_Delay();
Set_Panel_I2C_SCL();
Panel_i2c_Delay();
Set_Panel_I2C_SDA();
Panel_i2c_Delay();
}
Bool Panel_i2c_AccessStart(BYTE SlaveAdr, Panel_I2cIoTransType trans_t)
{
BYTE Dummy; // loop dummy
if (trans_t == PANEL_I2C_TRANS_READ) // check i2c read or write
SlaveAdr = PANEL_I2C_DEVICE_ADR_READ(SlaveAdr); // read
else
SlaveAdr = PANEL_I2C_DEVICE_ADR_WRITE(SlaveAdr); // write
Dummy = PANEL_I2C_ACCESS_DUMMY_TIME;
while (Dummy--)
{
if (Panel_i2c_Start() == FALSE)
{
Panel_i2c_Stop();
continue;
}
if (Panel_i2c_SendByte(SlaveAdr) == TRUE) // check acknowledge
return TRUE;
Panel_i2c_Stop();
ForceDelayNVRAM(1);
}
return FALSE;
}
void i2cBurstWriteBytes(BYTE SlaveAdr, BYTE *pBuf, BYTE bufLen)
{
BYTE Dummy; // loop dummy
Dummy = I2C_ACCESS_DUMMY_TIME;
whlie(Dummy--)
{
if(Panel_i2c_AccessStart(SlaveAdr, PANEL_I2C_TRANS_WRITE) == FALS)
continue;
whlie(buflen--)
{
Panel_i2c_SendByte(*pBuf); // send byte
pBuf++; // next byte pointer
}
break;
}
Panel_i2c_Stop();
}