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

📄 i2c.c

📁 i2c总线是单片机内部的一种通讯总线
💻 C
字号:
//****************************************************************************
//文件名:I2C.c
//描述:  实现I2C总线的基本操作(通用,只依赖于I2C规范)
//****************************************************************************

#include "I2C.h"
#include  <msp430x14x.h>         /*for msp430*/

unsigned char  ack;              /*acknowledge signer*/        
void _Nop()
{
/*
    unsigned char q0;
    for(q0=0;q0<1;q0++);
*/
    _NOP(); _NOP(); _NOP(); _NOP();
}         
//****************************************************************************
//启动I2C总线
//参数:无
//返回值: 无
//****************************************************************************
void Start_I2C()
{
      I2CSEL &= ~(SDA+SCL);
      SDAOUT; /*Configuration port direction,maybe not need*/
      SCLOUT; /*Configuration port direction,maybe not need*/
      SSDA ;                                                    
      _Nop();
      SSCL ;
      _Nop();_Nop();_Nop();_Nop();_Nop();
      CSDA ;
      _Nop();_Nop();_Nop();_Nop();_Nop();
      CSCL ;
      _Nop();_Nop();
}
//****************************************************************************
//释放I2C总线
//参数:无
//返回值: 无
//****************************************************************************
void Stop_I2C()
{
      SDAOUT;  /*Configuration port direction,maybe not need*/
      CSDA ;
      _Nop();_Nop();
      SSCL ;
      _Nop();_Nop();_Nop();_Nop();_Nop();
      SSDA ;
      _Nop();_Nop();_Nop();_Nop();_Nop(); 
}
//****************************************************************************
//向总线写入一个字节
//参数:c:写入数据
//返回值: 0:fail 1:success
//****************************************************************************
unsigned char SendByte(unsigned char c)   
{
      unsigned char BitCnt;
      
      SDAOUT;/*Configuration port direction,maybe not need*/
      for(BitCnt = 0 ; BitCnt < 8 ;  BitCnt++)
        {
              if((c<<BitCnt)&0x80)
                SSDA ;
              else
                CSDA ;
              _Nop();_Nop();
              SSCL ;
              _Nop();_Nop();_Nop();_Nop();
              CSCL ;
              _Nop();_Nop();
         } 
      _Nop();_Nop();
      
      SSCL ;
      _Nop();_Nop();
      /*TEST ACK*/
      {   
          SDAIN;            /*Configuration port direction,maybe not need*/
          if(TESTACK())
            ack = 0;
          else
            ack = 1;
      }  
       _Nop();_Nop();
      CSCL;
      _Nop();_Nop();
      return(ack);
}
//****************************************************************************
//从总线读取一个字节
//参数:无
//返回值: 读取数据
//****************************************************************************
unsigned char RecByte()
{
      unsigned char retc;
      unsigned char BitCnt;
      retc = 0;
      
      SDAIN;    /*Configuration port direction,maybe not need*/
      for(BitCnt = 0; BitCnt < 8; BitCnt++)
      {
            _Nop();_Nop();
            SSCL  ;
            _Nop();_Nop();
            retc = retc<<1;
            if(READSDA())
              retc ++;
            _Nop();_Nop();
            CSCL  ;
            _Nop();_Nop();
      }
      return (retc);
}
//****************************************************************************
//应答函数
//参数:a:应答类型  0:ack 1:not ack
//返回值: 无
//****************************************************************************
void Ack_I2C(unsigned char a)
{
      SDAOUT;    /*Configuration port direction,maybe not need*/
      if(a == 0)
        CSDA ;
      else
        SSDA ;
      _Nop();_Nop();
      SSCL ;
      _Nop();_Nop();_Nop();_Nop();
      CSCL ;     
      _Nop();_Nop();
      SSDA ;                     
}




⌨️ 快捷键说明

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