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

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

?? iiceeprom.c

?? msp430F437三相電表DEMO(編譯器 IAR 3.42A)
?? C
字號:
//--------------------------------------------------------------------------
//
//  Software for MSP430 based e-meters.
//
//  THIS PROGRAM IS PROVIDED "AS IS". TI MAKES NO WARRANTIES OR
//  REPRESENTATIONS, EITHER EXPRESS, IMPLIED OR STATUTORY, 
//  INCLUDING ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS 
//  FOR A PARTICULAR PURPOSE, LACK OF VIRUSES, ACCURACY OR 
//  COMPLETENESS OF RESPONSES, RESULTS AND LACK OF NEGLIGENCE. 
//  TI DISCLAIMS ANY WARRANTY OF TITLE, QUIET ENJOYMENT, QUIET 
//  POSSESSION, AND NON-INFRINGEMENT OF ANY THIRD PARTY 
//  INTELLECTUAL PROPERTY RIGHTS WITH REGARD TO THE PROGRAM OR 
//  YOUR USE OF THE PROGRAM.
//
//  IN NO EVENT SHALL TI BE LIABLE FOR ANY SPECIAL, INCIDENTAL, 
//  CONSEQUENTIAL OR INDIRECT DAMAGES, HOWEVER CAUSED, ON ANY 
//  THEORY OF LIABILITY AND WHETHER OR NOT TI HAS BEEN ADVISED 
//  OF THE POSSIBILITY OF SUCH DAMAGES, ARISING IN ANY WAY OUT 
//  OF THIS AGREEMENT, THE PROGRAM, OR YOUR USE OF THE PROGRAM. 
//  EXCLUDED DAMAGES INCLUDE, BUT ARE NOT LIMITED TO, COST OF 
//  REMOVAL OR REINSTALLATION, COMPUTER TIME, LABOR COSTS, LOSS 
//  OF GOODWILL, LOSS OF PROFITS, LOSS OF SAVINGS, OR LOSS OF 
//  USE OR INTERRUPTION OF BUSINESS. IN NO EVENT WILL TI'S 
//  AGGREGATE LIABILITY UNDER THIS AGREEMENT OR ARISING OUT OF 
//  YOUR USE OF THE PROGRAM EXCEED FIVE HUNDRED DOLLARS 
//  (U.S.$500).
//
//  Unless otherwise stated, the Program written and copyrighted 
//  by Texas Instruments is distributed as "freeware".  You may, 
//  only under TI's copyright in the Program, use and modify the 
//  Program without any charge or restriction.  You may 
//  distribute to third parties, provided that you transfer a 
//  copy of this license to the third party and the third party 
//  agrees to these terms by its first use of the Program. You 
//  must reproduce the copyright notice and any other legend of 
//  ownership on each copy or partial copy, of the Program.
//
//  You acknowledge and agree that the Program contains 
//  copyrighted material, trade secrets and other TI proprietary 
//  information and is protected by copyright laws, 
//  international copyright treaties, and trade secret laws, as 
//  well as other intellectual property laws.  To protect TI's 
//  rights in the Program, you agree not to decompile, reverse 
//  engineer, disassemble or otherwise translate any object code 
//  versions of the Program to a human-readable form.  You agree 
//  that in no event will you alter, remove or destroy any 
//  copyright notice included in the Program.  TI reserves all 
//  rights not specifically granted under this license. Except 
//  as specifically provided herein, nothing in this agreement 
//  shall be construed as conferring by implication, estoppel, 
//  or otherwise, upon you, any license or other right under any 
//  TI patents, copyrights or trade secrets.
//
//  You may not use the Program in non-TI devices.
//
//  File: iiceeprom.c
//
//  Steve Underwood <steve-underwood@ti.com>
//  Texas Instruments Hong Kong Ltd.
//
//  $Id: iiceeprom.c,v 1.3 2004/12/13 01:36:42 a0754793 Exp $
//
//--------------------------------------------------------------------------
#include <stdint.h>
#include "emeter-toolkit-custom.h"
#include "emeter-toolkit.h"

