亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? i2c.c

?? qprox公司的芯片qt60xx0的驅動程序
?? C
字號:
/*============================================================================
    Project     QT60xx0 Example Code
    File        i2c.c
    Function    Driver code for QT60xx0 via I2C interface
    Requires    Silicon Labs C8051F310 target
    Originated	D Spokes

	Description	This driver bit-bangs the I2C master function.
				Port 0, bit 7 provides the SCL signal
				Port 0, bit 6 provides the SDA signal.
				Interface to the driver comprises three functions:
				  InitI2c() configures the processor I/O and initialises the driver variables
				  I2cWrite() executes a multi-byte write transfer to a slave
				  I2cRead() executes a multi-byte read transfer from a slave    
				All three functions return a single byte indicating driver status

    (c) Quantum Research Group
============================================================================*/
#include "C8051F310.H"
#include "common.h"
#include "i2c.h"

/* Ports */
sbit SCL		= P0 ^ 7;
sbit SDA		= P0 ^ 6;
sbit CHECK		= P1 ^ 0;

/* ------------ DEFINES --------------- */
/* I2c read/write flags */
#define I2C_WRITE_FLAG	0x00	/* bit 0 of slave-addres byte */
#define I2C_READ_FLAG	0x01

/* bus logic levels */
#define LO 	0
#define HI	1

/* Delay constants */
#define _5US	8

/* Retry times on NACK */
#define NACK_RETRY_MAX	5

/* ------------ LOCAL DATA ------------ */
xdata UINT8 I2cStatus;
xdata UINT8 RxBit;
xdata UINT8 RxByte;

/* ---------- MODULE FUNCTIONS  ------- */
void Delay ( UINT8 Time );
UINT8 SetScl( UINT8 State );
UINT8 SetSda( UINT8 State );
void FloatSda( void );
UINT8 I2cStart();
UINT8 I2cStop();
UINT8 I2cTxBit( UINT8 BitVal );
UINT8 I2cRxBit( void );
UINT8 I2cTxByte( UINT8 TxData);
UINT8 I2cRxByte( UINT8 AckState );


/*---------------- Function Header -------------------------------------------

	FUNCTION	InitI2c
	PURPOSE		Initialises I2c driver
	INPUT		None
	OUTPUT		I2c status byte indicating the idle-state of the bus
	
----------------------------------------------------------------------------*/
UINT8 InitI2c ( void )
{

	/* configure C8051F310 ports for I2C operation:
		SDA is connected to Port0, bit6
		SCL is connected to Port0, bit7
		both pins function in open-drain mode
	*/
	P0SKIP = 0xc0;
	P0MDOUT &= ~0x30;	/* set SDA and SCL = open-drain */
	
	I2cStatus = 0;		/* initialise driver status */
	
	/* set initial idle state for bus (SDA and SCL = 1) */
	return ( SetSda( HI ) || SetScl( HI ) );

}

/*---------------- Function Header -------------------------------------------

	FUNCTION	Delay
	PURPOSE		Programme delay in the microsecond range -
				Called to meet I2C bus timing requirements

----------------------------------------------------------------------------*/
void Delay ( UINT8 Time )
{
	UINT8 i;

	EA = 0;						/* interrupts disabled during delay */
	for (i = 0; i < Time; i++);
	EA = 1;
}

/*---------------- Function Header -------------------------------------------

	FUNCTION	SetScl
	PURPOSE		Sets I2C SCL line to the required level. Because the bus is a
				wire-OR configuration, it may take some time to establish a
				logic '1' due to slow risetime, clock stretching etc.
				An arbitrary timeout of 250us is allowed.
	INPUT		Required bus state
	OUTPUT		Flag indicating result: 1 = OK, 0 = bus line stuck.
	MODIFIES	I2cStatus
				 
----------------------------------------------------------------------------*/
UINT8 SetScl( UINT8 State )
{
//	UINT16 Timeout = 450;	/* approx 250us */
	UINT16 Timeout = 10000;	/* approx 250us */

	SCL = State;
	while ( (SCL != State) && --Timeout);

	if ( Timeout )
		return true;
	else
	{
		I2cStatus |= I2C_ERROR_SCL_STUCK;
		return false;
	}
}

/*---------------- Function Header -------------------------------------------

	FUNCTION	SetSda
	PURPOSE		Sets I2C SDA line to the required level. Because the bus is a
				wire-OR configuration, it may take some time to establish a
				logic '1' due to slow risetime, clock stretching etc.
				An arbitrary timeout of 250us is allowed.
	INPUT		Required bus state
	OUTPUT		Flag indicating result: 1 = OK, 0 = bus line stuck.
	MODIFIES	I2cStatus
				 
----------------------------------------------------------------------------*/
UINT8 SetSda( UINT8 State )
{
//	UINT16 Timeout = 450;	/* approx 250us */
	UINT16 Timeout = 10000;	/* approx 250us */

	SDA = State;
	while ( (SDA != State) && --Timeout);

	if ( Timeout )
		return true;
	else
	{
		I2cStatus |= I2C_ERROR_SDA_STUCK;
		return false;
	}
}

/*---------------- Function Header -------------------------------------------

	FUNCTION	FloatSda
	PURPOSE		Sets I2C SDA line to 'input mode'.
				Note: this function does not check the line is high because
				a slave may be legitimately driving SDA low.
				 
----------------------------------------------------------------------------*/
void FloatSda( void )
{
	SDA = HI;
}

/*---------------- Function Header -------------------------------------------

	FUNCTION	I2cStart
	PURPOSE		Applies an appropriately timed START condition to the I2c bus.
	OUTPUT		Flag indicating result: 1 = OK, 0 = bus line stuck.
	MODIFIES	I2cStatus
				 
----------------------------------------------------------------------------*/
UINT8 I2cStart()
{
	if ( !SDA )		/* ensure SDA is high */
	{
		if ( !SetSda(HI) )
			return false;
	}

	if ( !SCL )		/* ensure SCL is high */
	{
		if ( !SetScl(HI) )
			return false;
	}

	Delay( _5US );			 /* Philips tSU:STA > 4.7us */

	SetSda(LO);
	Delay( _5US );			 /* Philips tHD:SDA > 4us */
	
	return ( SetScl(LO) );
}

/*---------------- Function Header -------------------------------------------

	FUNCTION	I2cStop
	PURPOSE		Applies an appropriately timed STOP condition to the I2c bus.
	OUTPUT		Flag indicating result: 1 = OK, 0 = bus line stuck.
	MODIFIES	I2cStatus
				 
----------------------------------------------------------------------------*/
UINT8 I2cStop()
{
	SetSda(LO); /* ensure SDA is low */

	if ( !SetScl(HI) )
		return false;
	Delay( _5US );			 /* Philips tSU:STO > 4us */
	
	return ( SetSda(HI) );
}

/*---------------- Function Header -------------------------------------------

	FUNCTION	I2cTxBit
	PURPOSE		Drives the specified data bit to the I2c bus.
	OUTPUT		Flag indicating result: 1 = OK, 0 = bus line stuck.
	MODIFIES	I2cStatus
				 
----------------------------------------------------------------------------*/
UINT8 I2cTxBit( UINT8 BitVal )
{
	if ( !SetSda(BitVal) )
		return false;
	Delay( _5US );			 /* Philips tLOW > 4.7us */

	if ( !SetScl(HI) )
		return false;
	Delay( _5US );			 /* Philips tHIGH > 4us */
	
	return ( SetScl(LO) );
}

/*---------------- Function Header -------------------------------------------

	FUNCTION	I2cRxBit
	PURPOSE		Receives a data bit from the I2c bus.
	OUTPUT		Flag indicating result: 1 = OK, 0 = bus line stuck.
				Data bit is saved to RxBit
	MODIFIES	I2cStatus
				 
----------------------------------------------------------------------------*/
UINT8 I2cRxBit( void )
{
	FloatSda();	/* float SDA - can't check state as slave maybe driving SDA */
	Delay( _5US );			 /* Philips tLOW > 4.7us */

	if ( !SetScl(HI) )
		return false;
	Delay( _5US );			 /* Philips tHIGH > 4us */
	RxBit = SDA;
	return ( SetScl(LO) );
}

/*---------------- Function Header -------------------------------------------

	FUNCTION	I2cTxByte
	PURPOSE		Sequences transmission of a data byte to the I2c bus.
	OUTPUT		Flag indicating result: 1 = slave acknowledged, 0 = no ack/fail.
				Data bit is saved to RxBit
	MODIFIES	I2cStatus: State of ACK bit and error flags
				 
----------------------------------------------------------------------------*/
UINT8 I2cTxByte( UINT8 TxData)
{
	UINT8 i;
	UINT8 t = TxData;

	for (i= 0;i < 8;i++)
	{
		if ( !I2cTxBit( (t & 0x80) ? 1 : 0 ) )
			return false;
		t <<= 1;
	}

	if ( I2cRxBit() )
	{
		if (RxBit)
			I2cStatus |= I2C_ERROR_NO_ACK;
		return ( !RxBit ); /* returns '1' if ACK recieved */ 
	}
	else
		return false;

}

/*---------------- Function Header -------------------------------------------

	FUNCTION	I2cTxByte
	PURPOSE		Sequences reception of a data byte from the I2c bus.
	INPUT		Flag indicating state of ACK bit to be sent to the slave
	OUTPUT		Flag indicating result: 1 = OK, 0 = fail.
				Data byte is saved to RxByte
	MODIFIES	I2cStatus: State of error flags
				 
----------------------------------------------------------------------------*/
UINT8 I2cRxByte( UINT8 AckState )
{
	UINT8 i;
	UINT8 r = 0;

	for (i= 0;i < 8;i++)
	{
		if ( !I2cRxBit() )
			return false;
		r <<= 1;
		r |= RxBit;
	}

	RxByte = r;

	return ( I2cTxBit ( AckState ) );

}

/*---------------- Function Header -------------------------------------------

	FUNCTION	I2cWrite
	PURPOSE		Sequences a write-cycle to a slave device on the I2c bus.
				send START
				send slave-adddress + write flag (check ACK)
				send write pointer (check ACK)
				read data bytes (with NACK at last byte) (check all ACKs)
	INPUT		I2cAddress:    specifies slave device 7-bit address
				DeviceAddress: specifies address pointer within the device
				Data:          Pointer to write-data (byte) array
				ByteCount:     specifies number of bytes to write 
	OUTPUT		I2cStatus byte indicating result of I2c cycle.
	MODIFIES	I2cStatus:     all flags
				 
----------------------------------------------------------------------------*/
UINT8 I2cWrite( UINT8 I2cAddress, UINT8 DeviceAddress, UINT8 *Data, UINT8 ByteCount)
{
	UINT8 i;
	UINT8 *WriteDataPtr;
	
CHECK = 1;
	i = 0;
	
	do {	/* attempt to address device up to NACK_RETRY_MAX times */
	
		I2cStatus = 0;

		if ( I2cStart() )
		{
			if ( !I2cTxByte( (I2cAddress * 2) + I2C_WRITE_FLAG ) ) 
				I2cStop();
		}
	} while ( (I2cStatus != 0) && (++i < NACK_RETRY_MAX) );
CHECK = 0;

	if ( i >= NACK_RETRY_MAX )
		return I2cStatus;
	

	if ( !I2cTxByte( DeviceAddress ) ) 
	{
		I2cStop();
		return I2cStatus;
	}

	WriteDataPtr = Data;
	for ( i = 0; i < ByteCount; i++)
	{
		if ( !I2cTxByte( *WriteDataPtr++ ) ) 
		{
			I2cStop();
			return I2cStatus;
		}
	}

	I2cStop();
	return I2cStatus;
}

