📄 iic.c
字号:
//---------------------------------------------------------------------------
// YuXiang Inc. Company Confidential Strictly Private
// main.c
// $Archive: IIC.c $
// $Revision: 0.1 $
// $Author: YuCheng $
// $Date: 2005/08/19 16:15:51 $
//
// --------------------------------------------------------------------------
// >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// --------------------------------------------------------------------------
// Copyright 2005(c) YuXiang Inc.
// This is an unpublished work.
// --------------------------------------------------------------------------
#include <intrins.h>
#include "includes.h"
#include "IIC.H"
unsigned char Time_Hour;
unsigned char Time_Min;
unsigned char Time_Sec;
#define TW_SLOW_SPEED
/*********************************************************************************************************
** 函数名称: StartCondition
** 功能描述: 发送IIC启动信号
** 输 入: 无
** 输 出: TRUE:成功
** FALSE:失败
** 全局变量: 无
** 调用模块: 无
********************************************************************************************************/
void StartCondition(void)
{
INT8U cTWtrytime=0;
EA=0;
while(++cTWtrytime)
{
Set_SDA_High;
Set_SCL_High; /* make sure two line is release */
_nop_();
_nop_();
Set_SDA_Low;
_nop_();
_nop_();
if((SCL_High)&&(SDA_Low))
break;
}
_nop_();
_nop_();
}
/*********************************************************************************************************
** 函数名称: StopCondition()
** 功能描述: 发送IIC结束信号
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
********************************************************************************************************/
void StopCondition(void)
{
INT8U cTWtrytime=0;
Set_SDA_Low;
Set_SCL_High;
_nop_();
_nop_();
while(SCL_Low && ++cTWtrytime)
{ };
_nop_();
_nop_();
Set_SDA_High;
_nop_();
_nop_();
EA=1;
}
/*********************************************************************************************************
** 函数名称: Send_Byte()
** 功能描述: 发送一个字节
** 输 入: IIC_data:数据
** 输 出: TRUE:成功
** FALSE:失败
** 全局变量: 无
** 调用模块: 无
********************************************************************************************************/
INT8U Send_Byte(INT8U cData)
{
INT8U ix, cAcknowledge;
INT8U cTWtrytime=0;
cAcknowledge = 0;
for(ix = 0; ix < 8; ix++)
{
Set_SCL_Low;
_nop_();
_nop_();
if(cData&0x80)Set_SDA_High;
else Set_SDA_Low;
cData<<=1;
_nop_();
_nop_();
Set_SCL_High;
while(SCL_Low && ++cTWtrytime)
{ };
_nop_();
_nop_();
}
_nop_();
_nop_();
Set_SCL_Low;
_nop_();
_nop_();
Set_SDA_High; /* release data line for acknowledge */
_nop_();
_nop_();
Set_SCL_High; /* Send a clock for Acknowledge */
while(SCL_Low)
{ };
_nop_();
_nop_();
if(SDA_High) cAcknowledge = 1; /* No Acknowledge */
Set_SCL_Low; /* Finish Acknoledge */
_nop_();
_nop_();
return(cAcknowledge);
}
/*********************************************************************************************************
** 函数名称: Read_Byte
** 功能描述: 读取一个字节
** 输 入: 无
** 输 出: 读取的字节
** 全局变量: 无
** 调用模块: 无
********************************************************************************************************/
INT8U Read_Byte(INT8U cNum)
{
INT8U ix, j;
INT8U cRetval=0;
for(ix=0;ix<8;ix++){
Set_SCL_High;
while(SCL_Low){};
for(j=0;j<TWD_SHORT_TIME;j++){};
cRetval = (SDA_High)? (cRetval|(1<<(7-ix))):cRetval ; // MSB First
Set_SCL_Low;
}
if(cNum==1)
Set_SDA_High;
else
Set_SDA_Low;
//SDA = (cNum==1) 1:0;
Set_SCL_High;
while(SCL_Low){};
_nop_();
_nop_();
Set_SCL_Low;
Set_SDA_High;
_nop_();
_nop_();
return cRetval;
}
/*********************************************************************************************************
** 函数名称: IICReadByte
** 功能描述: 从IIC总线读取数据
** 输 入: Addr:IIC从器件地址
** cReg:从器件片内寄存器地址
** cData:从IIC从器件读取的数据(通过指针方式)
** 输 出: TRUE:成功
** FALSE:失败
** 全局变量: 无
** 调用模块: 无
********************************************************************************************************/
INT8U IICReadByte(INT8U cAddr, INT8U cReg)
{
INT8U cTemp;
StartCondition();
Send_Byte(cAddr);
Send_Byte(cReg);
StartCondition();
Send_Byte(cAddr|0x01);
cTemp=Read_Byte(1);
StopCondition();
return cTemp;
}
/*********************************************************************************************************
** 函数名称: IICWriteByte
** 功能描述: 往IIC总线写数据
** 输 入: Addr:IIC从器件地址
** cReg:从器件片内寄存器地址
** cData:往IIC从器件写数据
** 输 出: TRUE:成功
** FALSE:失败
** 全局变量: 无
** 调用模块: 无
********************************************************************************************************/
INT8U IICWriteByte(INT8U cAddr,INT8U cReg,INT8U cData)
{
StartCondition();
Send_Byte(cAddr);
Send_Byte(cReg);
Send_Byte(cData);
StopCondition();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -