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

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

?? eeprom.c

?? TDK 6521 SOC 芯片 DEMO程序
?? C
?? 第 1 頁 / 共 2 頁
字號:
/***************************************************************************
 * This code and information is provided "as is" without warranty of any   *
 * kind, either expressed or implied, including but not limited to the     *
 * implied warranties of merchantability and/or fitness for a particular   *
 * purpose.                                                                *
 *                                                                         *
 * Copyright (C) 2004 Teridian SemiConductor, Corporation.                 *
 * All Rights Reserved.                                                    *
 *                                                                         *
 ***************************************************************************/
//**************************************************************************
//  DESCRIPTION: 71M652x POWER METER - Serial EEPROM Routines. 
// 
//  AUTHOR:  MTF
//
//  HISTORY: See end of file.
//**************************************************************************
// File: EEPROM.C
//
#include "options.h"
#if EEPROM && I2C_INT
#include "mmath.h"
#include "stm.h"
#include "wd.h"
#include "eeprom.h"

/*** External functions used within this module ***/
// software timers, software watchdog

/*** External variables used within this module ***/
// None.

/*** Public functions declared within this module ***/
// See include file "eeprom.h".

/*** Public variables declared within this module ***/
// See include file "eeprom.h".

/*** Private functions declared within this module ***/
static void issue_START (void) small reentrant;

/*** Private variables declared within this module ***/
//
#define WRITE 0xA0                     // EEPROM write to I2C device A0.
#define READ  0xA1                     // EEPROM read from I2C device A0.
#define START_DELAY   0x800            // Minimum allowable is 0x6A8.   

static volatile void (* xdata eeprom_proc) (void);

// EEPROM interface definitions.
enum STATE_t {
    IDLE, 
    WAIT_STOP,
    START_WRITE, 
    WAIT_WRITE_ACK, 
    WAIT_MSB_ADDR_ACK, 
    WAIT_LSB_ADDR_ACK, 
    WAIT_DATA_ACK,
    WAIT_CLEAR_ACK,
    START_READ, 
    WAIT_READ_ACK, 
    WAIT_DATA
 };

static volatile uint8_t mode;
#define READ_MODE 0
#define WRITE_MODE 1
#define CLEAR_MODE 2
static volatile uint16i_t page_fill;          // Count of bytes to fill page.
static volatile uint32i_t cnt;                // Count of bytes to still send or receive.
static volatile uint8_16_32_t idata addr;
static volatile uint8x_t * idata ptr;         // Pointer to string XMT'd/RCV'd to/from EEPROM.
static volatile enum EEPROM_RC data status;   // status of TX/RX of EEPROM.
static volatile enum STATE_t data state;
static volatile bool done;
static volatile uint16i_t page_mask;
static volatile uint16i_t write_tick_cnt;     // Time to write a page of EEPROM.

static const uint16r_t mask[] = { 0x0000, 
    0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF,
    0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF };

void EEProm_Config (bool access, uint16_t page_size, uint8_t msWr)
{                                    // Enable control pins to access EEPROM, set page size and write time.
    if (access)
    {
       page_mask = mask[ log2 (page_size) ];
       write_tick_cnt = milliseconds(msWr);  // convert milliseconds to ticks.
       EX_EEPROM  = FALSE;                                 // Disable EEPROM non-busy interrupt.
       done = TRUE;
        
       DIO = (DIO & ~DIO_EEX) | DIO_EEX_2W;                // Connect to 2-Wire external EEPROM.
       EX_EEPROM  = TRUE;            // Enable EEPROM non-busy interrupt.
    }                                
    else
    {
       EX_EEPROM  = FALSE;           // Disable EEPROM non-busy interrupt.
       DIO &= ~DIO_EEX;              // Disconnect from external EEPROM.
    }    
}

#pragma save
#pragma NOAREGS
void EEProm_isr (void) small reentrant interrupt EEPROM_IV
{
    if (EECTRL & EE_ERROR)
    {
       status = _ERR_NACK;
       state = IDLE;
       return;
    }

    #ifdef WD_EEPROM
    wd_reset ( WD_EEPROM );
    #endif
 
    switch (state)
    {                                
       case IDLE:
          break;                        // Just ignore interrupts.
                                     
       case START_WRITE:                // Start of 'Page Write' or 'Sequential Read'.
          EEDATA = (addr.c[ HI_LO ] << 1) | WRITE; // Real or "dummy" write.
          EECTRL = EE_TX;               // issue_TRANSMIT ();
          state = WAIT_WRITE_ACK;
          break;

       case WAIT_WRITE_ACK:
          EEDATA = addr.c[ LO_HI ];     // Send MSB of address.
          EECTRL = EE_TX;               // issue_TRANSMIT ();
          state = WAIT_MSB_ADDR_ACK;
          break;

       case WAIT_MSB_ADDR_ACK:
          EEDATA = addr.c[ LO_LO ];     // Send LSB of address.
          EECTRL = EE_TX;               // Finish step-up of read/write of next page.
          state = WAIT_LSB_ADDR_ACK;
          break;

       case WAIT_LSB_ADDR_ACK: 
          switch(mode)
          {                           
          case READ_MODE:               // Do 'Sequential Read'. 
             EECTRL = EE_START;
             state = START_READ;
             break;
          case WRITE_MODE:              // Do 'Page Write'. 
             EEDATA = *(ptr++);         // Fetch character to send to EEPROM.
             EECTRL = EE_TX;            // issue_TRANSMIT ();
             page_fill = min (PAGE_SIZE - (addr.i[ LO ] & page_mask), cnt);
             cnt -= (uint32_t)page_fill;
             state = WAIT_DATA_ACK;
             break;
          case CLEAR_MODE:              // Do clear of device. 
             EEDATA = 0xFF;             // Fetch character to send to EEPROM.
             EECTRL = EE_TX;            // issue_TRANSMIT ();
             page_fill = PAGE_SIZE;
             cnt -= (uint32_t)page_fill;
             state = WAIT_CLEAR_ACK;
             break;
          }
          break;

       case WAIT_DATA_ACK: 
          if (--page_fill)              
          {
             EEDATA = *(ptr++);         // Fetch character to send to EEPROM.
             EECTRL = EE_TX;            // issue_TRANSMIT ();
          }
          else                          // Transmit to EEPROM.      
          {                             // Page full.
             if (0 == cnt)
                status = _OK;           // All done.

             EECTRL = EE_STOP;          // Do STOP.
             state = WAIT_STOP;
          }
          break;

       case WAIT_CLEAR_ACK: 
          if (--page_fill)              
          {
             EEDATA = 0xFF;             // Character to send to EEPROM.
             EECTRL = EE_TX;            // issue_TRANSMIT ();
          }
          else                          // Transmit to EEPROM.      
          {                             // Page full.
             if (0 == cnt)
                status = _OK;           // All done.

             EECTRL = EE_STOP;          // Do STOP.
             state = WAIT_STOP;
          }
          break;

       case WAIT_STOP: 
          if (cnt)
          {
             uint16x_t *pstm;
                                       // Align on page boundary.
             addr.i[ LO ] &= ~page_mask;
             addr.l += PAGE_SIZE;       // Next page.
             state = START_WRITE;       // Delay 'msWr' msec before next START.
             pstm = stm_start(write_tick_cnt, 0, issue_START);
             if (NULL == pstm)
                status = _ERR_OVERRUN;
          }
          else   
          {
             done = TRUE;
             status = _OK;
             state = IDLE;              // Done w/ READ or WRITE.
          }
          break;

////////////////////////////////////////////////////////////////////////////

       case START_READ:
          EEDATA = (addr.c[ HI_LO ] << 1) | READ;
          EECTRL = EE_TX;               // issue_TRANSMIT ();
          state = WAIT_READ_ACK;
          break;

       case WAIT_READ_ACK:
          if (1 == cnt)
             EECTRL = EE_RCV;           // Receive last byte (NO ACK).
          else
             EECTRL = EE_RCV_ACK;       // Receive and ACK byte.

          state = WAIT_DATA;
          break;

       case WAIT_DATA:                  // ACK has been sent.
          *(ptr++) = EEDATA;            // Store character received from EEPROM.

          if (--cnt)
          {
             if (1 == cnt)
                EECTRL = EE_RCV;        // Receive last byte (NO ACK).
             else
                EECTRL = EE_RCV_ACK;    // Receive and ACK byte.
          }
          else
          {
             EECTRL = EE_STOP;
             state = WAIT_STOP;         // Done w/ READ.
          }
          break;
    }
}
#pragma restore

#pragma save
#pragma NOAREGS
static void issue_START (void) small reentrant
{
    EECTRL = EE_START;
}
#pragma restore

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人小视频在线| 久久综合久久综合久久综合| 粉嫩绯色av一区二区在线观看 | 国产福利一区二区三区视频 | 亚洲大片精品永久免费| 亚洲中国最大av网站| 亚洲女性喷水在线观看一区| 亚洲男人天堂av| 亚洲情趣在线观看| 亚洲综合自拍偷拍| 亚洲二区视频在线| 五月激情丁香一区二区三区| 一区二区三区国产精品| 亚洲成人av电影在线| 亚洲视频你懂的| 亚洲一区自拍偷拍| 日本欧美大码aⅴ在线播放| 日韩国产精品久久| 久久99精品久久久| 国产成人精品一区二| 99国产欧美另类久久久精品| 色婷婷激情综合| 欧美日韩在线观看一区二区| 日韩一区二区三区三四区视频在线观看| 欧美精品99久久久**| 欧美大片在线观看一区| 国产亚洲一区二区三区| 日韩毛片高清在线播放| 丝袜美腿高跟呻吟高潮一区| 久久99精品久久久久| 不卡一区二区中文字幕| 色欧美日韩亚洲| 日韩一区二区三区免费观看| 国产欧美日韩在线| 日韩伦理免费电影| 日本伊人色综合网| 成人免费视频播放| 欧美日本免费一区二区三区| 久久日一线二线三线suv| 中文字幕在线不卡一区二区三区| 亚洲一区二区中文在线| 国模无码大尺度一区二区三区| 成人性生交大片免费看视频在线 | 欧美日韩在线综合| 久久众筹精品私拍模特| 亚洲免费资源在线播放| 久久国产麻豆精品| gogo大胆日本视频一区| 欧美一级二级三级蜜桃| 国产精品家庭影院| 轻轻草成人在线| 91视频一区二区| 日韩久久精品一区| 国产精品乱码人人做人人爱| 男女视频一区二区| 99精品偷自拍| 精品成人a区在线观看| 亚洲激情第一区| 国产一区二区免费看| 欧美三区在线视频| 国产精品污污网站在线观看| 日日欢夜夜爽一区| 成人动漫中文字幕| 欧美电视剧免费观看| 亚洲一区二区精品3399| 成人黄色小视频在线观看| 欧美一卡2卡3卡4卡| 亚洲精品乱码久久久久久黑人 | 丁香天五香天堂综合| 7777精品伊人久久久大香线蕉 | 日韩二区三区在线观看| 色综合天天在线| 国产亚洲午夜高清国产拍精品 | 国产a区久久久| 欧美日韩亚洲高清一区二区| 亚洲日本一区二区三区| 国产精品一区在线观看你懂的| 欧美日韩电影在线| 亚洲欧美另类小说| 春色校园综合激情亚洲| 久久综合99re88久久爱| 麻豆视频一区二区| 欧美日韩亚洲高清一区二区| 亚洲精品国产精华液| 成人精品国产免费网站| www激情久久| 蜜桃视频免费观看一区| 偷窥少妇高潮呻吟av久久免费| 不卡的av电影在线观看| 久久久久久久电影| 狠狠狠色丁香婷婷综合激情 | 欧美精品视频www在线观看| 欧美国产日韩精品免费观看| 国模无码大尺度一区二区三区| 日韩一区二区三区在线观看| 日韩成人一级大片| 国产成人av电影在线| 久久久精品国产免大香伊| 亚洲va在线va天堂| 欧美三级欧美一级| 亚洲综合自拍偷拍| 欧美无人高清视频在线观看| 国产精品国产三级国产有无不卡 | 成人91在线观看| 国产精品久久久久久久久免费丝袜 | 99久久婷婷国产综合精品电影| 日韩欧美不卡在线观看视频| 国产精品嫩草影院av蜜臀| 亚洲综合视频网| 国内精品不卡在线| 日本高清视频一区二区| 亚洲一本大道在线| 色香色香欲天天天影视综合网| 国产精品视频看| 国产suv一区二区三区88区| 精品黑人一区二区三区久久| 一区二区三区久久| 欧美丝袜丝交足nylons图片| 香蕉av福利精品导航| 欧美一级国产精品| 国产原创一区二区三区| 欧美国产精品一区二区| 99国产一区二区三精品乱码| 亚洲综合视频网| 欧美一级高清大全免费观看| 捆绑紧缚一区二区三区视频| 国产视频不卡一区| 91美女片黄在线观看| 亚洲国产精品麻豆| 日韩亚洲欧美高清| 国产精品中文字幕欧美| 亚洲色图欧美偷拍| 欧美日韩国产免费一区二区| 激情综合五月天| 国产精品国产三级国产aⅴ原创 | 日韩欧美一区二区三区在线| 国产麻豆日韩欧美久久| 国产精品久久久久久久久快鸭 | 亚洲成人综合在线| 欧美成人一区二区三区片免费| 国产成a人亚洲| 亚洲一区在线观看网站| 精品美女在线观看| 99精品国产91久久久久久 | thepron国产精品| 亚洲福利一区二区三区| 精品国产网站在线观看| 色婷婷综合久久久| 久久国产精品色| 亚洲靠逼com| 精品久久人人做人人爱| 99九九99九九九视频精品| 日韩精品国产欧美| 中文字幕巨乱亚洲| 51精品久久久久久久蜜臀| 成人午夜视频网站| 日产欧产美韩系列久久99| 国产人成一区二区三区影院| 欧美性受极品xxxx喷水| 国产精品羞羞答答xxdd| 午夜视黄欧洲亚洲| 国产精品―色哟哟| 日韩精品中文字幕在线一区| 一本一道久久a久久精品综合蜜臀| 免费人成在线不卡| 亚洲精品福利视频网站| 久久久噜噜噜久久中文字幕色伊伊| 一本久久综合亚洲鲁鲁五月天| 精品在线观看视频| 亚洲国产精品视频| 亚洲欧洲日韩综合一区二区| 精品久久久久久最新网址| 欧美综合色免费| 成人综合在线网站| 精品一区二区在线免费观看| 亚洲综合激情另类小说区| 国产精品毛片a∨一区二区三区| 日韩一区二区三区视频在线| 欧美色视频在线观看| av影院午夜一区| 国产精品一区二区黑丝| 免费在线观看视频一区| 午夜天堂影视香蕉久久| 亚洲久草在线视频| 国产精品久久综合| 欧美精品一区二区三区很污很色的| 精品婷婷伊人一区三区三| 一本大道久久a久久精二百| 国产成人av自拍| 国产乱子伦一区二区三区国色天香| 五月婷婷激情综合网| 亚洲图片欧美综合| 亚洲男人天堂一区| 亚洲视频免费在线观看| 国产精品久久久一本精品| 久久久久久久综合狠狠综合| 日韩女优视频免费观看| 日韩欧美在线1卡| 日韩三级在线免费观看| 欧美一区中文字幕|