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

📄 i2cmiddle.c

📁 在AVR 平台下的控制代码,通过CAN控制
💻 C
字号:
#include "std.h"
#include "IOCtrl.h"
#include "i2c.h"

#define ACK 0
 

#include "IOCtrl.h"
Void I2CDelay1(Void)
{
//	BYTE uc = 0x01;
//	while(uc --);
}
/**
 * Send SCL via I2C bus.
 *
 * @param (Byte) ucState's value is 0 or 1.
 *
 * @return None.
 *
 * @see tdI2CSCL
 */
Void tdI2CSCL1(Byte state)
{
    I2CDelay1();
	HI2C_SDA_INMODE;	//added by ivan
    if(state)
    {
        HI2C_SCL_SET;
    }
    else
    {
        HI2C_SCL_CLR;
    }
	HI2C_SDA_OUTMODE; //added by ivan
}
/**
 * Send SDA via I2C bus.
 *
 * @param (Byte) bState's value is 0 or 1.
 *
 * @return None.
 *
 * @see tdI2CSDA
 */
Void tdI2CSDA1(Byte state) 
{
    I2CDelay1();
	HI2C_SCL_INMODE;
    if(state)
    {
        HI2C_SDA_SET;
    }
    else
    {
        HI2C_SDA_CLR;
    }
	HI2C_SCL_OUTMODE;
}
/**
 * Read SDA via I2C bus.
 *
 * @param None.
 *
 * @return (byte).
 *
 * @see tdI2CReadSDA
 */
Byte tdI2CReadSDA1(Void)
{
    Bool bReceive;
    HI2C_SDA_INMODE; 
    I2CDelay1();  
    if(HI2C_SDA_ISTRUE)
        bReceive = _TRUE_;
    else
        bReceive = _FALSE_; 
    HI2C_SDA_OUTMODE;        
    return bReceive; 
}

Byte tdI2CReadSCL1(Void)
{
    Bool bReceive;
    HI2C_SCL_INMODE; 
    I2CDelay1();  
    if(HI2C_SCL_ISTRUE)
        bReceive = _TRUE_;
    else
        bReceive = _FALSE_; 
    HI2C_SCL_OUTMODE; 
    return bReceive; 
}

Void tdI2COpen1(Void)
{
    HI2C_SDA_SET;
    HI2C_SCL_SET;
    HI2C_ALL_OUTMODE;
}                                                                 


Void tdI2CClose1(Void)
{
    HI2C_ALL_INMODE;
}                    

Void tdI2CEnableSDAIn1(Void)
{
    HI2C_SDA_INMODE; 
}



Void wait_6u(Void)
{
	Byte i;          
	for (i = 0; i<20; i++) asm("nop");
}


Void tdI2CEnableSDAWrite(Void)
{
    HI2C_SDA_OUTMODE;
}


Void tdI2CEnableSDARead(Void )
{
    HI2C_SDA_INMODE;
}

/**
 * Sends 8 bits to the device via I2C bus.
 *
 * @param ucByte - The 8 bits to the device.
 *
 * @return _TRUE_ - Succeeded.
 *         _FALSE_ - Failed.
 *
 * @see tdI2CReceiveByte
 */
Bool tdI2CSendByte(Byte ucByte)
{
    Byte ucData;
    Byte ucResult;
    for(ucData = 0; ucData < 8; ucData++)
    {
        if(ucByte & 0x80)
        {
            tdI2CSDA1(1);
        }
        else
        {
            tdI2CSDA1(0);
        }
        tdI2CSCL1(1);
        wait_6u();
        tdI2CSCL1(0);
        wait_6u();
        ucByte <<= 1;
    }
    tdI2CEnableSDARead();
    wait_6u();
    tdI2CSCL1(1);
    wait_6u();
    ucData = tdI2CReadSDA1();
    tdI2CSCL1(0);
    tdI2CEnableSDAWrite();
    return ucData == ACK;
}

/**
 * Receives 8 bits from the device via I2C bus.
 *
 * @param None.
 *
 * @return (Byte) The 8 bits from the device.
 *
 * @see tdI2CSendByte
 */
Byte tdI2CReceiveByte(Void)
{
    Byte ucB2,ucData;
    ucData = 0;
    tdI2CEnableSDARead();
    for(ucB2 = 0; ucB2 < 8; ucB2++)
    {
        tdI2CSCL1(1);
        wait_6u();
        ucData <<= 1;
        if(tdI2CReadSDA1())
            ucData |= 1;
        tdI2CSCL1(0);
    }
    tdI2CEnableSDAWrite();
    return ucData;
}

/**
 * Sends Start signal to the device via I2C bus.
 *
 * @param None.
 *
 * @return None.
 *
 * @see tdStop
 * @see tdACK
 * @see tdNOACK
 */

Void tdStart(Void)
{
    tdI2CSDA1(1); 
    wait_6u();
    tdI2CSCL1(1);
    wait_6u();
    tdI2CSDA1(0);
    wait_6u();
    tdI2CSCL1(0);
    wait_6u();
}

/**
 * Sends Stop signal to the device via I2C bus.
 *
 * @param None.
 *
 * @return None.
 *
 * @see tdStart
 * @see tdACK
 * @see tdNOACK
 */
Void tdStop(Void)
{
    tdI2CSDA1(0);
    tdI2CSCL1(1);
    wait_6u();
    tdI2CSDA1(1);
    wait_6u();
}

/**
 * Sends ACK signal to the device via I2C bus.
 *
 * @param None.
 *
 * @return None.
 *
 * @see tdStart
 * @see tdStop
 * @see tdNOACK
 */
Void tdACK(Void)
{
    tdI2CSDA1(0);  
    wait_6u();
    tdI2CSCL1(1);
    wait_6u();
    tdI2CSCL1(0);
    wait_6u();
}

/**
 * Sends NOACK signal to the device via I2C bus.
 *
 * @param None.
 *
 * @return None.
 *
 * @see tdStart
 * @see tdStop
 * @see tdACK
 */
Void tdNOACK(Void)
{
    tdI2CSDA1(1);
    wait_6u();
    tdI2CSCL1(1);
    wait_6u();
    tdI2CSCL1(0);
    wait_6u();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -