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

📄 i2c.c

📁 单片机的I2C通讯函数
💻 C
字号:
//------------------------------
// AverLogic Technology Co.Ltd.
// File Name : i2c.c
//    Author : Casper Chou
//------------------------------
#ifndef	_I2C_C
#define	_I2C_C
#include "define.h"
#include "ext_var.h"
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//------------------------------
void i2c_wait(void)
{
   _nop_();
   _nop_();
   _nop_();	// 2002-12-20 more add!
#if (XTAL>=12000000)
   _nop_();
   _nop_();
   _nop_();	// 2002-12-20 more add!
   _nop_();	// 2002-12-20 more add!
#endif
}
//------------------------------
void i2c_start(void)
{
   SDA_P=1;
   SCL_P=1;
   i2c_wait();
   SDA_P=0;
   i2c_wait();
   SCL_P=0;
}
//------------------------------
void i2c_stop(void)
{
   SDA_P=0;
   _nop_();
   SCL_P=1;
   i2c_wait();
   SDA_P=1;
}
//------------------------------
BOOL i2c_tx_byte(BYTE TxData)
{
   BYTE i;
   BOOL ack;

   for(i=0;i<8;i++)
   {
      if(TxData&0x80)
         SDA_P=1;
      else
         SDA_P=0;
      TxData<<=1;
      i2c_wait();
      SCL_P=1;
      i2c_wait();
      SCL_P=0;
      i2c_wait();
   }
   SDA_P=1;	// ready to wait ack...
   _nop_();
   SCL_P=1;
   i2c_wait();
   ack=SDA_P;
   SCL_P=0;
   i2c_wait();
   return ack;
}
//------------------------------
BYTE i2c_rx_byte(void)
{
   BYTE i, RecvData=0x00;
   
   SDA_P=1;	// prevent i2c_tx_ack(FALSE)'s bug... 2003-08-19
   for(i=0;i<8;i++)
   {
      SCL_P=1;
      i2c_wait();
      RecvData<<=1;
      if(SDA_P)
         RecvData|=0x01;
      SCL_P=0;
      i2c_wait();
   }
   return RecvData;
}
//------------------------------
// ack="0" / non-ack="1"
void i2c_tx_ack(BOOL ack)
{
   SDA_P=ack;
   SCL_P=1;
   i2c_wait();
   SCL_P=0;
}
//------------------------------
BYTE i2c_read_byte(BYTE slave_addr, BYTE reg_addr)
{
   BYTE rc;

   while(1)
   {
      i2c_start();
      if(i2c_tx_byte(slave_addr))
      {
         i2c_stop();
         continue;
      }
      if(i2c_tx_byte(reg_addr))
      {
         i2c_stop();
         continue;
      }
      i2c_start();
      if(!i2c_tx_byte(slave_addr|0x01))
         break;
      i2c_stop();
   }
   rc=i2c_rx_byte();
   i2c_tx_ack(TRUE);
   i2c_stop();
   return rc;
}
//------------------------------
void i2c_write_byte(BYTE slave_addr, BYTE reg_addr, BYTE val)
{
   while(1)
   {
      i2c_start();
      if(i2c_tx_byte(slave_addr))
      {
         i2c_stop();
         continue;
      }
      if(i2c_tx_byte(reg_addr))
      {
         i2c_stop();
         continue;
      }
      if(i2c_tx_byte(val))
      {
         i2c_stop();
         continue;
      }
      i2c_stop();
      break;
   }
}
//------------------------------
WORD i2c_read_word(BYTE slave_addr, BYTE reg_addr)
{
   WORD rc=0xFFFF;

   while(1)
   {
      i2c_start();
      if(i2c_tx_byte(slave_addr))
      {
         i2c_stop();
         continue;
      }
      if(i2c_tx_byte(reg_addr))
      {
         i2c_stop();
         continue;
      }
      
      i2c_start();
      if(i2c_tx_byte(slave_addr+1))
      {
         i2c_stop();
         continue;
      }
      rc=i2c_rx_byte()*256;	// high byte
      i2c_tx_ack(FALSE);
      rc|=i2c_rx_byte();	// low byte
      i2c_tx_ack(TRUE);
      i2c_stop();
      break;
   }
   return rc;
}
//------------------------------
void i2c_write_word(BYTE slave_addr, BYTE reg_addr, WORD val)
{
   while(1)
   {
      i2c_start();
      if(i2c_tx_byte(slave_addr))
      {
         i2c_stop();
         continue;
      }
      if(i2c_tx_byte(reg_addr))
      {
         i2c_stop();
         continue;
      }
      if(i2c_tx_byte(val>>8))	// high byte
      {
         i2c_stop();
         continue;
      }
      if(i2c_tx_byte(val))	// low byte
      {
         i2c_stop();
         continue;
      }
      i2c_stop();
      break;
   }
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
#endif

⌨️ 快捷键说明

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