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

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

?? i2c.txt

?? 單片機i2c總線描述 keilc51 用c語言實現
?? TXT
字號:

#include "C8051F120.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一区二区三区免费野_久草精品视频
欧美日韩免费观看一区二区三区| www.激情成人| 亚洲影院在线观看| 亚洲精品成人悠悠色影视| 国产精品拍天天在线| 中文一区一区三区高中清不卡| 日韩欧美国产不卡| 久久免费精品国产久精品久久久久| 日韩欧美一区二区久久婷婷| 日韩美女视频一区二区在线观看| 69精品人人人人| 欧美成人一区二区| 久久综合久色欧美综合狠狠| 久久综合久久鬼色| 欧美国产欧美亚州国产日韩mv天天看完整| 国产日韩欧美制服另类| 综合电影一区二区三区| 亚洲最新在线观看| 蜜桃久久精品一区二区| 久久99精品国产| 成人一区二区三区| 欧美日韩电影在线播放| 日韩免费一区二区| 国产精品久久久久久久久搜平片| 亚洲色图欧美偷拍| 日韩电影免费一区| 丰满岳乱妇一区二区三区| 一本久道中文字幕精品亚洲嫩| 欧美私模裸体表演在线观看| 久久综合色婷婷| 亚洲自拍另类综合| 国产精品自拍网站| 欧美性色综合网| 久久综合九色综合欧美98| 综合精品久久久| 精品一区二区综合| 91福利在线观看| 日韩精品一区二区三区视频| 亚洲欧美日韩久久| 精品在线免费视频| 欧美午夜影院一区| 日本一区二区三区免费乱视频| 亚洲国产色一区| k8久久久一区二区三区| 日韩三级视频中文字幕| 亚洲丝袜美腿综合| 国产麻豆午夜三级精品| 欧美日韩一区二区三区四区五区| 久久综合久久久久88| 亚洲第一av色| 99国产精品国产精品久久| 精品国产免费久久| 午夜精品在线视频一区| 92精品国产成人观看免费 | 亚洲男人的天堂一区二区| 日韩精品成人一区二区在线| 91在线播放网址| 久久精品一区二区| 国内一区二区在线| 91精品国产91久久久久久一区二区| 亚洲欧洲精品一区二区精品久久久| 美腿丝袜亚洲一区| 欧美男生操女生| 亚洲成人自拍网| 欧美影院一区二区三区| 亚洲人成在线观看一区二区| 成人黄色a**站在线观看| 久久久噜噜噜久久中文字幕色伊伊 | 国产毛片精品视频| 精品理论电影在线观看| 奇米影视在线99精品| 欧美日韩精品福利| 天堂资源在线中文精品| 欧美日韩日日摸| 日韩精品亚洲专区| 欧美成人a视频| 精品一区二区三区久久久| 精品国产制服丝袜高跟| 国产一区二区导航在线播放| 精品国产乱码久久久久久1区2区| 免费一区二区视频| 久久久久久久久久电影| 成人免费视频视频在线观看免费| 国产欧美精品一区二区色综合朱莉 | 国产日韩精品一区二区浪潮av| 国产一区二区三区国产| 国产人成亚洲第一网站在线播放| 国产毛片一区二区| 亚洲人成网站色在线观看| 欧洲精品在线观看| 日本网站在线观看一区二区三区| 日韩视频免费观看高清完整版| 极品少妇一区二区三区精品视频 | 777精品伊人久久久久大香线蕉| 偷窥少妇高潮呻吟av久久免费| 在线播放中文一区| 黄网站免费久久| 国产精品国产馆在线真实露脸| 色综合天天综合狠狠| 图片区小说区区亚洲影院| 欧美一级片免费看| 成人网在线免费视频| 亚洲综合色成人| 欧美一区二区三区婷婷月色| 国产一区91精品张津瑜| 亚洲少妇屁股交4| 欧美一级视频精品观看| 成人看片黄a免费看在线| 天堂成人国产精品一区| 国产嫩草影院久久久久| 欧美日韩亚洲不卡| 国产不卡在线视频| 五月综合激情婷婷六月色窝| 国产视频在线观看一区二区三区| 欧美色网站导航| 国产·精品毛片| 天堂成人国产精品一区| 中文字幕中文字幕中文字幕亚洲无线| 欧美三级电影一区| 成人av片在线观看| 国产一区二区在线看| 亚洲一二三四在线观看| 国产精品私房写真福利视频| 8v天堂国产在线一区二区| 99精品视频在线播放观看| 国产在线观看免费一区| 日韩中文欧美在线| 亚洲美腿欧美偷拍| 国产亚洲美州欧州综合国| 日韩精品一区二区三区蜜臀| 欧美日韩精品欧美日韩精品| 99久久99久久精品免费观看| 国产精品自拍av| 美女久久久精品| 偷拍亚洲欧洲综合| 天天av天天翘天天综合网| 亚洲伦理在线精品| 亚洲欧美一区二区三区极速播放| 久久一留热品黄| 精品久久国产老人久久综合| 欧美亚洲国产怡红院影院| 91丨九色丨蝌蚪富婆spa| 成人h版在线观看| 国产成人综合精品三级| 国产成人午夜视频| 国产风韵犹存在线视精品| 国产精品一区二区视频| 国产成人综合在线| 成人午夜激情在线| 99国产麻豆精品| 色综合久久综合网97色综合| 色天使色偷偷av一区二区| 91久久免费观看| 欧美日韩专区在线| 欧美一级淫片007| 26uuu亚洲| 久久久久久久综合日本| 欧美激情在线观看视频免费| 国产精品亲子伦对白| 亚洲欧美日韩国产综合在线| 亚洲一区二区视频在线观看| 亚洲国产精品久久久久婷婷884| 午夜影院久久久| 日本美女一区二区三区视频| 极品美女销魂一区二区三区| 久久电影网站中文字幕 | 在线精品视频一区二区三四| 在线亚洲高清视频| 777午夜精品免费视频| 7777女厕盗摄久久久| 久久九九久久九九| 亚洲欧美日本韩国| 舔着乳尖日韩一区| 国产乱码精品一区二区三| av在线这里只有精品| 欧美日韩一区二区在线视频| 日韩免费观看2025年上映的电影| 久久久久久久久99精品| 亚洲精选免费视频| 蜜桃视频一区二区三区| 99久久婷婷国产综合精品| 欧美日韩一区二区在线观看| 久久一区二区视频| 亚洲综合在线电影| 国产精品一区二区果冻传媒| 成人aa视频在线观看| 8x福利精品第一导航| 国产精品福利一区| 日韩成人一级片| 99久久综合99久久综合网站| 91精选在线观看| 亚洲视频一区二区在线| 免费欧美日韩国产三级电影| 91在线精品一区二区| 日韩欧美国产一区二区三区| 亚洲免费观看高清完整版在线 | 国产精品伦一区二区三级视频| 亚洲va韩国va欧美va精品| 国产99久久久久| 日韩欧美aaaaaa|