AVR 模拟I2C


//IIC.c
#include "jpheat.h"
#include "delay.h"
//4M晶振, pDelayNus(3)为6us
#define I2C_Delay()        pDelayNus(15)

#define I2C_SCL                  PA3           
#define I2C_SDA                PA2        
#define I2C_DDR             DDRA
#define I2C_POTR            PORTA
#define I2C_SCL_Reset()     I2C_POTR&=~BIT(I2C_SCL)
#define I2C_SCL_Set()         I2C_POTR|=BIT(I2C_SCL)
#define I2C_SDA_Reset()     I2C_POTR&=~BIT(I2C_SDA)
#define I2C_SDA_Set()         I2C_POTR|=BIT(I2C_SDA)
#define TRUE                1
#define FALSE               0
#define DELAY_nT    2        

    //***********************************************************************
 // 函数名称:I2C_Start()
 // 功    能:启动I2C总线
 // 入口参数:无
 // 出口参数:无//***********************************************************************
 void I2C_init(void)
 { 
 I2C_SDA_Set();
 I2C_SCL_Set();  
 I2C_DDR|=BIT(I2C_SDA)|BIT(I2C_SCL); 
 pDelayNms(1);
 }
 void I2C_Start(void)
 {
 I2C_SDA_Set();
 I2C_SCL_Set();
 I2C_Delay();        // 大于4.7us
 I2C_SDA_Reset();
 I2C_Delay();        // 大于4us
 }
 //***********************************************************************
 // 函数名称:I2C_Stop()
 // 功    能:终止I2C总线
 // 入口参数:无
 // 出口参数:无
 //***********************************************************************
 void I2C_Stop(void)
 {
 I2C_SDA_Reset();
 I2C_Delay();
 I2C_SCL_Set();
 I2C_Delay();
 I2C_SDA_Set();
 I2C_Delay();
 }
 //***********************************************************************
 // 函数名称:I2C_Send_Bit_0()
 // 功    能:发送比特0
 // 入口参数:无
 // 出口参数:无
 //***********************************************************************
 void I2C_Send_Bit_0(void)
 {
 I2C_SCL_Reset();
 I2C_Delay();
 I2C_SDA_Reset();
 I2C_Delay();
 I2C_SCL_Set();
 I2C_Delay();        // 大于4us
 I2C_SCL_Reset();
 I2C_Delay();
 }
 
 //***********************************************************************
 // 函数名称:I2C_Send_Bit_1()
 // 功    能:发送比特1
 // 入口参数:无
 // 出口参数:无
 //***********************************************************************
 void I2C_Send_Bit_1(void)
 {
  I2C_SCL_Reset();
  I2C_Delay();
  I2C_SDA_Set();
  I2C_Delay();
  I2C_SCL_Set();
  I2C_Delay();        // 
  I2C_SCL_Reset();
  I2C_Delay();        //
 }
 //***********************************************************************
 // 函数名称:I2C_Check_Ack()
 // 功    能:发送完一个字节后检验设备的应答信号
 // 入口参数:无
 // 出口参数:返回值为True,成功
 //           返回值为False,失败
 //***********************************************************************
 unsigned char I2C_Check_Ack(void)
 {
 unsigned char temp;
 I2C_SCL_Reset();
 I2C_Delay();
 I2C_DDR&=~BIT(2);
 I2C_Delay();
 I2C_SCL_Set();
 I2C_Delay();
 if (PINA&BIT(2)) 
 {temp = FALSE;}
 else 
 {temp = TRUE;}
 I2C_SCL_Reset(); 
 I2C_Delay();
 I2C_DDR|=BIT(2);
 I2C_Delay();
 return temp;
 }
 //***********************************************************************
 // 函数名称:I2C_WriteByte()
 // 功    能:向I2C总线写入8bit数据
 // 入口参数:I2C_data     将要写入I2C总线的8bit数据
 // 出口参数:无
 //***********************************************************************
 void I2C_WriteByte(unsigned char I2C_data)
 {  
  unsigned char i; 
  unsigned char  state;
    for(i=0;i<8;i++) 
    {  
       I2C_SCL_Reset();   
       I2C_Delay();      
       if(I2C_data&0x80)
           {     
           I2C_SDA_Set();
            }   
       else       
             {     
           I2C_SDA_Reset();
           } 
      I2C_data<<=1;   
      I2C_SCL_Set();  
      I2C_Delay();    
    } 
    state=I2C_Check_Ack();//等待应答
 }
 //***********************************************************************
 // 函数名称:I2C_ReadByte()
 // 功    能:从I2C总线接收1个字节
 // 入口参数:无
 // 出口参数:返回值为从I2C总线上接收到的8bit数据
 //***********************************************************************
 unsigned char I2C_ReadByte(void)
 {
 unsigned char i, I2C_data = 0;
 I2C_SDA_Set();
 I2C_DDR&=~BIT(2);
 for (i=0;i<8;i++) 
 {   
 I2C_Delay();
 I2C_SCL_Set();  
 I2C_Delay();
 I2C_data <<= 1;    
 if (PINA&BIT(2))   
 { 
 I2C_data|= 0x01; 
 }  
 I2C_SCL_Reset();           
 }     
 I2C_DDR|=BIT(2);  
 return I2C_data;
 }

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值