📄 i2c.c
字号:
I2C_GetACK();
/* --------------------------------
Last Read
-------------------------------- */
bDATA = I2C_RxData();
I2C_SetNAK();
I2C_Stop();
return( bDATA );
} /* I2C_RxByte */
#endif
/* -------------------------------------------------------------------
Name: I2C_RxData -
Purpose:
To do I2C parallel serial conversion for reception.
Passed: None.
Returns:
Notes:
------------------------------------------------------------------- */
UB8 I2C_RxData (void)
{
UB8 bResult;
UB8 bMask;
bResult = 0x00; /* Clear value */
I2C_SET_DAT(HIGH);
/* MSB is read first */
for (bMask = 0x80; bMask; bMask >>= 1)
{
I2C_SET_CLK(HIGH);
I2C_HIGH;
if ( I2C_GET_DAT_HIGH )
bResult |= bMask;
I2C_SET_CLK(LOW);
} /* for */
return( bResult );
} /* I2C_RxData */
#if (I2C_RX_WORD)
/* -------------------------------------------------------------------
Name: I2C_RxWord -
Purpose: To receive one WORD data from I2C slave device.
Passed:
Returns: one WORD data.
Notes:
1) Only for little-endian storage format devices !!!
2) Keil C51 uses *big-endian* storage format. [1]144
------------------------------------------------------------------- */
UW16 I2C_RxWord (
UB8 bSLA, /* I2C slave address */
UB8 bREG /* I2C sub-address */
)
{
UW16 wDATA;
I2C_Start();
/* --------------------------------
Write
-------------------------------- */
I2C_TxData(bSLA);
I2C_GetACK();
I2C_TxData(bREG);
I2C_GetACK();
/* --------------------------------
Read
-------------------------------- */
I2C_Start();
I2C_TxData(bSLA | 0x01);
I2C_GetACK();
/* --------------------------------
Last Read
-------------------------------- */
wDATA = I2C_RxData();
I2C_SetACK();
wDATA = (I2C_RxData() << 8) + wDATA;
I2C_SetNAK();
I2C_Stop();
return( wDATA );
} /* I2C_RxWord */
#endif
/* -------------------------------------------------------------------
Name: I2C_SetACK -
Purpose: .
Passed: None.
Returns: None.
Notes:
------------------------------------------------------------------- */
void I2C_SetACK (void)
{
I2C_SET_DAT(LOW);
I2C_SU_DAT; // Added by JC 01:53PM 2005/11/23
I2C_SET_CLK(HIGH);
I2C_HIGH;
I2C_SET_CLK(LOW);
I2C_LOW;
} /* I2C_SetACK */
/* -------------------------------------------------------------------
Name: I2C_SetNAK -
Purpose: .
Passed: None.
Returns: None.
Notes:
------------------------------------------------------------------- */
void I2C_SetNAK (void)
{
I2C_SET_DAT(HIGH);
I2C_SU_DAT; // Added by JC 01:53PM 2005/11/23
I2C_SET_CLK(HIGH);
I2C_HIGH;
I2C_SET_CLK(LOW);
I2C_LOW;
} /* I2C_SetNAK */
/* -------------------------------------------------------------------
Name: I2C_Start - START condition (SDA falling edge).
Purpose: .
Passed: None.
Returns: None.
Notes:
Reference:
[1] p64
------------------------------------------------------------------- */
void I2C_Start (void)
{
I2C_SET_DAT(HIGH);
I2C_SET_CLK(HIGH);
I2C_SU_STA;
I2C_SET_DAT(LOW);
I2C_HD_STA;
I2C_SET_CLK(LOW);
I2C_LOW;
} /* I2C_Start */
/* -------------------------------------------------------------------
Name: I2C_Stop - STOP condition (SDA rising edge).
Purpose: .
Passed: None.
Returns: None.
Notes:
Reference:
[1] p64
------------------------------------------------------------------- */
void I2C_Stop (void)
{
I2C_SET_DAT(LOW);
I2C_SET_CLK(HIGH);
I2C_SU_STO;
I2C_SET_DAT(HIGH);
} /* I2C_Stop */
#if (I2C_TX_BURST)
/* -------------------------------------------------------------------
Name: I2C_TxBurst -
Purpose: To transmit bulk data to I2C slave device.
Passed:
bCNT: 1..255. (Excludes slave address and sub-address)
Returns: None.
Notes:
The bSLA should be the slave device's 'WRITE' module addres,
not 'READ' one.
------------------------------------------------------------------- */
void I2C_TxBurst (
UB8 bSLA, /* I2C slave address */
UB8 bREG, /* I2C sub-address */
UB8 bCNT, /* The number of data which will be transmitted */
UB8 *pbDATA /* Point to the first DATA item */
)
{
UB8 bIdx;
I2C_Start();
I2C_TxData(bSLA);
I2C_GetACK();
I2C_TxData(bREG);
I2C_GetACK();
for (bIdx = 0; bIdx < bCNT; bIdx++)
{
I2C_TxData(*pbDATA++);
I2C_GetACK();
} /* for */
I2C_Stop();
} /* I2C_TxBurst */
#endif
#if (I2C_TX_BYTE)
/* -------------------------------------------------------------------
Name: I2C_TxByte -
Purpose: To transmit one byte data to I2C slave device.
Passed:
Returns: None.
Notes:
The bSLA should be the slave device's 'WRITE' module addres,
not 'READ' one.
------------------------------------------------------------------- */
void I2C_TxByte (
UB8 bSLA, /* I2C slave address */
UB8 bREG, /* I2C sub-address */
UB8 bDATA /* DATA item */
)
{
I2C_Start();
I2C_TxData(bSLA);
I2C_GetACK();
I2C_TxData(bREG);
I2C_GetACK();
I2C_TxData(bDATA);
I2C_GetACK();
I2C_Stop();
} /* I2C_TxByte */
#endif
/* -------------------------------------------------------------------
Name: I2C_TxData -
Purpose: To do I2C parallel serial conversion for transmission.
Passed:
Returns: None.
Notes:
------------------------------------------------------------------- */
void I2C_TxData (UB8 bData)
{
UB8 bMask;
/* MSB is sent first */
for (bMask = 0x80; bMask; bMask >>= 1)
{
I2C_SET_DAT(bData & bMask);
I2C_SU_DAT;
I2C_SET_CLK(HIGH);
I2C_HIGH;
I2C_SET_CLK(LOW);
}
I2C_SET_DAT(HIGH); // Added by JC 01:47PM 2005/11/23
} /* I2C_TxData */
#if (I2C_TX_WORD)
/* -------------------------------------------------------------------
Name: I2C_TxWord -
Purpose: To transmit bulk data to I2C slave device.
Passed:
Returns: None.
Notes:
------------------------------------------------------------------- */
void I2C_TxWord (
UB8 bSLA, /* I2C slave address */
UB8 bREG, /* I2C sub-address */
UW16 wDATA /* DATA item */
)
{
I2C_Start();
I2C_TxData(bSLA);
I2C_GetACK();
I2C_TxData(bREG);
I2C_GetACK();
I2C_TxData(wDATA & 0xFF);
I2C_GetACK();
I2C_TxData(wDATA >> 8);
I2C_GetACK();
I2C_Stop();
} /* I2C_TxWord */
#endif
/* -------------------------------------------------------------------
Name: -
Purpose: .
Passed: None.
Returns: None.
Notes:
------------------------------------------------------------------- */
/* **********************************************************************
Description:
********************************************************************** */
/* %% End Of File %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -