⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sys_iic.c

📁 其乐达(Cheertek)LCD驱动芯片(CT675)的C51源代码
💻 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 + -