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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? i2c.c

?? I2C library for LPC21xx processor
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*
  i2c support for LPC21XX

  (c) 2004  Yuri Tiomkin (yuri@tnkernel.com)


  Includes drivers:

   - EEPROM 24XX series (from 24XX04 to 24XX512)
   - Real Time Clock DS1307
   - I/O Extender PCA9555
   - Temperature sensor LM75

  Supports uCOS-II and TNKernel

THIS SOFTWARE IS PROVIDED BY THE YURI TIOMKIN AND CONTRIBUTORS ``AS IS'' AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL YURI TIOMKIN OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.

*/

#define __UCOS_          1  //-- if uCOS-II is used
//#define __TNKERNEL_    1    //-- if TNKernel is used

#include "LPC21XX.h"
#include "i2c.h"

#if defined(__UCOS_)
#include ".\\os\\includes.h"
#elif defined(__TNKERNEL_)
#include "..\\os\\tn.h"
#include "..\\os\\tn_port.h"
#endif

#ifndef NULL
#define NULL 0
#endif

#if defined(__UCOS_)
extern OS_EVENT  * gpSemI2Cop;
#elif defined(__TNKERNEL_)
extern TN_SEM  gSemI2Cop;
#endif


//===========================================================================
//================ Common routines ==========================================
//===========================================================================
void i2c_lpc_init(int Mode)
{
   if(Mode == I2C_SPEED_400)
   {
  //--- I2C Timing for 58 MHz (t = 16.954 ns) ---
      rI2C_I2SCLH = 47;  //-- more then 0.6 us  - 0.8
      rI2C_I2SCLL = 93;  //-- more then 1.3 us  - 1.4
   }
   else //Slow
   {
      rI2C_I2SCLH = 47*4;
      rI2C_I2SCLL = 93*4;
   }

   rI2C_I2CONCLR = 0xFF;           //-- Clear all flags
   rI2C_I2CONSET = 0x40;           //-- Set Master Mode
   rI2C_I2CONSET |= I2C_FLAG_I2EN; //--- Enable I2C
}

//---------------------------------------------------------------------------
static void i2c_lpc_wr_byte(int byte)
{
   rI2C_I2DAT = byte;
   rI2C_I2CONCLR = I2C_FLAG_SI;                //-- Clear SI
   while(!(rI2C_I2CONSET & I2C_FLAG_SI));      //-- End wr POINT
}

//---------------------------------------------------------------------------
static void i2c_lpc_stop()
{
    //-- Set STOP condition
   rI2C_I2CONCLR = I2C_FLAG_SI;                  //-- Clear SI
   rI2C_I2CONSET |=  I2C_FLAG_AA | I2C_FLAG_STO; //-- Clear NO ASK
}

//---------------------------------------------------------------------------
static int i2c_lpc_ctrl(int ctrl)
{
   int chk;
   //-- Set START
   rI2C_I2CONCLR = 0xFF; // Clear all bits
   rI2C_I2CONSET |= I2C_FLAG_I2EN | I2C_FLAG_STA;
   while(!(rI2C_I2CONSET & I2C_FLAG_SI));      //--- End START
   //-- Set ADDRESS
   rI2C_I2DAT = ctrl;
   rI2C_I2CONCLR = I2C_FLAG_STA | I2C_FLAG_SI; //-- Clear START & SI
   if(ctrl & 1) //-- RD
      chk = 0x40; //-- 40H - SLA+R has been transmitted; ACK has been received
   else
      chk = 0x18; //-- 18H - SLA+W has been transmitted; ACK has been received
   while(!(rI2C_I2CONSET & I2C_FLAG_SI));      //-- End CTRL
   if(rI2C_I2STAT != chk)
   {
      i2c_lpc_stop();
      return I2C_ERR_NO_RESPONSE;
   }
   return I2C_NO_ERR;
}

//---------------------------------------------------------------------------
static int i2c_lpc_rx_to_buf(char * buf,int num)
{
   int rc;

   if(buf == NULL)
      return I2C_ERR_WRONG_PARAM;

   rc = num;
   if(rc > 1)
   {
      rI2C_I2CONCLR = I2C_FLAG_SI;
      rI2C_I2CONSET |= I2C_FLAG_AA;
      for(;;)
      {
         while(!(rI2C_I2CONSET & I2C_FLAG_SI));  //-- End Data from slave;
         *buf++ = (unsigned char)rI2C_I2DAT;
         rc--;
         if(rc <= 0)
            break;
         else if(rc == 1)
            rI2C_I2CONCLR = I2C_FLAG_AA | I2C_FLAG_SI;  //-- After next will NO ASK
         else
         {
            rI2C_I2CONCLR = I2C_FLAG_SI;
            rI2C_I2CONSET |= I2C_FLAG_AA;
         }
      }
   }
   else if(rc == 1)
   {
      rI2C_I2CONCLR = I2C_FLAG_AA | I2C_FLAG_SI;  //-- After next will NO ASK
      while(!(rI2C_I2CONSET & I2C_FLAG_SI));  //-- End Data from slave;
      *buf = (unsigned char)rI2C_I2DAT;
   }
   else //err
      return I2C_ERR_WRONG_PARAM;

   return I2C_NO_ERR;
}
//----------------------------------------------------------------------
static int i2c_lpc_ask_polling_op(int ctrl)  //-- wait until write finished
{
   int rc;
   int i;

#if defined(__UCOS_)
   for(i=0;i < 15; i++)
#elif defined(__TNKERNEL_)
   for(i=0;i < 15; i++)
#else
   for(i=0;i < I2C_WR_24XX_TIMEOUT; i++) //-- actually wr = ~110 but timeout =10000
#endif
   {
      rI2C_I2CONSET = I2C_FLAG_STA;
      rI2C_I2CONCLR = I2C_FLAG_SI;  //-- Here - clear only SI (not all rI2C_I2CONCLR)
      while(!(rI2C_I2CONSET & I2C_FLAG_SI));        //wait the ACK

      rI2C_I2DAT = ctrl & 0xFE;; // R/WI = 0
      rI2C_I2CONCLR = I2C_FLAG_SI | I2C_FLAG_STA; //-- Clear START & SI
      while(!(rI2C_I2CONSET & I2C_FLAG_SI));//wait the ACK
      rc = rI2C_I2STAT;
      if(rc == 0x18) //-- got ACK after CLA + W
         break;
      else
      {
#if defined(__UCOS_)
         OSTimeDly(2);      //-- 2 mS
#elif defined(__TNKERNEL_)
         tn_task_sleep(2);  //-- 2 mS
#endif
      }
   }
   if(i == I2C_WR_24XX_TIMEOUT)
      return I2C_ERR_24XX_WR_TIMEOUT;
   return I2C_NO_ERR;
}
//===========================================================================
//================ EEPROM 24XX series ========================================
//===========================================================================

//----------------------------------------------------------------------------
static int m24xx_page_size(int eeprom_type, int eeprom_addr,int * pg_sz)
{
   int page_size,rc;

   page_size = 0;
   rc = I2C_NO_ERR;
   switch(eeprom_type)
   {
      case EEPROM_24XX04:
         if(eeprom_addr > EEPROM_MAX_ADDR_24XX04)
            rc = I2C_ERR_24XX_BAD_ADDR;
         else
            page_size = 16; // 24LC04B have page size = 16,24C04A = 8
         break;
      case EEPROM_24XX08:
         if(eeprom_addr > EEPROM_MAX_ADDR_24XX08)
            rc = I2C_ERR_24XX_BAD_ADDR;
         else
            page_size = 16;
         break;
      case EEPROM_24XX16:
         if(eeprom_addr > EEPROM_MAX_ADDR_24XX16)
            rc = I2C_ERR_24XX_BAD_ADDR;
         else
            page_size = 16;
         break;
      case EEPROM_24XX32:
         if(eeprom_addr > EEPROM_MAX_ADDR_24XX32)
            rc = I2C_ERR_24XX_BAD_ADDR;
         else
            page_size = 32;
         break;
      case EEPROM_24XX64:
         if(eeprom_addr > EEPROM_MAX_ADDR_24XX64)
            rc = I2C_ERR_24XX_BAD_ADDR;
         else
            page_size = 32;
         break;
      case EEPROM_24XX128:
         if(eeprom_addr > EEPROM_MAX_ADDR_24XX128)
            rc = I2C_ERR_24XX_BAD_ADDR;
         else
            page_size = 64;
         break;
      case EEPROM_24XX256:
         if(eeprom_addr > EEPROM_MAX_ADDR_24XX256)
            rc = I2C_ERR_24XX_BAD_ADDR;
         else
            page_size = 64;
         break;
      case EEPROM_24XX512:
         if(eeprom_addr > EEPROM_MAX_ADDR_24XX512)
            rc = I2C_ERR_24XX_BAD_ADDR;
         else
            page_size = 128;
         break;
   }
   if(rc != I2C_NO_ERR)
      return rc;
   if(page_size == 0)  //-- Bad eeprom_type
      return I2C_ERR_24XX_BAD_TYPE;

   if(pg_sz)
      *pg_sz = page_size;
   return I2C_NO_ERR;
}
//----------------------------------------------------------------------------
static int m24xx_set_addr(
    int eeprom_type,     //-- EEPROM type
    int eeprom_addr,     //-- start eeprom addr ( not included Hardware A2,A1,A0)
    int eeprom_cs_val,   //-- Hardware A2,A1,A0 (valid from 24XX32)
    int * ctrl_val,      //-- Value of ctrl(return)
    int * addr_hi_val,   //-- Value of addr_hi(return)
    int * addr_lo_val)   //-- Value of addr_lo(return)
{
   int ctrl;
   int addr_hi;
   int addr_lo;
   int rc;

   rc = I2C_NO_ERR;
   ctrl = 0;
   addr_hi = 0;
   addr_lo = 0;

   switch(eeprom_type)
   {
      case EEPROM_24XX04:   // 24LC04B ignore AO,A1,A2 pins


         ctrl = (eeprom_addr>>7) & 0x02; //-- 00000010
         ctrl |= 0xA0; //-- 1010xxxx
         addr_hi = eeprom_addr & 0xFF;
         addr_lo = -1;
         break;

      case EEPROM_24XX08: // 24LC08B ignore AO,A1,A2 pins

         ctrl = (eeprom_addr>>7) & 0x06; //-- 00000110
         ctrl |= 0xA0; //-- 1010xxxx
         addr_hi = eeprom_addr & 0xFF;
         addr_lo = -1;
         break;

      case EEPROM_24XX16: // 24LC16B ignore AO,A1,A2 pins

         ctrl = (eeprom_addr>>7) & 0x07; //-- 00001110
         ctrl |= 0xA0; //-- 1010xxxx
         addr_hi = eeprom_addr & 0xFF;
         addr_lo = -1;
         break;

      case EEPROM_24XX32:

         ctrl = (eeprom_cs_val<<1) & 0x07; //-- 00001110
         ctrl |= 0xA0; //-- 1010xxxx
         addr_hi = (eeprom_addr>>8) & 0x0F;
         addr_lo = eeprom_addr & 0xFF;
         break;

      case EEPROM_24XX64:

         ctrl = (eeprom_cs_val<<1) & 0x07; //-- 00001110
         ctrl |= 0xA0; //-- 1010xxxx
         addr_hi = (eeprom_addr>>8) & 0x1F;
         addr_lo = eeprom_addr & 0xFF;
         break;

      case EEPROM_24XX128:

         ctrl = (eeprom_cs_val<<1) & 0x07; //-- 00001110
         ctrl |= 0xA0; //-- 1010xxxx
         addr_hi = (eeprom_addr>>8) & 0x3F;
         addr_lo = eeprom_addr & 0xFF;
         break;

      case EEPROM_24XX256:

         ctrl = (eeprom_cs_val<<1) & 0x07; //-- 00001110
         ctrl |= 0xA0; //-- 1010xxxx
         addr_hi = (eeprom_addr>>8) & 0x7F;
         addr_lo = eeprom_addr & 0xFF;
         break;

      case EEPROM_24XX512:

         ctrl = (eeprom_cs_val<<1) & 0x07; //-- 00001110
         ctrl |= 0xA0; //-- 1010xxxx
         addr_hi = (eeprom_addr>>8) & 0xFF;
         addr_lo = eeprom_addr & 0xFF;
         break;
   }
   if(rc != I2C_NO_ERR)
      return rc;
   if(ctrl == 0)
      return I2C_ERR_24XX_BAD_TYPE;

   if(ctrl_val)
      *ctrl_val = ctrl;
   if(addr_hi_val)
      *addr_hi_val = addr_hi;
   if(addr_lo_val)
      *addr_lo_val = addr_lo;

   return I2C_NO_ERR;
}

//----------------------------------------------------------------------------
static int i2c_lpc_m24xx_wr(
     int eeprom_type,    //-- EEPROM type
     int eeprom_addr,    //-- start eeprom addr ( not included Hardware A2,A1,A0)
     int eeprom_cs_val,  //-- Hardware A2,A1,A0 (valid from 24XX32)
     char * buf,         //-- Data srs buf
     int num )            //-- Bytes to write qty
{
   int rc;
   int ctrl;
   int addr_hi;
   int addr_lo;

   rc = m24xx_set_addr(eeprom_type,eeprom_addr,eeprom_cs_val,

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本韩国欧美三级| 麻豆极品一区二区三区| 欧美午夜精品一区| 91在线免费视频观看| 国产激情一区二区三区四区| 日本视频在线一区| 亚洲一本大道在线| 一区二区成人在线| 亚洲国产精品久久久久婷婷884| 国产在线观看一区二区| 国产一区二区三区综合| 欧美主播一区二区三区| 欧美日本国产一区| 日韩视频在线观看一区二区| 欧美日韩国产在线播放网站| 欧美激情一区二区三区在线| 日本一区二区视频在线| 国产精品国模大尺度视频| 国产精品久99| 国产一区二区三区高清播放| 日韩三级视频在线观看| 天天综合网 天天综合色| 久久精品99国产精品日本| 国产一区二区伦理片| 91精品国产91综合久久蜜臀| 日韩美女视频在线| 国产精品久久99| 成人精品视频网站| 欧美性生活久久| 一区二区三区中文在线观看| 色婷婷亚洲综合| 日韩欧美色综合网站| 五月激情综合婷婷| 日韩一区二区在线观看视频播放| 亚洲123区在线观看| 国产福利电影一区二区三区| 日韩一区二区三区在线视频| 美女脱光内衣内裤视频久久网站| 日韩亚洲欧美成人一区| 免费欧美日韩国产三级电影| 99这里只有久久精品视频| 欧美精品免费视频| 中文字幕在线不卡| 免费一区二区视频| 精品国产91亚洲一区二区三区婷婷| 国产视频在线观看一区二区三区 | 91精品国产综合久久香蕉麻豆| 欧美sm极限捆绑bd| 一区二区三区成人在线视频 | 国产精品自在欧美一区| 欧美在线一区二区三区| 亚洲最新视频在线观看| 欧美一区二区三区婷婷月色| 精品在线观看免费| 日韩午夜三级在线| 国产精品一级在线| 亚洲在线视频网站| 91在线小视频| 强制捆绑调教一区二区| 久久久久97国产精华液好用吗| 日本欧美久久久久免费播放网| 欧美成人一区二区三区片免费 | 国产精品网曝门| 国产一区二区影院| 亚洲日本青草视频在线怡红院| 国产成a人无v码亚洲福利| 91精品国产91久久久久久一区二区| 麻豆国产欧美一区二区三区| 亚洲欧洲www| 91精品国产欧美一区二区18| 成人永久aaa| 日韩精品午夜视频| 欧美蜜桃一区二区三区| 国产成人精品www牛牛影视| 一区二区三区不卡视频| 久久色.com| 国产成人精品一区二区三区网站观看| 亚洲最新视频在线观看| 久久久精品天堂| 在线播放一区二区三区| 成人av在线一区二区三区| 欧美国产激情一区二区三区蜜月| 在线观看亚洲一区| 成人深夜在线观看| 加勒比av一区二区| 日韩成人一区二区三区在线观看| 国产精品理论在线观看| 久久久天堂av| 日韩欧美国产综合| 欧美精品亚洲一区二区在线播放| 国产成人精品综合在线观看| 青娱乐精品视频| 亚洲成人免费视| 亚洲在线观看免费| 自拍偷自拍亚洲精品播放| 久久久精品影视| 亚洲精品一区二区三区四区高清 | 国产精品麻豆网站| 久久免费国产精品| 欧美哺乳videos| 欧美一区二区三区在线| 欧美日韩国产综合视频在线观看| 91香蕉视频污在线| 日韩国产成人精品| 亚洲综合图片区| 亚洲精品国产一区二区精华液 | 大美女一区二区三区| 国产麻豆精品视频| 老司机免费视频一区二区三区| 日本中文在线一区| 亚洲v日本v欧美v久久精品| 亚洲欧美日韩久久精品| 日韩欧美国产精品| 日韩一二三四区| 日韩亚洲欧美综合| 日韩精品影音先锋| 精品免费国产一区二区三区四区| 3d动漫精品啪啪1区2区免费| 欧美日韩一级片网站| 国产麻豆午夜三级精品| 九九精品视频在线看| 国产一区欧美一区| 成人夜色视频网站在线观看| 国产成人av资源| 99视频精品免费视频| 91在线免费看| 欧美日韩二区三区| 日韩一区二区视频| 国产亚洲精品中文字幕| 亚洲欧美综合在线精品| 亚洲一卡二卡三卡四卡五卡| 亚洲精品久久7777| 麻豆精品在线播放| 成人一区二区三区在线观看| 色菇凉天天综合网| 在线不卡一区二区| 久久久99久久精品欧美| 中文字幕国产一区二区| 一区二区三区免费| 久久精品免费观看| 99视频精品免费视频| 欧美精品九九99久久| 欧美不卡激情三级在线观看| 国产精品福利一区| 日韩高清不卡一区二区| 国产乱子伦视频一区二区三区| 色综合久久久网| 日韩欧美国产一区在线观看| 中文字幕亚洲欧美在线不卡| 亚洲电影视频在线| 国产高清在线观看免费不卡| 色美美综合视频| 精品福利在线导航| 亚洲一区二区三区四区在线| 国产美女在线精品| 欧美性受极品xxxx喷水| 国产午夜精品一区二区三区视频 | 久久久久久97三级| 亚洲一区二区三区在线看| 国产一区999| 91精品中文字幕一区二区三区| 中文字幕的久久| 丝袜美腿亚洲一区| 色综合久久久久综合| 精品国精品国产尤物美女| 亚洲免费观看高清完整版在线观看熊| 免费一级欧美片在线观看| 97精品久久久午夜一区二区三区 | 亚洲高清在线精品| 粉嫩av一区二区三区| 91精品国产综合久久香蕉麻豆| 日韩一区在线看| 国产一区二区三区综合| 91精品在线免费| 亚洲一区二区精品久久av| 岛国一区二区三区| 久久久亚洲精品一区二区三区| 亚洲成va人在线观看| 一本到不卡免费一区二区| 中文字幕欧美国产| 国产.欧美.日韩| 久久先锋影音av| 捆绑变态av一区二区三区| 欧美三区在线视频| 亚洲午夜一区二区| 色哟哟在线观看一区二区三区| 国产欧美视频一区二区| 久久精品国产一区二区| 欧美一区二区三区四区久久| 亚洲影视在线播放| 在线国产电影不卡| 亚洲一区在线观看免费观看电影高清| 成人性生交大片免费看中文| 国产色爱av资源综合区| 高清日韩电视剧大全免费| 欧美经典三级视频一区二区三区| 国产又黄又大久久| 国产精品入口麻豆原神| 9色porny自拍视频一区二区| 国产精品国产三级国产有无不卡|