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

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

?? i2c1_drv.c

?? nxp lpc177x/8x lcd keil&iar 例程
?? C
字號:
/*************************************************************************
 *
*    Used with ICCARM and AARM.
 *
 *    (c) Copyright IAR Systems 2007
 *
 *    File name   : i2c1_drv.c
 *    Description : I2C1 driver
 *
 *    History :
 *    1. Date        : 13, February 2008
 *       Author      : Stanimir Bonev
 *       Description : Create
 *
 *
 *    $Revision: 22899 $
 *
 *    @Modify: NXP MCU Application Team - NguyenCao
 *    @Date: 04. March. 2011
 **************************************************************************/
#include "i2c1_drv.h"
#include "board.h"
#include "lpc177x_8x_clkpwr.h"
#include "lpc177x_8x_pinsel.h"

volatile int	  I2CState;
LPC_I2C_Msg_t	  I2CMsg;

/*************************************************************************
 * Function Name: I2C_EnableI2C
 * Parameters: void
 * Return: void
 * Description: Enable I2C device.
 *************************************************************************/
#pragma inline
void I2C_EnableI2C(void)
{
  LPC_I2C1->CONSET |= I2CON_I2EN;
}

/*************************************************************************
 * Function Name: I2C_DisableI2C
 * Parameters: void
 * Return: void
 * Description: Disable I2C device.
 *************************************************************************/
#pragma inline
void I2C_DisableI2C(void)
{
  LPC_I2C1->CONCLR = I2CON_I2ENC;
}

/*************************************************************************
 * Function Name: __I2C_SetFlag
 * Parameters: int FlagType -- AA, INT and START and STOP
 *
 * Return: void
 * Description: Set the flag.
 *
 *************************************************************************/
#pragma inline
void __I2C_SetFlag (int FlagType)
{
  LPC_I2C1->CONSET |= FlagType;
}

/*************************************************************************
 * Function Name: __I2C_ClearFlag
 * Parameters: int FlagType -- AA, INT and START (Excl. STOP)
 *
 * Return: void
 * Description: Clear the flag.
 *
 *************************************************************************/
#pragma inline
void __I2C_ClearFlag (int FlagType)
{
  LPC_I2C1->CONCLR = FlagType;
}

/*************************************************************************
 * Function Name: __I2C_SendData
 * Parameters: unsigned char data
 * Return: void
 * Description: Load data to I2CDAT. Just used in I2C module.
 *************************************************************************/
#pragma inline
void __I2C_SendData(unsigned char data)
{
  LPC_I2C1->DAT = data;
}

/*************************************************************************
 * Function Name: __I2C_ReceiveData
 * Parameters: void
 * Return: unsigned char
 * Description: Load data from I2CDAT. Just used in I2C module.
 *************************************************************************/
#pragma inline
unsigned char __I2C_ReceiveData(void)
{
  return LPC_I2C1->DAT;
}

/*************************************************************************
 * Function Name: I2C_InitMaster
 * Parameters: unsigned long BusSpeed
 *
 * Return: int
 *             	0: success
 *	 non-zero: error number
 * Description: Initialize the current device as I2C bus master.
 *
 *************************************************************************/
int I2C_InitMaster (unsigned long BusSpeed)
{
    uint32_t i2cclk;
    //Enable clock for I2C1
    CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCI2C1, ENABLE);
    if (BusSpeed > I2C_MAXSPEED)
      return 1;
    I2C_DisableI2C();

     i2cclk = CLKPWR_GetCLK(CLKPWR_CLKTYPE_PER);
    // value of I2SCLH and I2SCLL must be different
    LPC_I2C1->SCLH = ((i2cclk / BusSpeed) / 2) + 1;
    LPC_I2C1->SCLL = (i2cclk/ BusSpeed) / 2;

    if (LPC_I2C1->SCLH < 4 || LPC_I2C1->SCLL < 4)
      return 1;

    I2CState = I2C_IDLE;

    LPC_IOCON->P2_14 = 0x32;
    LPC_IOCON->P2_15 = 0x32;

    // Enable I2C
    I2C_EnableI2C();
    __I2C_ClearFlag(I2CON_STAC | I2CON_SIC | I2CON_AAC);

    return 0;
}

/*************************************************************************
 * Function Name: I2C_MasterWrite
 * Parameters:  unsigned char addr -- the slave address which you send message to
 *		unsigned char *pMsg -- the point to the message
 *		unsigned long numMsg -- the byte number of the message
 * Return: int
 *             	0: success
 *       non-zero: error number
 *
 * Description: Transmit messages
 *
 *************************************************************************/
int I2C_MasterWrite (unsigned char addr, unsigned char *pMsg , unsigned long numMsg)
{
  return I2C_Transfer (addr, pMsg , numMsg, WRITE, 0);
}


/*************************************************************************
 * Function Name: I2C_MasterRead
 * Parameters:  unsigned char addr -- the slave address which you send message to
 *		unsigned char *pMsg -- the point to the message
 *		unsigned long numMsg -- the byte number of the message
 * Return: int
 *             	0: success
 *	 non-zero: error number
 *
 * Description: Receive messages
 *
 *************************************************************************/
int I2C_MasterRead (unsigned char addr, unsigned char *pMsg , unsigned long numMsg)
{
  return I2C_Transfer (addr, pMsg , numMsg, READ, 0);
}

/*************************************************************************
 * Function Name: I2C_Transfer
 * Parameters:  unsigned char addr -- the slave address which you send message to
 *		unsigned char *pMsg -- the point to the message
 *		unsigned long numMsg -- the byte number of the message
 *		LPC_I2C_TransMode_t transMode -- Read, Write, Write then read
 *		unsigned long numWrite -- this is only for "Write then read" mode
 *
 * Return: int
 *             	0: success
 *       non-zero: error number
 *
 * Description: Transfer messages
 *
 *************************************************************************/
int I2C_Transfer (unsigned char addr, unsigned char *pMsg , unsigned long numMsg,
	          LPC_I2C_TransMode_t transMode, unsigned long numWrite)
{
unsigned int timeout = DLY_I2C_TIME_OUT;
  if (transMode == WRITETHENREAD)
  {
    if (numWrite >= numMsg)
      return 1;
    else
      I2CMsg.nrWriteBytes = numWrite;
  }
  else
    I2CMsg.nrWriteBytes = 0;

	I2CMsg.buf       = pMsg;
  I2CMsg.nrBytes   = numMsg;
  I2CMsg.address   = addr;
  I2CMsg.transMode = transMode;
  I2CMsg.dataCount = 0;

  __I2C_SetFlag(I2CON_STA);

  I2CState = I2C_BUSY;

  while(I2CState == I2C_BUSY)
  {
    // Wait the interrupt
    if (LPC_I2C1->CONSET & 0x08)
    {
      I2C_HandleMasterState();    // Master Mode
      timeout = DLY_I2C_TIME_OUT;
    }
    if (timeout-- == 0)
    {
      I2CState = I2C_TIME_OUT;
    }
  }

#ifdef __DEBUG__
  if (I2C_OK != I2CState) {
    printf("I2C error : %d\n",I2CState);
    I2C_InitMaster(I2C_SPEED);
  }
#endif
  __I2C_ClearFlag(I2CON_STAC | I2CON_AAC);

  return I2CState;
}


/*************************************************************************
 * Function Name: I2C_HandleMasterState
 * Parameters: void
 * Return: void
 * Description: Master mode state handler for I2C bus.
 *
 *************************************************************************/
void I2C_HandleMasterState(void)
{
unsigned long I2Cstatus = LPC_I2C1->STAT & 0xF8;

  switch (I2Cstatus)
  {
/* ------- MASTER TRANSMITTER FUNCTIONS ----------- */
  case 0x08 : // start condition transmitted
  case 0x10 : // restart condition transmitted
    if (I2CMsg.transMode == WRITETHENREAD)
    {
      if (I2CMsg.dataCount < I2CMsg.nrWriteBytes)
        __I2C_SendData((I2CMsg.address<<1) | WRITE);
      else
      {
        __I2C_SendData((I2CMsg.address<<1) | READ );
      }
    }
    else
    {
      __I2C_SendData((I2CMsg.address<<1) | I2CMsg.transMode);
    }
    __I2C_ClearFlag(I2CON_STAC);	// STA bit
    break;
  case 0x18 : // SLA+W transmitted and ACK received
    if ( I2CMsg.nrBytes == 0 )
    {
      __I2C_SetFlag  (I2CON_STO);             // STO bit clear automatically
      I2CState = I2C_NO_DATA;
    }
    else
    {
      // Send next data byte
      __I2C_SendData(I2CMsg.buf[I2CMsg.dataCount++]);
    }
    break;
  case 0x20 : // SLA+W transmitted, but no ACK received
    __I2C_SetFlag  (I2CON_STO);
    I2CState = I2C_NACK_ON_ADDRESS;
    break;
  case 0x28 : //Data byte transmitted and ACK received
    if (I2CMsg.transMode == WRITE)
    {
      if (I2CMsg.dataCount < I2CMsg.nrBytes)
      {
        __I2C_SendData (I2CMsg.buf[I2CMsg.dataCount++]);
      }
      else
      {
        __I2C_SetFlag  (I2CON_STO); // data transmit finished, stop transmit
        I2CState = I2C_OK;
      }
    }
    else if (I2CMsg.transMode == WRITETHENREAD)
    {
      if (I2CMsg.dataCount < I2CMsg.nrWriteBytes)
      {
        __I2C_SendData (I2CMsg.buf[I2CMsg.dataCount++]);
      }
      else		// send start condition
      {
        __I2C_SetFlag  (I2CON_STA);
      }
    }
    break;
  case 0x30 : // no ACK for data byte
    __I2C_SetFlag  (I2CON_STO);
    I2CState = I2C_NACK_ON_DATA;
    break;
  case 0x38 : // arbitration lost in Slave Address or Data bytes
    I2CState = I2C_ARBITRATION_LOST;
    break;

/* ------- MASTER RECEIVER FUNCTIONS ----------- */
  case 0x40 : // ACK for slave address + R
    if (I2CMsg.nrBytes>1)
    {
      __I2C_SetFlag  (I2CON_AA );	// send acknowledge byte
    }
    else
    {
      __I2C_ClearFlag(I2CON_AAC); // return NACK
    }
    break;
  case 0x48 : // no ACK for slave address + R
    __I2C_SetFlag  (I2CON_STO);
    I2CState = I2C_NACK_ON_ADDRESS;
    break;
  case 0x50 : // ACK for data byte
    I2CMsg.buf[I2CMsg.dataCount++] = __I2C_ReceiveData();
    if (I2CMsg.dataCount + 1 < I2CMsg.nrBytes)
    {
      __I2C_SetFlag(I2CON_AA );	  // send acknowledge byte
    }
    else
    {
      __I2C_ClearFlag(I2CON_AAC); // return NACK
    }
    break;
  case 0x58 : // no ACK for data byte
    I2CMsg.buf[I2CMsg.dataCount++] = __I2C_ReceiveData();

    __I2C_SetFlag  (I2CON_STO);
    I2CState = I2C_OK;
    break;
  default : // undefined error
    __I2C_SetFlag  (I2CON_STO);
    __I2C_ClearFlag(I2CON_STAC | I2CON_AAC);
    I2CState = I2C_ERROR;
    break;
  } // switch - I2C_I2STAT & 0xF8
  __I2C_ClearFlag(I2CON_SIC);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩精品专区在线影院观看| 国产视频一区在线观看| 欧美成va人片在线观看| 国产日韩精品一区| 日韩av一级片| 在线免费观看视频一区| 久久精品视频一区二区| 日韩av一区二| 欧美视频一区在线| 国产精品久久久久一区二区三区共 | 国产精品国产三级国产a| 久久精品国产久精国产| 欧美三级电影精品| 亚洲色图视频网| 懂色av中文一区二区三区| 日韩一区二区三区在线视频| 亚洲精品视频一区| 不卡视频一二三四| 久久精品亚洲乱码伦伦中文| 精品一区二区成人精品| 欧美喷水一区二区| 一区二区三区日韩在线观看| 99久久久久免费精品国产 | 在线观看不卡视频| 亚洲欧洲99久久| 成人高清免费观看| 国产女人aaa级久久久级| 国模少妇一区二区三区| 日韩丝袜情趣美女图片| 免费不卡在线视频| 日韩一区二区三区视频在线观看| 亚洲不卡在线观看| 欧美久久久久久蜜桃| 精品一区二区久久久| 欧美一区二区三区不卡| 首页欧美精品中文字幕| 制服丝袜日韩国产| 蜜臀久久99精品久久久久宅男 | 精品一区二区三区在线播放 | 国产中文字幕精品| 久久久欧美精品sm网站| 国产一区二区三区四区在线观看| 久久久久久久综合色一本| 国产一区二区三区| 国产日韩精品一区二区三区| 成人精品高清在线| 国产精品成人免费在线| 在线亚洲+欧美+日本专区| 亚洲国产精品综合小说图片区| 欧美在线一区二区三区| 日韩高清中文字幕一区| 精品国产自在久精品国产| 国产一区二区三区观看| 亚洲婷婷综合色高清在线| 色综合久久99| 日本不卡中文字幕| 国产日韩三级在线| 色欧美乱欧美15图片| 日韩国产欧美在线播放| 久久亚洲综合色| 91一区二区三区在线观看| 亚洲国产成人av网| 日韩欧美美女一区二区三区| 国产成人精品免费看| 亚洲精品午夜久久久| 日韩欧美国产一区二区三区| 国产精品18久久久久久久久久久久| 中文字幕一区二区三区四区| 555www色欧美视频| 国产成人免费视频精品含羞草妖精| 亚洲欧美影音先锋| 日韩一区二区三区免费看 | 一本久久a久久免费精品不卡| 亚洲成年人网站在线观看| 久久久99免费| 91久久香蕉国产日韩欧美9色| 日本不卡免费在线视频| 国产精品久久久久久久久久久免费看| 欧美视频完全免费看| 国产麻豆欧美日韩一区| 一区二区欧美视频| 国产午夜精品一区二区三区四区| 欧美中文字幕不卡| 成人在线综合网| 热久久免费视频| 亚洲精品日日夜夜| 久久久午夜精品理论片中文字幕| 欧洲亚洲国产日韩| 成人aa视频在线观看| 九九国产精品视频| 午夜激情久久久| 亚洲视频一区二区免费在线观看| 精品欧美一区二区三区精品久久| 91国产视频在线观看| 成人影视亚洲图片在线| 免费成人性网站| 亚洲午夜久久久久久久久久久| 亚洲国产精品成人久久综合一区| 欧美一区二区三级| 欧美日韩久久久一区| 91小视频免费观看| 成人小视频在线| 国产毛片一区二区| 激情另类小说区图片区视频区| 午夜精品福利久久久| 亚洲国产视频一区| 一区二区三区中文免费| 国产欧美日产一区| 国产欧美va欧美不卡在线| 久久综合中文字幕| 欧美成人video| wwwwxxxxx欧美| 久久老女人爱爱| 久久久精品免费观看| 久久久精品国产免费观看同学| 欧美电视剧免费全集观看| 日韩一区二区三区电影在线观看 | 99精品偷自拍| www.久久久久久久久| av影院午夜一区| 97精品久久久久中文字幕| 成人免费的视频| thepron国产精品| 一本色道亚洲精品aⅴ| 在线观看亚洲精品| 欧美男人的天堂一二区| 91精品国产91久久综合桃花| 日韩亚洲欧美一区二区三区| 日韩精品中文字幕在线一区| 精品国产伦一区二区三区免费| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 中文字幕一区二区在线观看 | 久久天堂av综合合色蜜桃网| 久久久不卡网国产精品二区| 国产精品久久久久久久岛一牛影视 | 成人av免费网站| 91免费小视频| 欧美日韩精品一区二区三区| 日韩一区二区三免费高清| xfplay精品久久| 国产精品伦理一区二区| 亚洲一区二区中文在线| 免费三级欧美电影| 成人亚洲精品久久久久软件| 日本韩国一区二区| 欧美一区二区三区成人| 久久久综合精品| 一区二区在线观看视频| 免费观看在线色综合| 波多野结衣欧美| 91精品黄色片免费大全| 国产亚洲一本大道中文在线| 亚洲欧美激情小说另类| 麻豆一区二区在线| 成人黄色免费短视频| 欧美三级乱人伦电影| 久久久不卡网国产精品一区| 亚洲亚洲人成综合网络| 国产乱色国产精品免费视频| 在线欧美日韩精品| 国产三级精品三级| 午夜欧美视频在线观看| 高清久久久久久| 91精品国产综合久久精品app| 中文字幕免费一区| 免费高清在线视频一区·| 97se亚洲国产综合自在线观| 日韩欧美一级二级三级| 亚洲精品乱码久久久久久| 国产精品中文欧美| 欧美一区二区在线观看| 亚洲人123区| 国产精品亚洲一区二区三区妖精| 欧美日韩国产乱码电影| 中文字幕欧美一| 国产成人精品一区二区三区四区| 91精品国产一区二区三区蜜臀 | 国产亚洲欧美一级| 日韩精品一级二级 | 国产成人8x视频一区二区| 91精品国产入口| 亚洲自拍偷拍综合| 91在线视频播放地址| 久久久久成人黄色影片| 免费观看在线综合| 欧美高清精品3d| 亚洲国产成人va在线观看天堂| 99国产精品国产精品久久| 精品对白一区国产伦| 美女www一区二区| 欧美一区二区三区性视频| 亚洲一线二线三线视频| 色婷婷香蕉在线一区二区| 中文字幕在线免费不卡| 成人免费视频视频| 欧美国产亚洲另类动漫| 国产成人精品三级| 亚洲国产精品av| 成人丝袜高跟foot| 国产精品免费网站在线观看|