📄 i2c.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 + -