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

📄 i2c.c

📁 MST720-DEMO程序
💻 C
字号:
/******************************************************************************
 Copyright (c) 2005 MStar Semiconductor, Inc.
 All rights reserved.

 [Module Name]: I2C.c
 [Date]:	04-Jan-2005
 [Comment]:
   This module Write & Read to IIC devices.
 [Reversion History]:
*******************************************************************************/

#define _I2C_C_
/********************
* INCLUDE FILES     *
*********************/
#include <intrins.h>
#include "Project.h"
#include "Debug.h"
#include "Mcu_reg.h"
#include "I2C.h"
#include "Mcu.h"

#if I2C_ENABLE
/**********************
* FUNCTION PROTOTYPES *
***********************/
//-------------------------------------------------------------------
//	i2cCI2CStart(void)
//-------------------------------------------------------------------
void sysI2CStart(void)
{
	I2C_SCL_PIN = 1;
	I2C_SDA_PIN = 1;
	MCU_DELAY_1US();

	((!I2C_SCL_PIN)||(!I2C_SDA_PIN)) ? (g_bI2CError = 1) : (g_bI2CError = 0);

	I2C_SDA_PIN = 0;
	MCU_DELAY_1US();
	I2C_SCL_PIN = 0;
}


//-------------------------------------------------------------------
//	i2cCI2CStop(void)
//-------------------------------------------------------------------
void sysI2CStop(void)
{
	I2C_SDA_PIN = 0;
	MCU_DELAY_1US();
	I2C_SCL_PIN = 1;
	MCU_DELAY_1US();
	I2C_SDA_PIN = 1;
}

//-------------------------------------------------------------------
//	i2cCI2CSendNonAck(void)
//-------------------------------------------------------------------
void sysI2CSendNonAck(void)
{
	I2C_SDA_PIN = 1;
	I2C_SCL_PIN = 1;
	MCU_DELAY_1US();
	I2C_SCL_PIN = 0;
	I2C_SDA_PIN = 1;
	MCU_DELAY_1US();
}

//-------------------------------------------------------------------
//	i2cCI2CGetAck(void)
//-------------------------------------------------------------------
bit sysI2CGetAck(void)
{
	bit bAckValue;

	I2C_SDA_PIN = 1;    //  Release I2C Bus
	MCU_DELAY_1US();
	I2C_SCL_PIN = 1;
	MCU_DELAY_1US();
	bAckValue = I2C_SDA_PIN;
	I2C_SCL_PIN = 0;
	MCU_DELAY_1US();
	I2C_SDA_PIN = 1;

    return (bAckValue);
}


//-------------------------------------------------------------------
//	I2C_SendByte(BYTE val)
//-------------------------------------------------------------------
void sysI2CSendByte(BYTE i2c_data)
{
	BYTE ucloop;

	for (ucloop=0x80; ucloop>=1; ucloop>>=1)
	{
		I2C_SDA_PIN = i2c_data & ucloop;
		MCU_DELAY_1US();
		I2C_SCL_PIN = 1;
		MCU_DELAY_1US();
		I2C_SCL_PIN = 0;
		MCU_DELAY_1US();
	}
}


//-------------------------------------------------------------------
//	I2C_GetByte(void)
//-------------------------------------------------------------------
BYTE sysI2CGetByte(void)
{
	BYTE ucloop;
	BYTE ucI2cData=0;

	I2C_SDA_PIN = 1;
	
	for (ucloop=0; ucloop<8; ucloop++)
	{
		I2C_SCL_PIN = 1;
		ucI2cData <<=1;
		MCU_DELAY_1US();
		ucI2cData |= I2C_SDA_PIN;
		I2C_SCL_PIN = 0;
		MCU_DELAY_1US();
	}
	return (ucI2cData);
}



//-------------------------------------------------------------------
//	i2cCI2CWriteByte(BYTE slave_addr, BYTE i2c_addr, BYTE i2c_data)
//-------------------------------------------------------------------
#if RS232DBG
void sysI2CWriteByte(BYTE slave_addr, BYTE i2c_addr, BYTE i2c_data)
{
	sysI2CStart();
	sysI2CSendByte(slave_addr&0xFE);  // Write Function
	
	if (sysI2CGetAck())   
		g_bI2CError = 1;
	
	sysI2CSendByte(i2c_addr);
	
	if (sysI2CGetAck())   
		g_bI2CError = 1;
	
	sysI2CSendByte(i2c_data);
	
	if (sysI2CGetAck())   
		g_bI2CError = 1;
	
	sysI2CStop();
}


//-------------------------------------------------------------------
//      i2cCI2CReadByte(BYTE slave_addr, BYTE i2c_addr)
//-------------------------------------------------------------------
BYTE sysI2CReadByte(BYTE slave_addr, BYTE i2c_addr)
{
	BYTE ucI2cData;

	sysI2CStart();
	sysI2CSendByte(slave_addr&0xFE);  // Write Function
	
	if (sysI2CGetAck())   
		g_bI2CError = 1;
	
	sysI2CSendByte(i2c_addr);
	
	if (sysI2CGetAck())   
		g_bI2CError = 1;
	
	sysI2CStart();
	
	sysI2CSendByte(slave_addr|0x01);  // Read Function
	
	if (sysI2CGetAck())  
		g_bI2CError = 1;
	
	ucI2cData = sysI2CGetByte();
	sysI2CSendNonAck();
	sysI2CStop();

	return ucI2cData;
}
#endif	// RS232DBG

#if (RM_EEPROM_TYPE < RM_TYPE_SST512)
//-------------------------------------------------------------------
//	i2cCI2CSendAck(void)
//-------------------------------------------------------------------
void sysI2CSendAck(void)
{
	I2C_SDA_PIN = 0;
	I2C_SCL_PIN = 1;
	MCU_DELAY_1US();
	I2C_SCL_PIN = 0;
	I2C_SDA_PIN = 1;
	MCU_DELAY_1US();
}

//-------------------------------------------------------------------
//	sysI2CWriteBytes(BYTE slave_addr, BYTE i2c_addr, BYTE i2c_num, BYTE i2c_data)
//-------------------------------------------------------------------
void sysI2CWriteBytes(BYTE slave_addr, BYTE i2c_addr, BYTE i2c_num, BYTE *i2c_data)
{
	BYTE ucCnt=0;

	sysI2CStart();
	sysI2CSendByte(slave_addr&0xFE);  // Write Function
	
	if (sysI2CGetAck())   
		g_bI2CError = 1;
	
	sysI2CSendByte(i2c_addr);
	
	if (sysI2CGetAck())   
		g_bI2CError = 1;

	if (i2c_num)
	{
		while((i2c_num--)&&(!g_bI2CError))
		{
			sysI2CSendByte(i2c_data[ucCnt++]);
			
			if (sysI2CGetAck())  
				g_bI2CError = 1;
		}
		
		sysI2CStop();
	}
}


//-------------------------------------------------------------------
//      sysI2CReadByte(BYTE slave_addr, BYTE i2c_addr)
//-------------------------------------------------------------------
void sysI2CReadBytes(BYTE slave_addr, BYTE i2c_addr, BYTE i2c_num, BYTE *i2c_data)
{
	BYTE ucCnt=0;

	sysI2CStart();
	sysI2CSendByte(slave_addr&0xFE);  // Write Function
	
	if (sysI2CGetAck())   
		g_bI2CError = 1;
	
	sysI2CSendByte(i2c_addr);
	
	if (sysI2CGetAck())  
		g_bI2CError = 1;
	
	sysI2CStart();
	
	sysI2CSendByte(slave_addr|0x01);  // Read Function
	
	if (sysI2CGetAck())  
		g_bI2CError = 1;

	if (i2c_num)
	{
		while((i2c_num--)&&(!g_bI2CError))
		{
			i2c_data[ucCnt++] = sysI2CGetByte();
			i2c_num ? (sysI2CSendAck()) : (sysI2CSendNonAck());
		}
	}
	
	sysI2CStop();
}
#endif	// (RM_EEPROM_TYPE < RM_TYPE_SST512)
#endif	// I2C_ENABLE

⌨️ 快捷键说明

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