/*---------------- Function Header -------------------------------------------

	FUNCTION	I2cRead
	PURPOSE		Sequences a read-cycle to a slave device on the I2c bus:
				send START
				send slave-adddress + write flag (check ACK)
				send read pointer (check ACK)
				send re-START
				send slave-adddress + read flag (check ACK)
				read data bytes (with NACK at last byte)
	INPUT		I2cAddress:    specifies slave device 7-bit address
				DeviceAddress: specifies address pointer within the device
				Data:          Pointer to return-data (byte) array
				ByteCount:     specifies number of bytes to read 
	OUTPUT		I2cStatus byte indicating result of I2c cycle.
	MODIFIES	I2cStatus:     all flags
				 
----------------------------------------------------------------------------*/
UINT8 I2cRead( UINT8 I2cAddress, UINT8 DeviceAddress, UINT8 *Data, UINT8 ByteCount)
{
	UINT8 i;
	UINT8 *ReadDataPtr;
	
	i = 0;
	do {	/* attempt to address device up to NACK_RETRY_MAX times */
	
		I2cStatus = 0;

		if ( I2cStart() )
		{
			if ( !I2cTxByte( (I2cAddress * 2) + I2C_WRITE_FLAG ) ) 
				I2cStop();
		}
	} while ( (I2cStatus != 0) && (++i < NACK_RETRY_MAX) );

	if ( i >= NACK_RETRY_MAX )
		return I2cStatus;


	if ( !I2cTxByte( DeviceAddress ) )
	{
		I2cStop();
		return I2cStatus;
	}

	i = 0;
	do {	/* attempt to address device up to NACK_RETRY_MAX times */
	
		I2cStatus = 0;

		if ( I2cStart() )
		{
			if ( !I2cTxByte( (I2cAddress * 2) + I2C_READ_FLAG ) ) 
				I2cStop();
		}
	} while ( (I2cStatus != 0) && (++i < NACK_RETRY_MAX) );

	if ( i >= NACK_RETRY_MAX )
		return I2cStatus;


	ReadDataPtr = Data;
	for ( i = 0; i < ByteCount; i++)
	{
		if ( I2cRxByte( (i == (ByteCount - 1) ? 1 : 0 ) ) )
			 *ReadDataPtr++ = RxByte;
		else
		{
			I2cStop();
			return I2cStatus;
		}
	}

	I2cStop();
	return I2cStatus;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩一区二区精品| 亚洲精品免费在线播放| 一区二区三区色| 久久精品国产精品亚洲精品| 国产成人免费在线| 在线成人免费观看| 亚洲免费电影在线| 成人免费观看视频| 26uuu另类欧美| 爽好多水快深点欧美视频| www.亚洲色图.com| 久久午夜国产精品| 久久99精品久久久久久国产越南| 欧洲av在线精品| 欧美国产精品久久| 国内久久婷婷综合| 日韩视频一区二区| 日韩av网站免费在线| 色欧美乱欧美15图片| 精品国产自在久精品国产| 日日摸夜夜添夜夜添亚洲女人| 亚洲成人资源在线| 91精品办公室少妇高潮对白| 欧美激情一区二区三区在线| 蜜臀av性久久久久蜜臀av麻豆 | 精品综合久久久久久8888| 一本到不卡精品视频在线观看| 91亚洲资源网| 国产精品成人一区二区艾草| 东方aⅴ免费观看久久av| 久久久久久久综合色一本| 国产专区综合网| 久久久蜜桃精品| 福利视频网站一区二区三区| 国产性天天综合网| 国产精品一二三四区| 国产日产欧产精品推荐色| 国产高清精品久久久久| 亚洲国产精品精华液ab| www.激情成人| 亚洲国产精品久久不卡毛片 | 日韩午夜av电影| 日韩综合一区二区| 日韩一区二区不卡| 国产麻豆一精品一av一免费 | 欧美一卡二卡三卡| 日韩国产在线观看| 久久久久亚洲蜜桃| 91亚洲午夜精品久久久久久| 亚洲美女少妇撒尿| 91精品欧美一区二区三区综合在| 国产精品视频看| 成人18精品视频| 亚洲国产另类精品专区| 欧美一区二区视频免费观看| 狂野欧美性猛交blacked| 久久久一区二区三区| a亚洲天堂av| 性做久久久久久免费观看欧美| 99re热这里只有精品免费视频| 91精品国产综合久久福利| 裸体健美xxxx欧美裸体表演| 国产无遮挡一区二区三区毛片日本| 亚洲电影一区二区三区| 精品毛片乱码1区2区3区| 成人午夜免费电影| 婷婷综合另类小说色区| 亚洲精品在线三区| 色综合久久天天综合网| 日韩国产在线观看一区| 欧美韩日一区二区三区| 91精品久久久久久久91蜜桃 | 国产欧美精品在线观看| 91九色最新地址| 国产麻豆精品theporn| 亚洲精品菠萝久久久久久久| 欧美电影精品一区二区| 在线观看免费一区| 国产不卡在线视频| 日本va欧美va欧美va精品| 中文字幕一区二区在线观看| 91精品国产91综合久久蜜臀| 国产福利一区二区三区| 五月天激情综合| 亚洲色欲色欲www| 久久精品日韩一区二区三区| 欧美日韩一区久久| 91久久精品一区二区三区| 精品制服美女久久| 偷拍自拍另类欧美| 一区二区三区在线不卡| 亚洲国产精品av| 久久伊人中文字幕| 日韩一级免费观看| 欧美日韩国产高清一区二区三区 | 午夜精品久久久久久久99水蜜桃| 91福利国产精品| 国产成人99久久亚洲综合精品| 国产日韩欧美综合一区| 欧美大黄免费观看| 欧美一区二区私人影院日本| 欧美网站一区二区| 欧美在线短视频| 色综合久久久网| 成人18精品视频| 国产精品一区二区在线播放| 久久99精品一区二区三区| 日韩制服丝袜先锋影音| 亚洲.国产.中文慕字在线| 亚洲综合精品自拍| 亚洲第一福利视频在线| 亚洲国产精品久久艾草纯爱| 亚洲尤物在线视频观看| 亚洲444eee在线观看| 亚洲一区影音先锋| 亚洲成人自拍偷拍| 日本大胆欧美人术艺术动态| 丝瓜av网站精品一区二区| 五月天欧美精品| 久久电影网站中文字幕| 狠狠色狠狠色综合日日91app| 国产精品久久久久久久蜜臀| 国产精品乱子久久久久| 中文字幕一区二区三区精华液| 欧美日韩一区二区三区高清| 91国模大尺度私拍在线视频| 色妞www精品视频| 欧美自拍丝袜亚洲| 欧美日韩五月天| 91精品国产色综合久久不卡电影 | 国产欧美视频一区二区三区| 久久久久国产精品厨房| 国产精品卡一卡二| 1024成人网色www| 亚洲国产成人va在线观看天堂| 国产亚洲精品超碰| 国产精品毛片无遮挡高清| 中文字幕五月欧美| 亚洲国产综合人成综合网站| 久久99久久久久| 色综合中文综合网| 精品国产髙清在线看国产毛片| 色天使久久综合网天天| 欧美怡红院视频| 久久久久久综合| 一区二区日韩av| 国产精品资源网站| 色偷偷久久人人79超碰人人澡| 久久国产精品99久久久久久老狼| 亚洲精品成人精品456| 午夜不卡av免费| 成人小视频免费观看| 欧美日韩卡一卡二| 国产精品三级电影| 亚洲福利视频三区| 国产成人午夜精品影院观看视频 | 亚洲精品一线二线三线无人区| 欧美中文字幕一区| 精品国产一区二区三区久久久蜜月 | 狠狠v欧美v日韩v亚洲ⅴ| 国产精品888| 欧美三级韩国三级日本三斤| 久久久777精品电影网影网| 亚洲电影中文字幕在线观看| 国产.精品.日韩.另类.中文.在线.播放 | 激情图片小说一区| 在线视频欧美精品| 国产精品无遮挡| 久久99热99| 欧美二区三区的天堂| 国产精品电影院| 经典三级视频一区| 色婷婷国产精品| 国产精品亲子伦对白| 精品一区二区三区在线观看| 91视频91自| 中文字幕在线视频一区| 国产一区二区91| 欧美一级免费观看| 亚洲午夜精品17c| 99精品视频在线播放观看| 久久久精品国产99久久精品芒果| 国产三区在线成人av| 青青青伊人色综合久久| av中文字幕亚洲| 欧美国产激情一区二区三区蜜月 | 91在线精品一区二区三区| 日韩你懂的电影在线观看| 婷婷综合久久一区二区三区| 91成人国产精品| 成人免费在线视频| 粉嫩欧美一区二区三区高清影视 | 日韩午夜在线观看视频| 一区二区三区不卡视频| 91视频观看视频| 18成人在线观看| 色爱区综合激月婷婷| 最新日韩在线视频| 色综合久久天天| 亚洲图片欧美综合|