亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
国产揄拍国内精品对白| 九色porny丨国产精品| 欧美变态凌虐bdsm| 99久久综合99久久综合网站| 喷水一区二区三区| 亚洲女同女同女同女同女同69| 欧美精品视频www在线观看| 成人黄色av电影| 国产一区二区三区香蕉| 婷婷综合久久一区二区三区| ●精品国产综合乱码久久久久| 日韩一本二本av| 欧美日韩一区成人| 色综合天天综合网天天看片| 国产精品888| 老司机午夜精品99久久| 亚洲chinese男男1069| 亚洲激情欧美激情| 日韩美女视频一区二区| 亚洲精品一区二区三区99| 欧美午夜在线一二页| 99久久国产综合精品女不卡| 国产精品一区在线观看你懂的| 日韩有码一区二区三区| 婷婷国产在线综合| 亚洲国产精品尤物yw在线观看| 亚洲欧美日韩一区二区 | 久久九九国产精品| 91精品国产色综合久久不卡电影 | 欧美精品99久久久**| 91麻豆国产在线观看| 99re视频精品| 不卡高清视频专区| 成人一级视频在线观看| 丰满亚洲少妇av| 成人精品鲁一区一区二区| 国产成人久久精品77777最新版本| 激情综合网激情| 91网站黄www| 91色在线porny| 91片黄在线观看| 99久久精品免费| 91久久精品一区二区三区| 一本到不卡免费一区二区| 色噜噜狠狠成人网p站| 色一情一伦一子一伦一区| 色综合久久久久综合体桃花网| 成人性色生活片免费看爆迷你毛片| 岛国av在线一区| 色婷婷综合久色| 欧美疯狂性受xxxxx喷水图片| 欧美三级日韩在线| 欧美一区二区在线观看| 日韩精品中文字幕在线不卡尤物| 欧美成人性福生活免费看| 久久综合视频网| 国产精品情趣视频| 亚洲精品高清视频在线观看| 亚洲一区二区三区中文字幕在线| 亚洲国产日韩一区二区| 美女国产一区二区| 成人午夜在线免费| 91国产视频在线观看| 欧美一区二区三区色| 国产婷婷色一区二区三区在线| 国产精品三级电影| 亚洲一区在线视频| 国内成+人亚洲+欧美+综合在线| 成人免费高清在线| 欧美浪妇xxxx高跟鞋交| 久久久亚洲国产美女国产盗摄 | 亚洲另类色综合网站| 性欧美大战久久久久久久久| 国内精品伊人久久久久av影院| 北条麻妃一区二区三区| 欧美午夜寂寞影院| 26uuu精品一区二区三区四区在线| 国产精品乱人伦中文| 亚洲国产精品一区二区久久 | www久久精品| 亚洲卡通欧美制服中文| 蜜臀av一区二区在线观看| 欧美精选一区二区| 国产嫩草影院久久久久| 午夜激情综合网| 国产伦精品一区二区三区视频青涩| 不卡的av中国片| 欧美精品日韩精品| 国产精品每日更新| 秋霞电影一区二区| 成+人+亚洲+综合天堂| 欧美日韩亚洲综合在线| 国产精品女主播av| 麻豆一区二区三区| 91久久一区二区| 亚洲国产岛国毛片在线| 七七婷婷婷婷精品国产| 色综合婷婷久久| 国产视频一区不卡| 免费精品视频最新在线| 色婷婷综合久色| 中文字幕不卡三区| 日本在线不卡一区| 欧美日韩在线不卡| 国产精品传媒在线| 国产一区二区不卡在线 | 中文字幕一区二区三区蜜月 | 欧美激情综合在线| 久久99这里只有精品| 欧美日韩免费不卡视频一区二区三区| 久久蜜桃一区二区| 久久99精品久久久| 欧美日韩一区二区在线观看视频| 中文字幕一区二区在线观看| 国产精品91一区二区| 精品国产免费视频| 美女视频免费一区| 制服丝袜日韩国产| 亚洲午夜久久久| 在线视频一区二区免费| 亚洲人精品一区| 91亚洲精品久久久蜜桃| 中文字幕一区三区| 99热精品国产| 1000精品久久久久久久久| 成人高清在线视频| 国产精品丝袜久久久久久app| 国产在线国偷精品产拍免费yy| 日韩一级免费一区| 极品少妇一区二区| 欧美tickling网站挠脚心| 日韩电影免费在线观看网站| 欧美日韩国产在线播放网站| 亚洲国产中文字幕在线视频综合| 欧美性感一类影片在线播放| 一区二区高清视频在线观看| 欧美四级电影网| 日韩二区在线观看| 91精品国产综合久久久蜜臀图片| 裸体歌舞表演一区二区| 欧美一区二区在线观看| 日本视频一区二区| 日韩欧美国产一区二区在线播放 | 国产精品第13页| 99久久久无码国产精品| 亚洲天堂中文字幕| 欧美综合一区二区| 亚洲444eee在线观看| 欧美一区二区三区四区五区 | 成人v精品蜜桃久久一区| 综合色中文字幕| 欧美亚洲综合网| 丝袜亚洲另类欧美| 亚洲精品成a人| 欧美三级日韩在线| 精品一区二区三区在线播放| 久久视频一区二区| 91麻豆自制传媒国产之光| 亚洲综合精品久久| 欧美一区二区成人| 国产成人午夜视频| 亚洲精品国产a| 91精品国产高清一区二区三区蜜臀| 久久99精品久久久久婷婷| 国产性天天综合网| 日本二三区不卡| 蜜臀av一区二区在线观看| 国产精品污网站| 欧美日韩国产成人在线免费| 六月丁香综合在线视频| 中文字幕中文在线不卡住| 欧美日韩视频第一区| 国产乱码精品一区二区三区忘忧草| 国产精品看片你懂得| 8x8x8国产精品| eeuss影院一区二区三区| 日韩中文字幕不卡| 中文字幕制服丝袜一区二区三区 | ww亚洲ww在线观看国产| 91色九色蝌蚪| 激情图区综合网| 亚洲国产精品自拍| 日本一区二区视频在线| 91精品国产丝袜白色高跟鞋| 成人av免费在线| 久久99精品久久久久| 亚洲成人你懂的| 国产精品福利影院| 精品国产凹凸成av人导航| 欧美性猛片aaaaaaa做受| 国产伦精品一区二区三区免费| 亚洲一区免费观看| 国产精品天干天干在线综合| 日韩免费成人网| 欧美性猛交xxxx黑人交| 成人深夜在线观看| 久久99国产精品久久99| 亚洲一区二区不卡免费| 中文字幕亚洲不卡| 国产欧美一区二区三区鸳鸯浴|