iic.c

来自「UCOSII在51单片机上的移植」· C语言 代码 · 共 241 行

C
241
字号
//---------------------------------------------------------------------------
// 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 + =
减小字号Ctrl + -
显示快捷键?