网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 61IC中国电子在线 >> 技术文库 >> 嵌入式 >> 文章正文
  模拟I2C程序         ★★★ 【字体:
模拟I2C程序
作者:61IC录入    文章来源:本站原创    点击数:    更新时间:2006-4-7    

/**********************************************
  模拟I2C程序 winavr20050214
***********************************************/
# define F_CPU 4000000UL

#include <avr/io.h>
#include <avr/delay.h>

#define cbi(sfr, bit)         (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit)         (_SFR_BYTE(sfr) |= _BV(bit))
#define bit_is_set(sfr, bit)    (_SFR_BYTE(sfr) & _BV(bit))

//DDR    PORT    
//0    0    in,high
//0    1    in,r
//1    0    out=0
//1    1    out=1

#define sda    0
#define scl    1
#define I2C        DDRB
#define    I2C_read    PINB
#define    I2C_set        PORTB

#define Set_SDA        cbi(I2C,sda)
#define Cls_SDA        sbi(I2C,sda)
#define Set_SCL        cbi(I2C,scl)
#define Cls_SCL        sbi(I2C,scl)
#define SDA_High         bit_is_set(I2C_read,sda)

//function declaration
void I2C_Delay(void);
void I2C_Start(void);
void I2C_Stop(void);
unsigned char I2C_Write(unsigned char wb);
unsigned char I2C_Read(unsigned char bEnd);

//*****************************************************
//delay 100us
//*****************************************************
void I2C_Delay(void)
{
    _delay_us(100);
}

//*****************************************************
//i2c init
//*****************************************************
void I2C_init(void)
{

//DDR    PORT    
//0    0    in,high
//0    1    in,r
//1    0    out=0
//1    1    out=1

    cbi(I2C_set,sda);        //sda=1
    cbi(I2C,sda);            //sda in
    cbi(I2C_set,scl);        //scl=1;
    cbi(I2C,scl);            //scl in
}

//*****************************************************
//i2c start
//*****************************************************
void I2C_Start(void)
{
     Cls_SCL;
     I2C_Delay();
     Set_SDA;
     I2C_Delay();

     Set_SCL;
     I2C_Delay();
     Cls_SDA;
     I2C_Delay();

     Cls_SCL;
     I2C_Delay();         
}

//*****************************************************
//i2c stop
//*****************************************************
void I2C_Stop(void)
{
     Cls_SDA;
     I2C_Delay();
     
     Set_SCL;
     I2C_Delay();
     Set_SDA;
     I2C_Delay();

     Set_SCL;
     I2C_Delay();
}

//*****************************************************
//I2C_Write
//*****************************************************
unsigned char I2C_Write(unsigned char wb)
{
    unsigned char i,ack=0;
    
    for(i=0;i<8;i++)
    {
         if( wb&0x80 ) Set_SDA;
         else          Cls_SDA;
         wb=wb<<1;
         I2C_Delay();
         
         Set_SCL;
         I2C_Delay();
         Cls_SCL;
         if(i!=7)    I2C_Delay();
    }
    
    Set_SDA;        //release sda line
    I2C_Delay();
    Set_SCL;
    I2C_Delay();
    
    if( SDA_High )    ack=1;    //ack error

    Cls_SCL;
    I2C_Delay();
    
    return ack;
}

//*****************************************************
//I2C_Read
//*****************************************************
unsigned char I2C_Read(unsigned char bEnd)
{
    unsigned char i,mb;
    
    Set_SDA;    //release sda line
    mb=0;
    for(i=0;i<8;i++)
    {
        mb=mb<<1;
        
        I2C_Delay();
        Set_SCL;
        I2C_Delay();
        if( SDA_High ) mb++;
        I2C_Delay();
        Cls_SCL;
        if(i!=7)        I2C_Delay();
    }
    if( bEnd )      Set_SDA;        //end read
    else            Cls_SDA;        //ack
    I2C_Delay();
    
    Set_SCL;
    I2C_Delay();
    Cls_SCL;
    I2C_Delay();
    Set_SDA;
    
    return mb;

}


               欢迎点击进入:TI德州中文网   (国内唯一针对TI应用的中文技术网站)    文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    没有相关文章
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61IC 湘ICP备05002478号