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