📄 i2c.c
字号:
//*******************************************
// * 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 + -