📄 sys_iic.c
字号:
#include "INC\SYS_DECLARE.H"
#include "INC\SYS_GLOBAL.H"
#define I2C_SCL_H() IIC_SCL_PIN = 1;
#define I2C_SCL_L() IIC_SCL_PIN = 0;
#define I2C_SDA_H() IIC_SDA_PIN = 1;
#define I2C_SDA_L() IIC_SDA_PIN = 0;
#define I2C_SDA_IN() IIC_SDA_PIN = 1;
#define I2C_SCL_IN() IIC_SCL_PIN = 1;
#define I2C_SDA_GET() IIC_SDA_PIN
#define K_LOOP_MAX 200
//--------------------------------------------------------------------------
#define _delay_i2c()
#if 0
void _delay_i2c(void)
{
_nop_(); _nop_(); _nop_();
}
#endif
//--------------------------------------------------------------------------
//
// _StartSig()
// SCL: --
// SDA: -\_
//
void _StartSig(void)
{
I2C_SCL_H();
I2C_SDA_H();
// _delay_i2c();
I2C_SDA_L();
// _delay_i2c();
}
//--------------------------------------------------------------------------
//
// _StopSig()
// SCL: _/-
// SDA: __/
//
void _StopSig(void)
{
I2C_SDA_L();
I2C_SCL_L();
// _delay_i2c();
I2C_SCL_H();
// _delay_i2c();
I2C_SDA_H();
}
//--------------------------------------------------------------------------
//
// _ByteWrite(bData)
// SCL: _/-\_/-\_/-\_/-\_/-\_/-\_/-\_/-\_/-\_
// SDA: _<D7><D6><D5><D4><D3><D2><D1><D0>ACK__
//
BOOL _ByteWrite(BYTE bData)
{
BYTE i;
I2C_SCL_L();
// _delay_i2c();
for(i = 8; i > 0; i--)
{
if(bData & 0x80) {I2C_SDA_H();}
else {I2C_SDA_L();}
// _delay_i2c();
I2C_SCL_H();
_delay_i2c();
bData <<= 1;
I2C_SCL_L();
// _delay_i2c();
}
// Get ACK
I2C_SDA_IN(); // SDA -- high
_delay_i2c();
I2C_SCL_H(); // SCL -> high
_delay_i2c();
i = I2C_SDA_GET(); // 0 for no error
I2C_SCL_L(); // SCL -> low
// _delay_i2c();
return( (i) ? 1 : 0 );
}
//--------------------------------------------------------------------------
//
// _ByteRead(BOOL fNAK)
// SCL: _/-\_/-\_/-\_/-\_/-\_/-\_/-\_/-\_/-\_
// SDA: _<D7><D6><D5><D4><D3><D2><D1><D0>ACK____
//
BYTE _ByteRead(BOOL fNAK)
{
BYTE i, bData = 0;
I2C_SCL_L();
I2C_SDA_IN(); // SDA -- high
_delay_i2c();
for(i = 8; i > 0; i--)
{
I2C_SCL_IN(); // SCL -> high
_delay_i2c();
bData = (bData << 1) | (I2C_SDA_GET() ? 1 : 0);
I2C_SCL_L(); // SCL -> low
_delay_i2c();
}
// Set ACK !!
if(fNAK) { I2C_SDA_H(); }
else { I2C_SDA_L(); }
_delay_i2c();
I2C_SCL_H(); // SCL -> high
_delay_i2c();
I2C_SCL_L(); // SCL -> low
_delay_i2c();
I2C_SDA_H();
return bData;
}
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
// W
// +----------+----------+-------+
// | bDevAddr | bSubAddr | bData |
// +----------+----------+-------+
// ^ ^ ^ ^
// start ack(S) ack(S) stop
//--------------------------------------------------------------------------
void SYS_IIC_WriteByte(BYTE bDevAddr, BYTE bSubAddr, BYTE bData)
{
BYTE i;
for(i = 0; i < K_LOOP_MAX; i++)
{
_StartSig();
if(_ByteWrite(bDevAddr))
continue;
if(_ByteWrite(bSubAddr))
continue;
if(_ByteWrite(bData))
continue;
_StopSig();
break;
}
#if(UART_DEBUG_MSG)
if(i == K_LOOP_MAX) printf("*** I2C Write error ***\n");
#endif // UART_DEBUG_MSG
}
//--------------------------------------------------------------------------
BYTE SYS_IIC_ReadByte(BYTE bDevAddr, BYTE bSubAddr)
{
BYTE bData = 0;
BYTE i;
for(i = 0; i < K_LOOP_MAX; i++)
{
_StartSig();
if(_ByteWrite(bDevAddr))
continue;
if(_ByteWrite(bSubAddr))
continue;
_StartSig();
if(_ByteWrite(bDevAddr|1))
continue;
bData = _ByteRead(1); // NAK
_StopSig();
break;
}
#if(UART_DEBUG_MSG)
if(i == K_LOOP_MAX) printf("*** I2C Read error ***\n");
#endif // UART_DEBUG_MSG
return bData;
}
//--------------------------------------------------------------------------
// W R
// +--------+-----------+--------+--------+--------+-----+--------+
// | IIC_ID | byte addr | IIC_ID | data 0 | data 1 | ... | data n |
// +--------+-----------+--------+--------+--------+-----+--------+
// ^ ^ ^ ^ ^ ^ ^ ^
// start ack(S) start ack(S) ack(M) ack(M) ack(M) stop
//--------------------------------------------------------------------------
void SYS_IIC_ReadBurst(BYTE bDevAddr, BYTE bSubAddr, BYTE bLength)
{
BYTE bData = 0;
BYTE i, it;
for(i = 0; i < K_LOOP_MAX; i++)
{
_StartSig();
if(_ByteWrite(bDevAddr))
continue;
if(_ByteWrite(bSubAddr))
continue;
_StartSig();
if(_ByteWrite(bDevAddr|1))
continue;
for(it = 0; it < bLength; it++)
{
bData = _ByteRead(0); // ACK
gbTrmBuf[it] = bData;
}
_StopSig();
break;
}
#if(UART_DEBUG_MSG)
if(i == K_LOOP_MAX) printf("*** I2C Read error ***\n");
#endif // UART_DEBUG_MSG
}
//--------------------------------------------------------------------------
// W
// +--------+--------------+--------+--------+--------+-----+--------+
// | IIC_ID | byte address | data 0 | data 1 | data 2 | ... | data n |
// +--------+--------------+--------+--------+--------+-----+--------+
// ^ ^ ^ ^ ^ ^ ^ ^
// start ack(S) ack(S) ack(S) ack(S) ack(S) ack(S) stop
//--------------------------------------------------------------------------
void SYS_IIC_WriteBurst(BYTE bDevAddr, BYTE bSubAddr, BYTE bLength)
{
BYTE i;
_StartSig();
_ByteWrite(bDevAddr);
_ByteWrite(bSubAddr);
for(i = 0; i < bLength; i++)
{
_ByteWrite(gbTrmBuf[i]);
}
_StopSig();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -