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

📄 i2c.c

📁 用于Slave I2C得读写,此代码针对特定得芯片,但对其他得芯片也有借鉴作用.
💻 C
字号:
/**********************************************************
*File: i2C.c
*Content: Test I2C interface of 24AA256

*data:   03/18/2006       Eric    V0.1
* Copyright (c) 2005 Fameg, Inc. All rights reserved
***********************************************************/
#include "DP8051.h"
#include "FS7822.h"
#include "I2C.h"

#define SLAVE_ADDRESS  0xEA
#define bmI2CCK_DIV       0x54
#define bmCLK_PRE         0x40

#define I2C_EN			0x80
#define I2C_MODE		0x40
#define MST_MODE		0x20
#define START			0x02
#define STOP			0x01

void InitCPU()
{
	SYS_CFG=bmCPUCLK_SEL|bmPM_AVBLE|bmSYS_SWRST; //select system  clock,firmware dispose USB request, reset the device

    SYSIO_CFG=bmSPI_EN|bmI2C_EN;

	SW_RST=bmSPI_RST|bmI2C_RST;

	BPPUCTL=bmSPIPUCTL;

	MEMCON=bmMEMCON|bmASYN;
    //MEMCON=0x08;
}

void I2c_Init(BOOL isHigh)
{
    SW_RST|=bmI2C_RST;

    if(isHigh)
          I2C_CLK = bmI2CCK_DIV;                     //400k
    else
          I2C_CLK = bmCLK_PRE|bmI2CCK_DIV;           //100k

	I2C_CTL &= 0x3F;             //master
	I2C_MABT = 0x01;          //设定超时时间
}



void I2C_Write(unsigned char *input,unsigned short wordadd,unsigned char Len)  //向地址wordadd中写入Len长度的input的内容
{
		int i;
		I2C_DBUF = SLAVE_ADDRESS;	                //slave address
        
	   	I2C_CTL = I2C_EN | MST_MODE | START;	    //I2C enable, transmit mode and start flag
		for(i=0;i<300;i++);
        while(!(I2C_STUS & 0x02));                  // until Transmit Done

		I2C_DBUF = MSB(wordadd);	                // transmit High address
		I2C_STUS = 0x02;                            // clear Transmit Done interrupt flag
		while(!(I2C_STUS & 0x02));
		I2C_DBUF = LSB(wordadd);	                //tramsmit low address
		I2C_STUS = 0x02;
		while(!(I2C_STUS & 0x02));

		for(i = 0;i < Len -1 ;i++)	                //transmit n -1 data
		{
			I2C_DBUF = input[i];
		 	I2C_STUS = 0x02;
		 	while(!(I2C_STUS & 0x02));
		}

		I2C_DBUF = input[i];	                    // transmit the last data
		I2C_STUS = 0x0F;
		while(!(I2C_STUS & 0x02));
		I2C_CTL |= STOP;	                        //configure stop flag
   		I2C_STUS = 0x0F;
        while(!(I2C_STUS & 0x04));
        I2C_STUS = 0x0F;
}
//------------------------------------------------------------------------------
//output: Data read from EEPROM by I2C interface
//wordadd: Address on which data is read from EEPROM
//Len: Data length
//------------------------------------------------------------------------------
void I2C_Read(unsigned char *output,unsigned short wordadd,unsigned char Len)
{
	    int i;
         
    	I2C_DBUF = SLAVE_ADDRESS;		   		//slave address
    	I2C_CTL = MST_MODE | START; 	//I2C enable, transmit mode and start flag
    	while(!(I2C_STUS & 0x02));

    	I2C_DBUF = MSB(wordadd);				// transmit High address
    	I2C_STUS = 0x0F;
    	while(!(I2C_STUS & 0x02));
    	I2C_DBUF = LSB(wordadd);				//tramsmit low address
    	I2C_STUS = 0x0F;
    	while(!(I2C_STUS & 0x02));

    	I2C_DBUF = SLAVE_ADDRESS | 0x01;            
    	I2C_CTL |= START;               //I2C enable, receive mode and start flag
    	I2C_STUS = 0x0F;
    	while(!(I2C_STUS & 0x02));

    	for(i = 0;i<Len - 1;i++)				//receive n-1 data
    	{
    		I2C_STUS = 0x0F;
    		while(!(I2C_STUS & 0x01));
    		output[i] = I2C_DBUF;
    	}

    	I2C_STUS = 0x0F;
        while(!(I2C_STUS & 0x01));
    	output[i] = I2C_DBUF;					//read last data
    	I2C_CTL |= 0x01;						//configure stop flag
     	I2C_STUS = 0x0F;
        while(!(I2C_STUS & 0x04));
        I2C_STUS = 0x0F;
}