// These routines support a single I2C EEPROM or FRAM attached to
// two pins of a port on an MSP430.
//
//Please note:
//
// These routines have been tested with an Atmel 2401. They
// are intended to work with a range of I2C interface serial
// EEPROMs, but should be thoroughly tested against any
// other EEPROM before serious use.
//
// Since the EEPROM will be operating at a low voltage, when
// connected to the MSP430, this code is designed to operate
// at the worst case timing for the Atmel chips, at their
// lowest recommended supply voltage, and with the MSP430
// running at 8MHz. They could be tuned for faster operation
// in other environments.

#if SUPPORT_IICEEPROM

#define MAX_IIC_TRIES 200

#if defined(EEPROM_IS_REALLY_FRAM)
/* No delay is needed for FRAMs */
#define delay(x) /**/
#else
/* This delay is needed for EEPROMs */
static void delay(int i)
{
    for (  ;  i;  i--)
    {
        _NOP();
        _NOP();
        _NOP();
        _NOP();
    }
}
#endif

static void iic_start(void)
{
    /* Send a start to the EEPROM */
    /* A start is the data bit falling while the clock is high */
    IICEEPROM_PORT_DIR &= ~IICEEPROM_SDA_BIT;
    delay(2);   //At least ???
    IICEEPROM_PORT_DIR &= ~IICEEPROM_SCL_BIT;
    delay(5);   //At least 4.7us
    IICEEPROM_PORT_DIR |= IICEEPROM_SDA_BIT;
    delay(5);   //At least 4.7us
    IICEEPROM_PORT_DIR |= IICEEPROM_SCL_BIT;
}

static void iic_stop(void)
{
    /* Send a stop to the EEPROM */
    /* A stop is the data bit rising while the clock is high */
    IICEEPROM_PORT_DIR |= IICEEPROM_SDA_BIT;
    delay(2);   //At least ???
    IICEEPROM_PORT_DIR &= ~IICEEPROM_SCL_BIT;
    delay(5);   //At least 4.7us
    IICEEPROM_PORT_DIR &= ~IICEEPROM_SDA_BIT;
    delay(5);   //At least 4.7us
    IICEEPROM_PORT_DIR |= IICEEPROM_SCL_BIT;
}

static int iic_send(uint8_t data)
{
    int i;
    
    /* Send 8 bits of data */
    IICEEPROM_PORT_DIR |= IICEEPROM_SCL_BIT;
    for (i = 8;  i > 0;  i--)
    {
        /* The data can now change without delay */
        if (data & 0x80)
            IICEEPROM_PORT_DIR &= ~IICEEPROM_SDA_BIT;
        else
            IICEEPROM_PORT_DIR |= IICEEPROM_SDA_BIT;
        data <<= 1;
        /* Pulse the clock high while the data bit is steady */
        delay(5);   //At least 4.7us
        IICEEPROM_PORT_DIR &= ~IICEEPROM_SCL_BIT;
        delay(5);   //At least 4.7us
        IICEEPROM_PORT_DIR |= IICEEPROM_SCL_BIT;
    }
    /* Check the acknowledgement from the EEPROM */
    /* Pulse the clock high, and see what the device says while the clock is high */
    delay(5);
    IICEEPROM_PORT_DIR &= ~IICEEPROM_SDA_BIT;
    delay(5);
    IICEEPROM_PORT_DIR &= ~IICEEPROM_SCL_BIT;
    delay(5);
    i = IICEEPROM_PORT_IN & IICEEPROM_SDA_BIT;
    IICEEPROM_PORT_DIR |= IICEEPROM_SCL_BIT;
    delay(4);
    return i;
}

static uint8_t iic_receive(int ok)
{
    uint8_t data;
    int i;

    /* Get 8 bits of data */
    IICEEPROM_PORT_DIR &= ~IICEEPROM_SDA_BIT;     //Input
    data = 0;
    for (i = 8;  i > 0;  i--)
    {
        IICEEPROM_PORT_DIR &= ~IICEEPROM_SCL_BIT;
        delay(5);   //At least 4.7us
        data <<= 1;
        if (IICEEPROM_PORT_IN & IICEEPROM_SDA_BIT)
            data |= 0x01;
        IICEEPROM_PORT_DIR |= IICEEPROM_SCL_BIT;
        delay(5);   //At least 4.7us
    }
    /* Send the acknowledgement to the EEPROM */
    if (ok)
        IICEEPROM_PORT_DIR |= IICEEPROM_SDA_BIT;
    else
        IICEEPROM_PORT_DIR &= ~IICEEPROM_SDA_BIT;
    delay(4);
    IICEEPROM_PORT_DIR &= ~IICEEPROM_SCL_BIT;
    delay(4);
    IICEEPROM_PORT_DIR |= IICEEPROM_SCL_BIT;
    IICEEPROM_PORT_DIR &= ~IICEEPROM_SDA_BIT;
    return data;
}

static int test_SDA(void)
{
    int i;
  
    iic_stop();
    IICEEPROM_PORT_DIR &= ~IICEEPROM_SDA_BIT;
    delay(4);
    for (i = 16;  i > 0;  i--)
    {
        delay(5);
        if (!(IICEEPROM_PORT_IN & IICEEPROM_SDA_BIT))
            break;
    }
    return i;
}

int iicEEPROM_read(uint16_t addr, void *dat, int len)
{
    int i;
    int j;
    uint8_t *p;

    for (i = 0;  i < MAX_IIC_TRIES;  ++i)
    {
        if (i)
        {
            /* Read FALSE, retry */
            if (test_SDA())
                continue;
        }
        iic_start();
#if EEPROM_PAGE_SIZE == 32
        if (iic_send(0xA0)  ||  iic_send(addr/0x100)  ||  iic_send(addr))
            continue;
#else
        if (iic_send(0xA0 | ((uint8_t)(addr/0x100)*2))  ||  iic_send(addr))
            continue;
#endif
        p = (uint8_t *) dat;

        iic_start();
#if EEPROM_PAGE_SIZE == 32
        if (iic_send(0xA1))
            continue;
#else
        if (iic_send(0xA1 | ((uint8_t)(addr/0x100)*2)))
            continue;
#endif
        for (j = len;  j > 0;  j--)
            *p++ = iic_receive(TRUE);
        *p = iic_receive(FALSE);
        iic_stop();
        return TRUE;
    }
    iic_stop();
    return FALSE;
}

int iicEEPROM_write(uint16_t addr, void *dat, int len)
{
    int i;
    int j;
    int section_len;
    uint8_t *p;
    uint8_t *q;

    /* If the write spreads across pages in the EEPROM, we need to split the write
       into sections. */
    q = (uint8_t *) dat;
    while (len > 0)
    {
        if (addr + len > ((addr + EEPROM_PAGE_SIZE) & ~(EEPROM_PAGE_SIZE - 1)))
            section_len = ((addr + EEPROM_PAGE_SIZE) & ~(EEPROM_PAGE_SIZE - 1)) - addr;
        else
            section_len = len;
        for (i = 0;  i < MAX_IIC_TRIES;  ++i)
        {
            if (i)
            {
                /* Write FALSE, retry */
                if (test_SDA())
                    continue;
            }

            iic_start();
#if EEPROM_PAGE_SIZE == 32
            if (iic_send(0xA0)  ||  iic_send(addr/0x100)  ||  iic_send(addr))
                continue;
#else
            if (iic_send(0xA0 | ((uint8_t)(addr/0x100)*2))  ||  iic_send(addr))
                continue;
#endif
            p = q;
            for (j = section_len;  j > 0;  j--)
            {
                if (iic_send(*p++))
                    break;
            }
            if (j == 0)
                break;
            iic_stop();
        }
        iic_stop();
        if (i >= MAX_IIC_TRIES)
            return FALSE;
        len -= section_len;
        addr += section_len;
        q += section_len;
    }
    return TRUE;
}

int iicEEPROM_init(void)
{
    int i;

    /* While idling, the EEPROM clock should be low */
    IICEEPROM_PORT_DIR |= IICEEPROM_SCL_BIT;
    /* If we happen to have restarted in the middle of a read from
       the EEPROM/FRAM, we need to regain control of the device. If we
       give it enough clocks, and do no acknowledge it we should get out
       of any odd conditions. Then we do a stop, and we should be OK. If
       the device was mid write when the restart occurred we cannot really
       act in a clean way. */
    delay(5);   //At least 4.7us
    for (i = 0;  i < 16;  i++)
    {
        IICEEPROM_PORT_DIR &= ~IICEEPROM_SCL_BIT;
        delay(5);   //At least 4.7us
        IICEEPROM_PORT_DIR |= IICEEPROM_SCL_BIT;
        delay(5);   //At least 4.7us
    }
    iic_stop();
    return 0;
}
#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色吊一区二区三区| www.久久精品| 高清不卡一二三区| 另类专区欧美蜜桃臀第一页| 婷婷中文字幕一区三区| 亚洲综合色网站| 午夜精品福利久久久| 免费黄网站欧美| 毛片不卡一区二区| 国内精品写真在线观看| 国产精品一级二级三级| 成人综合在线网站| 色综合天天综合网国产成人综合天| 色成人在线视频| 91精品国产综合久久福利| 亚洲精品在线免费观看视频| 国产亚洲短视频| 亚洲综合色噜噜狠狠| 日韩国产一二三区| 国产成人亚洲综合a∨猫咪| 色偷偷久久一区二区三区| 欧美精品视频www在线观看| 精品国产免费一区二区三区香蕉| 中国av一区二区三区| 亚洲一区日韩精品中文字幕| 男女性色大片免费观看一区二区 | 懂色av一区二区在线播放| heyzo一本久久综合| 欧美日韩久久一区| 日本一区二区三区高清不卡| 亚洲成人动漫在线免费观看| 国产伦精一区二区三区| 色综合天天综合色综合av | 亚洲国产综合色| 国产裸体歌舞团一区二区| 91网站最新地址| 精品欧美黑人一区二区三区| 欧美日韩成人一区二区| 99精品一区二区| 欧美一级淫片007| 亚洲免费在线观看| 国产一区二区伦理| 欧美日本视频在线| 亚洲日本在线观看| 国产精品自拍av| 欧美日韩精品免费| 曰韩精品一区二区| 成人av免费观看| 久久久不卡网国产精品二区| 丝袜美腿亚洲色图| 色乱码一区二区三区88| 国产区在线观看成人精品| 蜜臀av性久久久久av蜜臀妖精| 在线一区二区三区做爰视频网站| 国产清纯美女被跳蛋高潮一区二区久久w | 久久精品国产亚洲5555| 欧美日韩国产a| 国产精品每日更新在线播放网址| 亚洲欧美国产高清| 国产福利精品一区| 久久亚洲私人国产精品va媚药| 亚洲国产乱码最新视频 | 色综合久久中文字幕| 久久久久久久久久久黄色| 裸体健美xxxx欧美裸体表演| 精品视频在线免费| 一区二区在线免费观看| 一本大道av一区二区在线播放| 亚洲已满18点击进入久久| 成人白浆超碰人人人人| 国产欧美日韩综合| 国产成人午夜精品5599| 亚洲国产精品国自产拍av| 国产麻豆精品在线观看| 国产亚洲欧美在线| 成人丝袜高跟foot| 日韩美女精品在线| 91麻豆免费视频| 亚洲精品写真福利| 欧美亚洲国产一区在线观看网站| 亚洲欧美日韩国产综合| 欧美中文字幕久久| 日韩不卡免费视频| 精品三级av在线| 高清国产午夜精品久久久久久| 中文字幕av在线一区二区三区| 成人高清视频免费观看| 一区二区三区国产| 欧美一区二区三区免费视频| 久久不见久久见免费视频7| 久久综合久久综合久久综合| 99精品视频一区| 亚洲国产精品久久不卡毛片| 日韩一区二区不卡| 国产69精品久久久久毛片| 亚洲男同1069视频| 555www色欧美视频| 国产成人免费视频一区| 亚洲欧美国产三级| 日韩免费一区二区| 国产乱一区二区| 一区二区视频在线看| 色乱码一区二区三区88| 中文字幕高清不卡| 色婷婷av一区二区三区大白胸 | 日韩电影免费一区| 精品1区2区3区| 亚洲高清不卡在线观看| 91久久久免费一区二区| 久久久久久久久久电影| 久久99国产精品麻豆| 26uuu成人网一区二区三区| 精品三级在线看| 日韩精品福利网| 91精品欧美一区二区三区综合在 | 日韩美女天天操| 日本一区二区三区四区在线视频| 99久久99久久精品免费看蜜桃| 国产精品麻豆99久久久久久| 国产精品88888| av在线这里只有精品| 制服丝袜一区二区三区| 亚洲成人av在线电影| 91猫先生在线| 日韩美女视频一区| 欧美亚洲一区二区在线| 午夜视频在线观看一区二区 | 色婷婷狠狠综合| 亚洲精品视频在线看| 琪琪久久久久日韩精品| 日韩一级二级三级| 亚洲免费在线观看视频| 日本成人在线网站| 91精品婷婷国产综合久久竹菊| 中文字幕一区免费在线观看| 五月天欧美精品| 欧美一区二区三区四区五区| 欧洲色大大久久| 国产资源在线一区| 亚洲不卡av一区二区三区| 久久综合99re88久久爱| 欧美一区二区私人影院日本| 国产成人欧美日韩在线电影 | 7777精品久久久大香线蕉| 国产成人av电影在线播放| 丝袜美腿亚洲综合| 国产成人综合视频| 国产欧美综合在线观看第十页| 成人av手机在线观看| 国内成人自拍视频| 久久99久久久久久久久久久| 亚洲成av人**亚洲成av**| 亚洲久本草在线中文字幕| 国产偷国产偷精品高清尤物| 精品久久久久久久久久久久包黑料| 欧美日韩亚洲综合在线| 欧美午夜精品免费| 欧美三级电影一区| 欧美午夜精品久久久久久孕妇 | 欧美一区二区精美| 91精品免费在线观看| 日韩欧美一区二区免费| 欧美tickling网站挠脚心| 久久综合九色综合97_久久久| 欧美成人video| 国产亚洲人成网站| 中文字幕一区三区| 亚洲一区二区三区小说| 亚洲超碰精品一区二区| 精品一区二区免费在线观看| 国产精品亚洲人在线观看| 成人性生交大片免费看视频在线| 成人精品国产一区二区4080| 色94色欧美sute亚洲线路一久| 欧美在线free| 欧美刺激午夜性久久久久久久| 久久老女人爱爱| 国产精品九色蝌蚪自拍| 亚洲综合图片区| 麻豆精品国产传媒mv男同| 成人性生交大片免费看在线播放| 91一区一区三区| 欧美成人伊人久久综合网| 亚洲国产成人一区二区三区| 亚洲成人tv网| 国产九九视频一区二区三区| 一本色道久久综合精品竹菊| 欧美高清性hdvideosex| 日本一区二区视频在线观看| 一区二区三区产品免费精品久久75| 日产精品久久久久久久性色| 国产成人在线网站| 5月丁香婷婷综合| 亚洲丝袜另类动漫二区| 久久99精品久久久久久| 色八戒一区二区三区| 国产亚洲人成网站| 日本麻豆一区二区三区视频| 色综合久久66| 国产亚洲欧洲997久久综合|