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

📄 i2c.c

📁 标准 C语言 I2C程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//*******************************************
// * WISE SUCCESS TECHNOLOGY Copyright (c) 2008,开发部
// * 项目名称:车载多媒体
// * 函数名称:i2c.c
// * 内容简介:I2C总线1底层函数
// * 当前版本:1.0
// * 取代版本:无
// * 作    者:  易小虎
// * 完成日期:08.3.28
// * 原作者  :
// * 修改内容: 
// * 适用于STC89LE516AD
#define	_I2C_C_

/**********I2C*************/

#include "intrins.h"
#include "i2c.h"
#include "com.h"
#include "cpu8052.h"
#include "main.h"

		//	工厂模式系统数据首地址(0-255)
extern Byte code  TAB_FACTORY_MODE_SYSTEM_STORE_START_ADDR[256] =
		{
		       //;	           0	   1	  2新旧3	  4亮度 5对比 6色度 7背光亮度
					   20,   20,   234,    20,	     20,         20,	     20,             0 ,//	   ;0
		       //;	       8视模 9音量10低音11高音12左右13前后14EQ  15
					    0,           20,	    7,          7,              7,           7,	    1,   	 20,//				  ;1
			//;  	    16信息17V_DC  18.V_AC  19	20输入 21  22MIN 23MAX
					 1,            160,    84,	  2,	      0,       20,	    0,	     30,//	   ;2                        
			//;          24POS 25EJ   26	 27	    28	29	        30	   31
					 40,    10,	0,	  0,	     0,	 10,      0x26,  0x2A,//		 ;3
			//;    	  32	    33      34	 35       36	 37           38	 39
					0x26, 0xF2,  0x27, 0xBA,  0x28,  0x82,     0x29,  0x4A,//		;4
			//;    	  40	     41      42	    43         44	     45       46	 47
					0x2A,  0x12,  0x2B,  0x3E,	0x2C,  0x06,  0x2C, 0xCE,// 	 ;5
			//;   	 48	      49    50	    51     52	   53       54	 55
					0x2E,  0x5E,  0x26,  0x2A, 0x26,  0x0F2,  0x27, 0x0BA,//		  ;6
			//;    	 56	       57    58	    59     60	  61       62	 63
					0x28,  0x82,  0x29,  0x4A, 0x2A,  0x12,   0x2B, 0x3E,// 		  ;7
			//;   	 64	     65      66	   67       68	   69)     (70	 71
					0x2C,  0x06,  0x2C, 0x0CE, 0x2E,  0x5E,   0x2B, 0x0E9,//		  ;8
			//;   	 72	     73      74	    75       76	   77       78	 79
					0x2C,  0x54,  0x2C, 0x0BF, 0x2D,  0x2A,   0x2D,  0x95,//		  ;9
			//;   	 80	     81      82	    83       84	   85       86	 87
					0x2E,  0x00,  0x00,  0x00, 0x00, 0x000,   0x00,  0x00,//		  ;10
			//;   	 88	     89)     90	     91       92	   93       94	  95
					0x00,  0x00,   0x10,  0x0E9, 0x18,   10,     10,	 10,//		   ;11
			//;   	 96	      97      98	     99       100	   101      102	  103
					10,       1,	 1,       10,	    0,        0,    0x26,  0x2A,//	   ;12
			//;   	 104	      105   106	     107     108    109      110    111
					0,         26,	0x2A,	 0,  0x2B, 0x0E9,      1,      0,//	 ;13
			//;   	 112     113     114	    115      116	    117     118	   119
					  0,        0,        1,       0,	  1,        3,        1 ,  0,//	  ;14
			//;    	 120	     121   122	   123       124	     125    126	   127
					2,          0,        0,       0,	  71,      26,    73,      37,//		  ;15
		};		
		
//*******************************************
// * 函数名称:Initial516AD														
// * 内容简介:MCU内部初始化
// * 函数变量:无
// *				  :
// *	返回值	  :    无
//*******************************************
		//EEPROM初始化
void Eeprom_Init(void)
		{
			Byte  idata j;
			Byte  idata *temp;
		
			Delay_1ms(500);
			//;加载提示音
			Buzzer_System2();
			//;调用数据复制程序(0-230)
			   //;工厂模式数据首地址(系统存储)------[0-230]
			for(j=0;j<255;j++,temp++)
			{
				Buff[0]=TAB_FACTORY_MODE_SYSTEM_STORE_START_ADDR[j];
				Send_EEprom_Data(EEPROM,j,Buff,1);
				//Delay_500us();
				}
			
			//;加载提示音
			Buzzer_System1();
		}
//*******************************************
// * 函数名称:Initial516AD														
// * 内容简介:MCU内部初始化
// * 函数变量:无
// *				  :
// *	返回值	  :    无
//*******************************************
        //;存储器发送数据程序
	//;入口条件:器件地址,字节数量,子地址
void Send_EEprom_Data(Byte ucSlaveAdr,Byte ucSubAdr, Byte *pBuf, Byte ucBufLen)
{
	Byte i;
	
	for(i=0;i<ucBufLen;i++,ucSubAdr++,pBuf++)
	{
	       i2cWriteByte(ucSlaveAdr, ucSubAdr, *pBuf);
		Delay_1ms(5);//10
	}

	//i2cBurstWriteBytes(ucSlaveAdr,ucSubAdr,pBuf,ucBufLen);	
	
 }

//*******************************************
// * 函数名称:Initial516AD														
// * 内容简介:MCU内部初始化
// * 函数变量:无
// *				  :
// *	返回值	  :    无
//*******************************************

/////////////////////////////////////////
// Set I2C SCL pin high/low.
//
// Arguments: bSet - high/low bit
/////////////////////////////////////////
void i2cSetSCL_Chk(bit bSet)
{
    Byte ucDummy; // loop dummy


    i2cSetSCL(bSet); // set SCL pin

    if (bSet == _HIGH) // if set pin high
    {
        ucDummy = I2C_CHECK_PIN_DUMMY; // initialize dummy
        while ((i2cSCL_PIN_STATUS() == _LOW) && (ucDummy--)) ; // check SCL pull high
    }

}
//*******************************************
// * 函数名称:Initial516AD														
// * 内容简介:MCU内部初始化
// * 函数变量:无
// *				  :
// *	返回值	  :    无
//*******************************************
/////////////////////////////////////////
// Set I2C SDA pin high/low
//
// Arguments: bSet - high/low bit
/////////////////////////////////////////
void i2cSetSDA_Chk(bit bSet)
{
    Byte ucDummy; // loop dummy

    i2cSetSDA(bSet); // set SDA pin

    if (bSet == _HIGH) // if set pin high
    {
        ucDummy = I2C_CHECK_PIN_DUMMY; // initialize dummy
        while ((i2cSDA_PIN_STATUS() == _LOW) && (ucDummy--)) ; // check SDA pull high
    }

}
//*******************************************
// * 函数名称:Initial516AD														
// * 内容简介:MCU内部初始化
// * 函数变量:无
// *				  :
// *	返回值	  :    无
//*******************************************
//////////////////////////////////////////////////////////////
// Delay 4us
//////////////////////////////////////////////////////////////
void i2c_Delay(void)
{
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
}
//////////////////////////////////////////////////////
// I2C start signal.
// <comment>
//  SCL ________
//              \_________
//  SDA _____
//           \____________
//
// Return value: None
//////////////////////////////////////////////////////
//*******************************************
// * 函数名称:Initial516AD														
// * 内容简介:MCU内部初始化
// * 函数变量:无
// *				  :
// *	返回值	  :    无
//*******************************************
bit i2c_Start()
{
    bit bStatus = TRUE; // success status


    i2cSetSDA_Chk(_HIGH);
    i2c_Delay();
    i2cSetSCL_Chk(_HIGH);
    i2c_Delay();
    

    if ((i2cSCL_PIN_STATUS() == _LOW) || (i2cSDA_PIN_STATUS() == _LOW))
    {
        bStatus = FALSE;
    }
    else
    {
        i2cSetSDA(_LOW);
        i2c_Delay();
        i2cSetSCL(_LOW);
    }

	
    return bStatus;
}
/////////////////////////////////////////
// I2C stop signal.
// <comment>
//              ____________
//  SCL _______/
//                 _________
//  SDA __________/
/////////////////////////////////////////
//*******************************************
// * 函数名称:Initial516AD														
// * 内容简介:MCU内部初始化
// * 函数变量:无
// *				  :
// *	返回值	  :    无
//*******************************************
void i2c_Stop()
{
	    i2cSetSCL(_LOW);
	    i2c_Delay();
	    i2cSetSDA(_LOW);
	    i2c_Delay();
	    i2cSetSCL(_HIGH);
	    i2c_Delay();
	    i2cSetSDA(_HIGH);
	    i2c_Delay();
}