void I2C_WriteRead(unsigned char *input,unsigned char *output,unsigned short wordadd,unsigned char Len)	//测试Restart功能
{
	    int i;
		I2C_DBUF = SLAVE_ADDRESS;	                //slave address

	   	I2C_CTL = I2C_EN | MST_MODE | START;	    //I2C enable, transmit mode and start flag
		while(!(I2C_STUS & 0x02));

		I2C_DBUF = MSB(wordadd);	                // transmit High address
		I2C_STUS = 0x02;
		while(!(I2C_STUS & 0x02));
		I2C_DBUF = LSB(wordadd);	                //tramsmit low address
		I2C_STUS = 0x02;
		while(!(I2C_STUS & 0x02));

		for(i = 0;i < Len -1 ;i++)	                //transmit n -1 data
		{
			I2C_DBUF = input[i];
		 	I2C_STUS = 0x02;
		 	while(!(I2C_STUS & 0x02));
		}
        I2C_DBUF = input[i];	                    // transmit the last data
		I2C_STUS = 0x02;
		while(!(I2C_STUS & 0x02));
        /*
		I2C_DBUF = input[i];	                    // transmit the last data
		I2C_STUS = 0x0F;
		while(!(I2C_STUS & 0x02));
		I2C_CTL |= STOP;	                        //configure stop flag
   		I2C_STUS = 0x0F;
        while(!(I2C_STUS & 0x04));
        I2C_STUS = 0x0F;
        */

//      I2C_CTL = 0x02;
      I2C_DBUF = SLAVE_ADDRESS;		   		//slave address
    	I2C_CTL  =  MST_MODE | START; 	//I2C enable, transmit mode and start flag
      I2C_STUS = 0xFF;
    	while(!(I2C_STUS & 0x02));

    	I2C_DBUF = MSB(wordadd);				// transmit High address
    	I2C_STUS = 0x0F;
    	while(!(I2C_STUS & 0x02));
    	I2C_DBUF = LSB(wordadd);				//tramsmit low address
    	I2C_STUS = 0x0F;
    	while(!(I2C_STUS & 0x02));

    	I2C_DBUF = SLAVE_ADDRESS | 0x01;		//I2C enable, receive mode and start flag
    	I2C_CTL  = I2C_EN | START;
    	I2C_STUS = 0x0F;
    	while(!(I2C_STUS & 0x02));

    	for(i = 0;i<Len - 1;i++)				//receive n-1 data
    	{
    		I2C_STUS = 0x0F;
    		while(!(I2C_STUS & 0x01));
    		output[i] = I2C_DBUF;
    	}

    	I2C_STUS = 0x0F;
        while(!(I2C_STUS & 0x01));
    	output[i] = I2C_DBUF;					//read last data
    	I2C_CTL |= 0x01;						//configure stop flag
     	I2C_STUS = 0x0F;
        while(!(I2C_STUS & 0x04));
        I2C_STUS = 0x0F;
}


void start_i2c()
{
    I2C_DBUF = SLAVE_ADDRESS;
    I2C_CTL = I2C_EN | MST_MODE | START;	    //I2C enable, transmit mode and start flag
    I2C_STUS = 0x0F;
    while(!(I2C_STUS & 0x02));      
    I2C_STUS = 0x0F;
    I2C_CLK = 0x02;
}
void end_i2c()
{
    I2C_CTL |= STOP;	                        //configure stop flag
   	I2C_STUS = 0x0F;
    while(!(I2C_STUS & 0x04));
    I2C_STUS = 0x0F;
}
void    WriteData(BYTE * writedata)
{
     start_i2c();
     I2C_DBUF = *writedata;
     I2C_STUS = 0x02;
	 while(!(I2C_STUS & 0x02));
     end_i2c();	 
}

void WriteMasterCode()
{
    start_i2c();
    I2C_DBUF = 0x0A;
    I2C_STUS = 0x02;
	while(!(I2C_STUS & 0x02));
    end_i2c();	
}
void    ReadData(BYTE * readdata)
{
     I2C_DBUF = SLAVE_ADDRESS | 0x01;            
     I2C_CTL  = I2C_EN | START;             //I2C enable, receive mode and start flag
     I2C_STUS = 0x0F;
     while(!(I2C_STUS & 0x02));      
     I2C_STUS = 0x0F;
     while(!(I2C_STUS & 0x01));    
     *readdata = I2C_DBUF;
     I2C_CTL |= STOP;	                        //configure stop flag
   	 I2C_STUS = 0x0F;
     while(!(I2C_STUS & 0x04));
     I2C_STUS = 0x0F;
}

⌨️ 快捷键说明

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