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

📄 i2c2.c

📁 一个电表的程序
💻 C
字号:
/*******************************************************************************
*
*  FILE NAME	  :  i2c.c
*
*  DESCRIPTION:
*  i2c for eeprom read/write routine
*
********************************************************************************
*  INCLUDE FILES
********************************************************************************/
#include 	<machine.h>
#include 	"iodefine.h"
#include	"i2c.h"
#include    "extern.h"

/******************************************************************************/
#define 	SET_SDA2_IN  		(IO.PCR5 = 0xf6)		
#define 	SET_SDA2_OUT		(IO.PCR5 = 0xfe)
#define 	SET_SDA2_SCL_OUT 	(IO.PCR5 = 0xfe)
#define 	I2C_SDA2         	(IO.PDR5.BIT.B3)
#define 	I2C_SCL2			(IO.PDR5.BIT.B2)
#define 	EEPROM_WP2			(IO.PDR3.BIT.B6)
#define 	EEPROM_WP2_ON		(EEPROM_WP2 = 1)
#define 	EEPROM_WP2_OFF		(EEPROM_WP2 = 0)

// =======================================================================
/*对于EEROM I2C 要注意:
	1、应答信号判断,控制;
	2、页写延时
	*/
// =======================================================================		*/
/*对于EEROM I2C 要注意:
	1、应答信号判断,控制;
	2、页写延时																	*/
void I2cWStart2(void)
{
	SET_SDA2_SCL_OUT;
	NOP;
	NOP;
	I2C_SCL2 = 0;
	NOP;
	NOP;
	I2C_SDA2 = 1;
	NOP;
	NOP;
	I2C_SCL2 = 1;
	NOP;
	NOP;
	I2C_SDA2 = 0;
    NOP;
    NOP;
    I2C_SCL2 = 0;
}


// =======================================================================
void I2cStop2(void)
{
	SET_SDA2_OUT;	//I2C_SCL = 0; //EEPROM_i2c_scl_low();
	NOP;
	NOP;
	I2C_SCL2 = 0;
	NOP;
	NOP;
    I2C_SDA2 = 0;
    NOP;
    NOP;
    I2C_SCL2 = 1;
    NOP;
    NOP;
    I2C_SDA2 = 1;
}
// =======================================================================
void I2_SLK2(void)
{
	NOP;
	I2C_SCL2 = 1;
	NOP;
	NOP;
	I2C_SCL2 = 0;
	NOP;
}
// =======================================================================
void I2cWrtBit2(unsigned char data)
{
	unsigned char k;
	SET_SDA2_OUT;
	for(k=0; k<8; k++) 
	{
		if(data & cMsbBitTbl[k])
			I2C_SDA2 = 1;	//I2cSdaHigh;
		else 
			I2C_SDA2 = 0;	//	I2cSdaLow;
		I2_SLK2 ();
	}
}
// =======================================================================
unsigned char ee_ack2()
{
	unsigned char ack;
	SET_SDA2_IN;
	ack = 0;
	NOP;
	I2C_SCL2 = 1;
	NOP;
	if(I2C_SDA2 == 1)
		ack = 1;
	I2C_SCL2 = 0;	//如果延长SCL时间可使I2C_SDA = 1 ???,在SCL =1前可对SDA做任何改动
	NOP;
	I2C_SDA2 = 0;	//所以要在更改为outport 前=0 ???
	return ack;
}

// =======================================================================
unsigned char I2cRBit2(void)
{
	unsigned char data,j;
	SET_SDA2_IN;
	data = 0;
	for(j=0;j<8;j++) 
	{
		I2C_SCL2 = 1;
        if(I2C_SDA2 ==1 )	//IsI2cSdaHigh)
			data |= cMsbBitTbl[j];
		I2C_SCL2 = 0;
	}
	return data;
}
// =======================================================================
void I2c_ACK2(void)
{
	SET_SDA2_OUT;
	I2C_SDA2 = 0;
	NOP;
	I2_SLK2();
}
// =======================================================================
void I2c_NACK2(void)
{
	SET_SDA2_OUT;
	I2C_SDA2 = 1;
	NOP;
	I2_SLK2();
}

/*********************************************************************************************************/
unsigned char  F_BlckRead_Eeprm2(unsigned int Data_SAdr,unsigned char   *Data,unsigned char Data_Len)
{
  unsigned char mack,i,Loop,j,F_ee_ok=0;
  if (Data_Len==0)
   {
	 return F_ee_ok;
	} 
  j=Data_Len;	 
  F_ee_ok = 0;
  Loop=0x03;
  while(Loop--)
   {
     I2cWStart2();
     I2cWrtBit2 (CHIP_ADDR2|((unsigned char )(Data_SAdr>>8)<<1) );
     mack = ee_ack2();
     I2cWrtBit2 ((unsigned char )Data_SAdr);
     mack |= ee_ack2();
     I2cWStart2();
     I2cWrtBit2 ((CHIP_ADDR2|((unsigned char )(Data_SAdr>>8)<<1)) |0x01);
     mack |= ee_ack2();
     for ( i=1;i<Data_Len;i++)
	  {
	    *Data++ = I2cRBit2();
		I2c_ACK2(); 
       }
     *Data = I2cRBit2();
     if(!mack)
      {
        F_ee_ok=1;
        break;
       }
     else
      {
        Data_SAdr=Data_SAdr-j;
	    Data=Data-j;
	    Data_Len=j;
       }
     }  
  I2c_NACK2();
  I2cStop2();
  return F_ee_ok;
}
// =======================================================================
unsigned char   F_BlckWrt_Eeprm2(unsigned int 	Data_SAdr,unsigned char  *Data,unsigned char 	Data_Len)
{
  unsigned char Loop,mack,i,j,F_ee_ok=0;
  if (Data_Len==0)
   {
	 return F_ee_ok;
	} 
  j=Data_Len;	
  EEPROM_WP2_OFF;
now_star2:
  Loop=3;
  while(Loop-- !=0)
   {
     F_ee_ok = 0;
     I2cWStart2();
     I2cWrtBit2 (CHIP_ADDR2|((unsigned char)(Data_SAdr>>8)<<1) );
     mack = ee_ack2();
     I2cWrtBit2 ((unsigned char)Data_SAdr);
     mack |= ee_ack2();
     for (i=0;i<Data_Len;i++)
      {
	    I2cWrtBit2(*Data++);
	    mack |= ee_ack2();
        Data_SAdr+=1;
	    if((!(Data_SAdr&0x0f)) &&(!mack))
	     {
		   I2cStop2();
		   delay_10ms();
		   Data_Len-=(i+1);
		   goto now_star2;
   	      }
	   }
     if(!mack)
      {
	    F_ee_ok = 1;		//表示EEROM操作成功
	    break;
	   }
	 Data_SAdr=Data_SAdr-j;
	 Data=Data-j;
	 Data_Len=j;
	}
  I2cStop2();
  for (i =0;i<10;i++)
   {
	 NOP;
	 NOP;
	 NOP;
	 NOP;
	}
  EEPROM_WP2_ON;
  delay_10ms();
  return F_ee_ok;
}


⌨️ 快捷键说明

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