//////////////////////////////////////////////////////////////////////////
// I2C send byte to device.
//
// Arguments: ucVal - send byte
// Return value: I2C acknowledge bit
//               I2C_ACKNOWLEDGE/I2C_NON_ACKNOWLEDGE
//////////////////////////////////////////////////////////////////////////
//*******************************************
// * 函数名称:Initial516AD														
// * 内容简介:MCU内部初始化
// * 函数变量:无
// *				  :
// *	返回值	  :    无
//*******************************************
bit i2c_SendByte(Byte ucVal)
{
    Byte    ucMask = 0x80;
    Word   i;
    bit     bAck; // acknowledge bit


    while(ucMask)
    {
	        if (ucVal & ucMask)
	            i2cSetSDA_Chk(_HIGH);
	        else
	            i2cSetSDA_Chk(_LOW);
	        i2c_Delay();
	        i2cSetSCL_Chk(_HIGH); // clock
	        i2c_Delay();
	        i2c_Delay();
	        i2cSetSCL(_LOW);
	        i2c_Delay();

	        ucMask >>= 1; // next
	    } // while

	    // recieve acknowledge
	    i2cSetSDA(_HIGH);
	    i2c_Delay();
	    i2cSetSCL(_HIGH);
	    i2c_Delay();
	   
	    for(i=0;i<100;i++)
	    {
		if(i2cSDA_PIN_STATUS()==0)
			break;
	    	i2c_Delay();
	    }
	    
	     bAck = i2cSDA_PIN_STATUS(); // recieve acknowlege
	    i2cSetSCL(_LOW);

          return (bAck);
}
//////////////////////////////////////////////////////////////////////////
// I2C receive byte from device.
//
// Return value: receive byte
//////////////////////////////////////////////////////////////////////////
//*******************************************
// * 函数名称:Initial516AD														
// * 内容简介:MCU内部初始化
// * 函数变量:无
// *				  :
// *	返回值	  :    无
//*******************************************
Byte i2c_ReceiveByte(bit bAck)
{
    Byte    ucReceive = 0;
    Byte    ucMask = 0x80;

    while(ucMask)
    {
		i2cSetSDA(_HIGH);
		i2cSetSCL(_HIGH);
		i2c_Delay();
		
		if(i2cSDA_PIN_STATUS() == _HIGH)
			ucReceive |= ucMask;

		i2cSetSCL(_LOW);
		i2c_Delay();

        ucMask >>= 1;
    } // while

    if (bAck) // acknowledge
        i2cSetSDA_Chk(I2C_ACKNOWLEDGE);
    else // non-acknowledge
        i2cSetSDA_Chk(I2C_NON_ACKNOWLEDGE);

    i2c_Delay();
    i2cSetSCL(_HIGH);
    i2c_Delay();
    i2cSetSCL(_LOW);

    return ucReceive;
}

//////////////////////////////////////////////////////////////////////////
// I2C access start.
//
// Arguments: ucSlaveAdr - slave address
//            trans_t - I2C_TRANS_WRITE/I2C_TRANS_READ
//////////////////////////////////////////////////////////////////////////
//*******************************************
// * 函数名称:Initial516AD														
// * 内容简介:MCU内部初始化
// * 函数变量:无
// *				  :
// *	返回值	  :    无
//*******************************************
bit i2c_AccessStart(Byte ucSlaveAdr, I2C_Direction trans_t)
{
    Byte ucDummy; // loop dummy

    if (trans_t == I2C_READ) // check i2c read or write
        ucSlaveAdr = I2C_DEVICE_ADR_READ(ucSlaveAdr); // read
    else
        ucSlaveAdr = I2C_DEVICE_ADR_WRITE(ucSlaveAdr); // write

    ucDummy = I2C_ACCESS_DUMMY_TIME;
    while (ucDummy--)
    {    
	i2c_Delay();
        if (i2c_Start() == FALSE)
            continue;

        if (i2c_SendByte(ucSlaveAdr) == I2C_ACKNOWLEDGE) // check acknowledge
            return TRUE;
		//printf("ucSlaveAdr====%x", ucSlaveAdr);
        i2c_Stop();
        Delay_1ms(1);
    }

    return FALSE;
}
/////////////////////////////////////////////////////////////////
// I2C write bytes to device.
//
// Arguments: ucSlaveAdr - slave address
//            ucSubAdr - sub address
//            pBuf - pointer of buffer
//            ucBufLen - length of buffer
/////////////////////////////////////////////////////////////////
//*******************************************
// * 函数名称:Initial516AD														
// * 内容简介:MCU内部初始化
// * 函数变量:无
// *				  :
// *	返回值	  :    无
//*******************************************
void i2cBurstWriteBytes(Byte ucSlaveAdr, Byte ucSubAdr, Byte *pBuf, Byte ucBufLen)
{
    Byte ucDummy; // loop dummy

    ucDummy = I2C_ACCESS_DUMMY_TIME;
    while(ucDummy--)
    {
        if (i2c_AccessStart(ucSlaveAdr, I2C_WRITE) == FALSE)
            continue;
        if (i2c_SendByte(ucSubAdr) == I2C_NON_ACKNOWLEDGE) // check non-acknowledge
            continue;

        while(ucBufLen--) // loop of writting data
        {
            i2c_SendByte(*pBuf); // send byte
            pBuf++; // next byte pointer
        } // while

        break;
    } // while

    i2c_Stop();
}

/////////////////////////////////////////////////////////////////
// I2C read bytes from device.
//
// Arguments: ucSlaveAdr - slave address
//            ucSubAdr - sub address
//            pBuf - pointer of buffer
//            ucBufLen - length of buffer
/////////////////////////////////////////////////////////////////
//*******************************************
// * 函数名称:Initial516AD														
// * 内容简介:MCU内部初始化
// * 函数变量:无
// *				  :
// *	返回值	  :    无
//*******************************************
void i2cBurstReadBytes(Byte ucSlaveAdr, Byte ucSubAdr, Byte *pBuf, Byte ucBufLen)
{
    Byte ucDummy; // loop dummy

    ucDummy = I2C_ACCESS_DUMMY_TIME;
    while(ucDummy--)
    {
        if (i2c_AccessStart(ucSlaveAdr, I2C_WRITE) == FALSE)
            continue;

        if (i2c_SendByte(ucSubAdr) == I2C_NON_ACKNOWLEDGE) // check non-acknowledge
            continue;

        if (i2c_AccessStart(ucSlaveAdr, I2C_READ) == FALSE)
            continue;

⌨️ 快捷键说明

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