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

📄 iic.c

📁 UCOSII在51单片机上的移植
💻 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 + -