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

📄 hali2c.c

📁 威望公司MP3 + USB MCU 的参考软件
💻 C
字号:
/****************************************************************
*                      Viaon Technology (Suzhou) Co.,Ltd
*
*    Copyright 2007, Viaon Technology (Suzhou) Co.,Ltd,Suzhou,China
*                    All rights reserved.
*
*
* Filename:      	hali2c.c
*
* Programmer:    	Greg 
*
* Created: 	 	1/2/2008
*
* Description: 		public functions 
*              
*        
* Change History (most recent first):	2008.1.2
****************************************************************/

/*     51系列单片机在使用时,有时需要模拟I2C总线,                      */
/*   这里举出一个实例(读写串行EEPROM芯片at2402)                       */
/************************************************************************/
/* Name:AT24C02存储器的读写程序,用到I2C总线,含相对独立的I2C总线读写函数 */
/* Language: C51单片机编程语言                                          */
/* Platform: Win98,Intel Celeron 433 Processor,伟福仿真器,仿真8751     */
/* Author:  StephenZhu    javasdk@163.com                               */
/* Date: 2003年5月21日,5月22日,5月29日                                  */
/* Version: 1.1.1                            */
/* Others: None                                                         */
/************************************************************************/

//#include<string.h>
//#include<reg52.h>
//#include<intrins.h>

#include "utiltypedef.h"
#include "va4010reg.h"
#include "common.h"

#include "hali2c.h"


//bit F0;

/********** Function Definition 函数定义 ************/
#define DELAY(x)    DelayUs(x)
#if (E2PROM_TYPE	!= E2PROM_NONE)

//Chose two gpio pin as SCL, SDA according PCB connection
//From master's point of view
//SCL: Output, SDA: Bidirection, Master should give up SDA when not use.
#if (BOARD_ID == EVB_V1)
sbit SCL=P1^7;/*假设由P1.7和P1.6控制*/
sbit SDA=P1^6;

#define SCL_OUTPUT()			(P1_DDR|=0X80)
#define SDA_OUTPUT()                 (P1_DDR|=0x40)
#define SDA_INPUT()                    (P1_DDR&=0xbf)
#elif(BOARD_ID == HZ_111)
sbit SCL=P2^6;
sbit SDA=P2^7;

#define SCL_OUTPUT()			(P2_DDR|=0x40)
#define SDA_OUTPUT()                 (P2_DDR|=0X80)
#define SDA_INPUT()                    (P2_DDR&=0x7f)
#elif(BOARD_ID == HX_001)
sbit SCL=P2^6;
sbit SDA=P2^7;

#define SCL_OUTPUT()			(P2_DDR|=0x40)
#define SDA_OUTPUT()                 (P2_DDR|=0X80)
#define SDA_INPUT()                    (P2_DDR&=0x7f)

#endif

void I2C_Start(void)
{
    /*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/
    //Set SDA Direction	
    SCL_OUTPUT();
    SDA_OUTPUT();	  
    SDA=1;
    SCL=1;
    DELAY(DELAY_TIME);
    SDA=0;
    DELAY(DELAY_TIME);
    SCL=0;
    DELAY(DELAY_TIME);
}

void I2C_Stop(void)
{
    /*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/
    SDA_OUTPUT();
    SCL_OUTPUT();	

    SDA=0;
    SCL=1;
    DELAY(DELAY_TIME);
    SDA=1;
    DELAY(DELAY_TIME);
    SCL=0;
    DELAY(DELAY_TIME);
}

void SEND_0(void)   /* SEND ACK */
{
    /*发送0,在SCL为高电平时使SDA信号为低*/
    SDA_OUTPUT();	
    SCL_OUTPUT();
	
    SDA=0;
    //DELAY(DELAY_TIME);	
    SCL=1;
    DELAY(DELAY_TIME);
    SCL=0;
    DELAY(DELAY_TIME);
}

void SEND_1(void)
{
    /*发送1,在SCL为高电平时使SDA信号为高*/
    SDA_OUTPUT();	
    SCL_OUTPUT()	;
	
    SDA=1;
    //DELAY(DELAY_TIME);		
    SCL=1;
    DELAY(DELAY_TIME);
    SCL=0;
    DELAY(DELAY_TIME);
}

#if 0
BYTE Check_Acknowledge(void)
{
	bit tmp;	

	SDA_INPUT();
	SCL_OUTPUT();
	
	/*发送完一个字节后检验设备的应答信号*/
	SCL=1; // the ninth cycle, check SDA
	DELAY(DELAY_TIME/2);
	tmp = SDA; //get response from slave device
	DELAY(DELAY_TIME/2);
	SCL=0;
	DELAY(DELAY_TIME);

	//if(tmp==1)
	//	  return FALSE;
	//return TRUE;
	return (tmp==1)?I2C_NAK:I2C_ACK;
}
#else
void Check_Acknowledge(void)
{
	//bit tmp;	
	
	SDA_INPUT();
	SCL_OUTPUT();
	
	/*发送完一个字节后检验设备的应答信号*/
	SCL=1; // the ninth cycle, check SDA
	DELAY(DELAY_TIME/2);
	//tmp = SDA; //get response from slave device
	DELAY(DELAY_TIME/2);
	SCL=0;
	DELAY(DELAY_TIME);

	//return (tmp==1)?I2C_NAK:I2C_ACK;
	return;
}

#endif

//why reentrant
void WriteI2CByte(BYTE b)//reentrant
{
    /*向I2C总线写一个字节*/
    BYTE i;
    //SDA_OUTPUT();	  	
    for(i=0;i<8;i++)
        if((b<<i)&0x80)
            SEND_1();
        else
            SEND_0();
}



BYTE ReadI2CByte(void)//reentrant
{
    /*从I2C总线读一个字节*/
    BYTE b=0;
    BYTE i;

    SDA_INPUT(); 	
    SCL_OUTPUT();	
    //Here master should generate 8 cycle on SCL	
    for(i=0;i<8;i++)
    {
        SCL=1;    /*接受数据*/
        DELAY(DELAY_TIME/2);
        //F0=SDA;  //Receive data from device
        if(SDA==1){
            b=b<<1;
            b=b|0x01;
        }else
            b=b<<1;
        DELAY(DELAY_TIME/2);
        SCL=0;
	 DELAY(DELAY_TIME);	
    }
    return b;
}

#endif


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -