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

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

?? 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,

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品99久久久久久| 成人18精品视频| 7777精品伊人久久久大香线蕉经典版下载 | 亚洲不卡一区二区三区| 一本一道综合狠狠老| 亚洲精品综合在线| 精品婷婷伊人一区三区三| 午夜精品福利在线| 日韩免费成人网| 国产成人在线观看免费网站| 国产女同性恋一区二区| 成av人片一区二区| 亚洲一区二区高清| 91精品国产色综合久久不卡电影 | 免费看欧美女人艹b| 337p粉嫩大胆色噜噜噜噜亚洲| 极品尤物av久久免费看| 国产精品人成在线观看免费 | 色播五月激情综合网| 亚洲v精品v日韩v欧美v专区| 欧美一级二级在线观看| 国产成人夜色高潮福利影视| 日韩毛片视频在线看| 欧美日韩国产一二三| 国产一区在线观看视频| 亚洲视频网在线直播| 欧美伦理视频网站| 国产福利视频一区二区三区| 一区二区三区四区av| 欧美mv和日韩mv国产网站| www.亚洲精品| 蜜臀av性久久久久蜜臀av麻豆| 国产精品久久看| 欧美区在线观看| 国产成人av一区二区三区在线| 一区二区三区在线高清| 日韩精品一区二区三区视频| 99久久国产综合精品色伊| 奇米影视7777精品一区二区| 国产精品视频一区二区三区不卡| 欧美日韩精品一区二区三区蜜桃 | 中文字幕一区视频| 欧美一区二区女人| 99久久伊人久久99| 精品午夜久久福利影院| 亚洲精品ww久久久久久p站| 精品国产乱码久久久久久牛牛| 色一情一乱一乱一91av| 国产精品亚洲第一| 蜜桃久久久久久| 亚洲午夜私人影院| 自拍偷拍亚洲激情| 国产视频一区二区在线| 日韩一区二区三区四区五区六区| 色久综合一二码| 岛国精品在线播放| 国产一区福利在线| 久久99精品网久久| 青青草97国产精品免费观看 | 欧美一级理论片| 色94色欧美sute亚洲线路二| 国产999精品久久| 狠狠久久亚洲欧美| 七七婷婷婷婷精品国产| 亚洲国产视频在线| 亚洲最新视频在线观看| 亚洲欧美日韩国产成人精品影院| 日本一区二区三区四区| 久久久久久久精| 日韩欧美亚洲国产另类 | 欧美一区二区三区人| 在线观看三级视频欧美| 91老师国产黑色丝袜在线| 成人午夜av影视| 成人免费视频免费观看| 成人午夜av电影| 成人国产精品免费观看动漫| 处破女av一区二区| 不卡的av中国片| 97久久精品人人爽人人爽蜜臀| 成人精品一区二区三区四区 | 成人午夜激情视频| 丁香天五香天堂综合| 成人免费视频一区二区| 99久久精品一区| 欧美在线免费观看亚洲| 欧美日韩国产首页| 日韩一区二区免费在线电影| 精品欧美一区二区久久| 337p日本欧洲亚洲大胆色噜噜| 久久久久综合网| 欧美—级在线免费片| **性色生活片久久毛片| 亚洲一区二区在线免费看| 午夜欧美大尺度福利影院在线看| 日韩vs国产vs欧美| 国内成人自拍视频| 不卡的电影网站| 欧美日韩国产一区二区三区地区| 欧美一区二区三区公司| 久久精品一区二区| 亚洲精品菠萝久久久久久久| 午夜国产精品一区| 经典三级视频一区| av不卡免费在线观看| 欧美日韩午夜在线视频| 精品欧美乱码久久久久久1区2区| 中文字幕第一区二区| 亚洲伊人色欲综合网| 久久国产精品99精品国产| caoporm超碰国产精品| 欧美日韩综合在线| 久久久久久综合| 尤物视频一区二区| 国产一区美女在线| 欧美丝袜自拍制服另类| 久久综合九色综合欧美亚洲| 亚洲欧美激情在线| 美女国产一区二区三区| 99久久久精品| 精品国产电影一区二区| 亚洲日本成人在线观看| 久久机这里只有精品| 99精品久久免费看蜜臀剧情介绍| 欧美日韩国产首页| 国产精品久久久久永久免费观看| 日韩精品一二三区| av一区二区久久| 日韩免费性生活视频播放| 中文字幕一区二| 国产精品一区在线| 欧美日本在线播放| 亚洲视频香蕉人妖| 国产成人亚洲精品青草天美| 欧美精品在欧美一区二区少妇| 国产欧美日韩三级| 美女mm1313爽爽久久久蜜臀| 91在线视频播放| 国产校园另类小说区| 日本v片在线高清不卡在线观看| aaa亚洲精品| 国产日韩视频一区二区三区| 日韩精品一级二级| 欧美日韩免费不卡视频一区二区三区 | 97精品久久久久中文字幕 | 久久一留热品黄| 无吗不卡中文字幕| 91官网在线观看| 国产精品毛片无遮挡高清| 国模大尺度一区二区三区| 91.麻豆视频| 天天综合色天天| 欧美唯美清纯偷拍| 亚洲女人小视频在线观看| 不卡的av中国片| 中文字幕不卡三区| 国产精品99久久久久久有的能看| 日韩片之四级片| 免费看欧美美女黄的网站| 欧美日韩国产天堂| 丝袜美腿亚洲综合| 5566中文字幕一区二区电影| 亚洲香肠在线观看| 欧美三级乱人伦电影| 亚洲一区二区三区中文字幕| 一本到三区不卡视频| 亚洲蜜桃精久久久久久久| 91亚洲精华国产精华精华液| 亚洲欧洲美洲综合色网| 91老师国产黑色丝袜在线| 亚洲三级在线观看| 在线精品视频一区二区| 亚洲丶国产丶欧美一区二区三区| 在线影视一区二区三区| 亚洲成人资源网| 欧美一卡在线观看| 国内精品不卡在线| 国产精品久久免费看| 色婷婷av一区二区三区大白胸 | 亚洲一区视频在线观看视频| 91精彩视频在线观看| 亚洲福利一区二区三区| 欧美一区三区四区| 精品写真视频在线观看| 国产午夜精品理论片a级大结局| 丁香激情综合国产| 亚洲精品视频一区| 欧美精品vⅰdeose4hd| 卡一卡二国产精品| 久久久久国产精品麻豆ai换脸| 成人毛片视频在线观看| 一区二区三区成人| 欧美一区三区二区| 成人自拍视频在线| 亚洲一区二区三区激情| 欧美一区二区三区精品| 丁香五精品蜜臀久久久久99网站| 亚洲欧美偷拍另类a∨色屁股| 欧美日韩中文另类| 国产精品乡下勾搭老头1|