久久精品99久久_亚洲一区二区综合_狠狠色伊人亚洲综合成人_亚洲综合爱爱久久网

您好,歡迎進入深圳市穎特新科技有限公司官方網站!

您現在的位置:首頁 新聞資訊 >> 新聞頭條 >> N76E003/MS51FB9AE之IIC
新聞資訊
NEWS INFORMATION

N76E003/MS51FB9AE之IIC

關鍵字:新唐單片機 N76E003 發布時間:2019-05-22

I2C 總線提供了一種串行通信方式,用在 MCU 與 EEPROM,LCD模塊,溫度傳感器等等之間控制。

I2C 用兩條線 (數據線SDA 和時鐘線 SCL) 在設備間傳輸數據。

I2C 總線用作主機與從機之間雙向數據傳輸。可以用于多主機系統,支持無中央主機及多主機系統,主機與主機之間的總線仲載傳輸,同步時鐘SCL的存在,允許設備間使用不同比特率的數據傳輸。支持四種傳輸模式:主發,主收,從發,從收。

I2C 總線僅支持 7位地址。支持廣播呼叫,支持標準速率傳輸 (100kbps) 和快速傳輸( 400k bps)

功能描述

對于雙向傳輸操作,SDA 及SCL 引腳必須配置成開漏模式,形成邏輯線與功能:總線上當有一個器件輸出0,總線上就是0電平,所有器件全輸出1,總線上才是高電平,需要通過外接上拉電阻把電平拉高。N76E003, 在設置I2CEN (I2CON.6)使能I2C功能之前,必須把SCL,SDA的輸出鎖存在邏輯1的狀態。

I2C 空閑時,兩條線都為高。這時任一設備都可以做為主機發個起始位 START 開始數據傳輸,在停止位 STOP出現之前,總線被認為處于忙狀態。主機產生串行時鐘脈沖以及起始位和停止位。如果總線上沒有START起始信號,則所有總線設備被認為未被尋址從機,硬件自動匹配自己的從機地址或廣播呼叫地址,(廣播地址可由 GC(I2ADDR.0)使能或禁止.)。若地址匹配,就產生中斷。

I2C總線上傳輸的每個字節都包含8個數據位(MSB優先)和一個應答位,共9位。但每次傳輸的字節個數沒有明確界定(起始位 START 和停止位 STOP之間的字節個數) ,但每個字節都應有一個應答位。主機產生8個時鐘脈沖,以傳輸8位數據。在第8個時鐘SCL下沿后,由SDA腳輸出數據后,SDA轉為輸入模式在第9個時鐘脈沖以讀取第9位應答位。在第9個時鐘脈沖后,數據接收端若沒準備好接收下一個字節,可以拉住時鐘線保持低,讓傳輸掛起。接收端釋放時鐘線SCL以后,傳輸繼續。

開始和停止條件

I2C 總線時序定義了起始START (S)和結束STOP (P)的條件。時鐘SCL為高時,數據線SDA由高電平至低電平的跳變被認為是起始START標志。時鐘SCL為高時,數據線SDA由低電平至高電平的跳變被認為是結束STOP標志。起始和結束都由主機產生,起始和結束之間被認為是總線忙狀態。當成功判定結束條件以后,主機釋放總

線,所有設備都回到監聽總線起始位狀態,之前被呼叫從機也轉為未尋址從機。
I2C總線進入空閑狀態等待下一個起始START信號,開始下一次傳輸。
主機若發出停止位STOP,傳輸就停止了。然而,主機也可以不發停止位,而是再次發出起始START信號(Sr)繼續和上個地址通信,或者換個地址繼續通信。各種讀/寫組合格式操作可能存在一個傳輸中。

7位地址數據格式
起始位 START 之后, 第一個字節必須是“7位地址SLA+第8位讀寫方向位( W)”,用以定義目標從機地址以及從機寫入或讀出數據。若第8位是0,即SLA+W,表示下個字節開始主機向從機寫數據;若是1,即SLA+R,就表

示下字節開始,主機向從機讀數據。所以,一個典型數據包含起始位 START,SLA+W/R,一個或多個字節數據,最后是停止位 STOP。當一個從機已被尋址及讀寫方向通過字節SLA+W/R,隨后的8位數據就跟隨之前的設定進行傳輸。
I2C總線還有一種特殊尋址方式,廣播呼叫尋址。
在該模式下,發送的首字節數據為0。
廣播呼叫模式應用于主機希望向所有從機傳輸相同數據。當此尋址方式啟用。收到廣播要不要發應答由軟件決定。若某個從機發了應答,這個從機就收發后續數據,和標準從機接收方式相同。注意:地址0x00默認用于廣播呼叫方式,不能用于普通從機地址。因此理論上,總共7位地址I2C 總線,共可以連接127個設備,地址由1至127。

在數據傳輸過程中,在時鐘高電平時,SDA需要保持數據內容不能更改。只有在SCL為低時,SDA內容可以改變。

應答ACK
每字節傳輸SCL第9個脈沖用于傳輸應答位 (ACK)。通過將SDA拉低,來允許接收端(無論主機或是從機)回應發送端(無論主機或從機)。應答位時鐘由主機產生。發送端設備在應答位時鐘高電平周期內,需放棄對SDA的控制。ACK 為一個低電平信號。在應答位時鐘周期的高電平時,SDA保持低電平用以表示接收端已成功接收到發送端的數據。通常被尋址的從機在整個傳輸過程中每字節都需要回復應答位。當該從機接收無法應答(NACK)從機地址時,從機將SDA線保持高以便主機產生停止(STOP)或發送重復開始(START)信號。

若從機接收沒有應答從機地址后,將自身切換到未尋址從機模式,從而無法接收更多數據字節。這時從機將SDA線拉高,此時主機應發送停止STOP信號或重復起始(repeated START)信號。

 

若是主機接收,主機控制著收發字節個數,主機在最后一個字節收發結束后不發應答位信號,從機端將切換為未尋址從機模式,并釋放SDA線,以便主機直接發停止位STOP 或重開始位START。

仲裁
主機僅可在總線空閑時發起傳輸。可能有多個器件同時發開始位START試圖發起數據傳輸,這時就會出現總線
仲裁。在該狀態下,當SCL為高時,SDA上呈現仲裁信號。在仲裁過程中,第一個發起主機對SDA線置1(高電
平)而另一個主機發送0(低電平),發送后主機會對SDA線上信號與自己發出的信號進行比較,由于“線與”
的原因,時鐘SCL為高時,發送0的主機會成功,而發送1的主機會失敗。發送失敗的主機立刻切換自身到未被尋
址的從機狀態,以確保自身能被仲裁勝利的主機尋址到。同時也釋放數據線,并回到地址偵測狀態,仲載失敗的
主機,仍會發送時鐘,直到當前字節結束。
仲裁機制讓每個主機發送數據時,都會同時比較總線上的數據是否與自己發送的一致。注:如果其它主機發送
0,發送1的主機會在仲裁中失敗,仲裁會持續到總線上只有一個主機。如兩個主機同時向一個從機發數據時,地
址相同,仲裁會在第二個字節持續。

I2C 總線的這種仲裁機制,讓總線上的設備可以有多個主機,而且沒有優先等級。從機不介入仲裁。

I2C控制寄存器
I2C共有五個控制寄存器: I2CON, I2STAT, I2DAT, I2ADDR, 和 I2CLK. 這些寄存器用以提供協議控制,狀態顯示,數據傳輸、接收以及時鐘速率控制。為靈活應用,配置I2CPX (I2CON.0)可以交換SDA,SCL引腳功能。

 

工作模式
I2C 協議定義了四種模式:主機發送,主機接收,從機發送,從機接收。還有一種特殊模式廣播呼叫模式,其操作方式與從機接收模式類似。

主機發送模式 
主機發送多個字節到從機,主機產生時鐘,故需要在I2CLK內填入設定值。主機發送模式需要將STA (I2CON.5) 置1。此時,一旦檢測到總線空閑,主機就會發出一個起始位START,若成功, SI(I2CON.3) 將被置1,狀態碼I2STAT置為08H。接下來應把從機地址和寫位(SLA+W)寫入 I2DAT ,然后清0位SI,總線上發出SLA+W。
主機發出SLA+W 收到從機應答位ACK后, SI被置1,狀態碼I2STAT = 18H。接下來將按照用戶定義格式發送數據。所有的數據發送完以后,位 STO (I2CON.4)置1,并清除SI位以發出停止信號STOP,或者也可以發送重復起始信號repeat START,而不發送STOP,直接開始新一輪數據傳輸。

主機接收模式
主機接收模式,由從機傳輸數據。初始化設置與主機發送模式相同,主機發送起始位以后, I2DAT 應寫入從機地址和“讀位” (SLA+R)。收到從機應答位ACK后 SI 被置1且狀態碼 I2STAT= 40H。 SI 清0后開始接收從機數據,若 AA 位 (I2CON.2) =1,主機收到數據后回應答位;若 AA =0主機收到數據后不回應答NACK。然后主機可以發停止位或重起始開始新一輪傳輸。

 

從機接收模式
在從機接收模式下,從機接收主機發來的數據。在傳輸開始前,I2ADDR 應寫入從機地址,I2CLK內容無效,AA置1用以響應主機的尋址。上述初始化后,從機進入空閑模式,等待“寫”信號(SLA+W)。若主機仲裁失敗,也會直接進入從機接收模式。

當從機被“寫”信號SLA+W尋址到后,需要清0 SI位,以便從主機接收數據。如果在傳輸過程中AA=0,從機將在下一字節返回無應答位NACK,從機也將轉為未尋址從機,與主機聯系終止,不再接收數據,且I2DAT保持之前接收到的數據。

從機發送模式
從機發送模式,數據由從機發送給主機。當初始化I2ADDR及I2CON值后,器件等待直到自身地址被“讀”信號(SLA+R)尋址。若主機仲裁失敗,也可進入從機發送模式。

當從機被“讀”信號SLA+R尋址,需要將SI信號清0用以向主機發送數據。通常主機接收每字節數據后會返回應答位,如果沒有接收到應答位,接下去的傳輸中,從機將發送全1數據。并變為未尋址從機。如果傳輸過程中AA清0 ,從機將發送最后一個字節數據,并在接下去的傳輸中發送全1數據,并將自身變為未尋址從機。

各狀態碼表述 
I2STAT狀態寄存器中,有兩種狀態碼不歸屬25種之前所述狀態:F8H 及 00H。
F8H 用以標示在之前的傳輸中沒有有效信息,意味著,SI標志位為0且無I2C 中斷產生。
00H 標示在傳輸過程中,有總線錯誤發生。總線錯誤是指START 或 STOP在傳輸的過程中出現在錯誤的位置,例如在地址或數據的第二位或應答位。當總線發生錯誤,SI標志馬上會被置1,工作中的節點設備馬上切換到未被尋址從機模式,釋放SDA 和SCL,并將I2STAT寄存器清0。要恢復總線狀態,需要置位STO位并清除SI位,然后STO會由硬件清0,而不需要真正的STOP信號波形,釋放總線恢復到正常空閑狀態。
有一種特殊情況,當SDA線被強制拉低導致阻塞,START信號或重復起始(repeat START)信號無法成功產生時,從機將失去同步。解決方法是在SCL線上額外多送一個時鐘脈沖。通過將STA位置1,總線上產生額外的時鐘脈沖,由于SDA始終拉低,SDA線上不會產生START信號。一旦SDA線被釋放,正常的START信號送出,狀態寄存器上會顯示08H,串行傳輸繼續。相同的狀況,如果需要發送重復開始 (repeated START)信號受阻,也可以采用上述方式。在上述方式完成傳輸后,狀態寄存器顯示10H,而不是顯示08H。注:軟件無法介入上述總線問題傳輸。

 

重要說明: 當總線上看到的STATUS 為總線錯誤(bus error)時, I2C為持續使能狀態,由于對I2C模塊來說錯誤并沒有清除,無法直接用清除 SI 的方式來停止總線錯誤,故SI會保持在1。所以,如果程序中用SI來判定當下I2C狀態并繼續流程時,建議用下述方法來增加程序的穩定性。
解決方法:
– 通過對總線送出Stop信號
– 如果送出Stop仍然無效,說明時序已被打亂,需要對I2C總線傳輸進行關閉再重新開始傳輸。

 

I2C 超時溢出

N76E003帶一組14位超時計數器,用于防止I2C總線故障。一旦使能了超時定時器,計數器開始計數直至溢出,

即如果開啟中斷,I2TOF位會被硬件置1。當使能計數器,SI置1復位計數器, SI清0后重新開始計數。

若I2C總線出現故障,SI 位長時間不能清0,14位的超時定時器就會溢出,并進入中斷。

 

 

I2C 中斷
I2C的兩個標志位:SI 和 I2TOF。這兩個標志都會產生I2C事件中斷請求。如果 EI2C (EIE.0) = 1且 EA = 1,當兩個標志中的任意一個發生時, CPU 就會去執行中斷代碼。用戶可以讀取這兩個標志位,來確定中斷產生的原因。這兩個標志需軟件清0。
另外,當使用I2C超時寄存器功能時,必須打開I2C中斷用來配合超時的時序,否則I2C超時計數標志不會產生置位。

/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2017 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/

//***********************************************************************************************************
//  Nuvoton Technoledge Corp. 
//  Website: http://www.nuvoton.com
//  E-Mail : MicroC-8bit@nuvoton.com
//  Date   : Jun/21/2017
//***********************************************************************************************************

//***********************************************************************************************************
//  File Function: N76E003 I2C demo code, Slave Address of 24LC64 = 0xA0
//
//   ____________           ______________ 
//  |            |   SDA    |             |
//  |            |<-------->|             |
//  |            |          |             |
//  |N76E003(M) |          |   24LC64(S) |
//  |            |   SCL    |             |
//  |            |--------->|             |
//  |____________|          |_____________|
//
//  Microchip I2C EEPROM 24xx64 (64K Bit) is used as the slave device.  
//  The page size are 32Byte. Total are 256 page.
//  If verification passes, Port3 will show 0x78. If there is any failure
//  occured during the progress, Port3 will show 0x00.
//***********************************************************************************************************

#include "N76E003.h"
#include "SFR_Macro.h"
#include "Function_define.h"
#include "Common.h"
#include "Delay.h"

#define SYS_CLK_EN              0
#define SYS_SEL                 2
#define SYS_DIV_EN              0                   //0: Fsys=Fosc, 1: Fsys = Fosc/(2*CKDIV)
#define SYS_DIV                 1
#define I2C_CLOCK               2

#define EEPROM_SLA              0xA0
#define EEPROM_WR               0
#define EEPROM_RD               1

#define LED                     P3
#define PAGE_SIZE               32
#define PAGE_NUMBER             4

#define ERROR_CODE              0x78
#define TEST_OK                 0x00

bit I2C_Reset_Flag;
//========================================================================================================
void Init_I2C(void)
{
        P13_OpenDrain_Mode;                    // Modify SCL pin to Open drain mode. don't forget the pull high resister in circuit
        P14_OpenDrain_Mode;                    // Modify SDA pin to Open drain mode. don't forget the pull high resister in circuit
    
    /* Set I2C clock rate */
    I2CLK = I2C_CLOCK; 

    /* Enable I2C */
    set_I2CEN;                                   
}
//========================================================================================================
void I2C_SI_Check(void)
{
        if (I2STAT == 0x00)
        {
                I2C_Reset_Flag = 1;
                set_STO;
                SI = 0;
                if(SI)
                {
                        clr_I2CEN;
                        set_I2CEN;
                        clr_SI;
                        clr_I2CEN;        
                }     
        }    
}

void One_Page_Read(UINT8 u8PageNumber,UINT8 u8DAT)
{
    UINT8  u8Count;
    UINT16 u16Address;

    u16Address = (UINT16)u8PageNumber*32;

    /* Step1 */
    set_STA;                                /* Send Start bit to I2C EEPROM */
    clr_SI;
    while (!SI);
    if (I2STAT != 0x08)                     /* 0x08:  A START condition has been transmitted*/
    {
        I2C_Reset_Flag = 1;
                printf("\nI2C 'Send STA' error");
                goto Read_Error_Stop;
    }

    /* Step2 */
    I2DAT = (EEPROM_SLA | EEPROM_WR);       /* Send (SLA+W) to EEPROM */
    clr_STA;                                /* Clear STA and Keep SI value in I2CON */    
    clr_SI;
    while (!SI);
    if (I2STAT != 0x18)                     /* 0x18: SLA+W has been transmitted; ACK has been received */              
    {
                I2C_Reset_Flag = 1;
        printf("\nI2C 'Send SLA+W' error");
                goto Read_Error_Stop;
    }

    /* Step3 */
    I2DAT = HIBYTE(u16Address);             /* Send I2C EEPROM's High Byte Address */
    clr_SI;
    while (!SI);
    if (I2STAT != 0x28)                     /* 0x28:  Data byte in S1DAT has been transmitted; ACK has been received */              
    {
                I2C_Reset_Flag = 1;
        printf("\nI2C 'Send I2C High Byte Address' error");
                goto Read_Error_Stop;
    }

    /* Step4 */
    I2DAT = LOBYTE(u16Address);             /* Send I2C EEPROM's Low Byte Address */
    clr_SI;
    while (!SI);
    if (I2STAT != 0x28)                     /* 0x28:  Data byte in S1DAT has been transmitted; ACK has been received */             
    {
                I2C_Reset_Flag = 1;
                printf("\nI2C 'Send I2C Low Byte Address' error");
                goto Read_Error_Stop;
    }

    /* Step5 */
    set_STA;                                /* Repeated START */
    clr_SI; 
    while (!SI);
    if (I2STAT != 0x10)                     /* 0x10: A repeated START condition has been transmitted */
    {
                I2C_Reset_Flag = 1;
        printf("\nI2C 'Send STA' error");
                goto Read_Error_Stop;
    }

    /* Step6 */
    clr_STA;                                /* Clear STA and Keep SI value in I2CON */
    I2DAT = (EEPROM_SLA | EEPROM_RD);       /* Send (SLA+R) to EEPROM */
    clr_SI;
    while (!SI);
    if (I2STAT != 0x40)                     /* 0x40:  SLA+R has been transmitted; ACK has been received */              
    {
                I2C_Reset_Flag = 1;
        printf("\nI2C 'Send SLA+R' error");
                goto Read_Error_Stop;
    }

    /* Step7 */                             /* Verify I2C EEPROM data */
    for (u8Count = 0; u8Count <PAGE_SIZE; u8Count++)
    {
        set_AA;                             /* Set Assert Acknowledge Control Bit */
        clr_SI;
        while (!SI);
        if (I2STAT != 0x50)                 /* 0x50:Data byte has been received; NOT ACK has been returned */              
        {
                        I2C_Reset_Flag = 1;
            printf("\nI2C 'No Ack' error");
                        goto Read_Error_Stop;
        }
       
        if (I2DAT != u8DAT)                 /* Send the Data to EEPROM */    
        {
                        I2C_Reset_Flag = 1;
                        printf("\nI2C 'Read data' error");
            goto Read_Error_Stop;
        }
        u8DAT = ~u8DAT; 
    }

    /* Step8 */
    clr_AA;                                 /* Send a NACK to disconnect 24xx64 */
    clr_SI;
    while (!SI);
    if (I2STAT != 0x58)                     /* 0x58:Data byte has been received; ACK has been returned */
    {
        I2C_Reset_Flag = 1;
        printf("\nI2C 'Ack' error");
        goto Read_Error_Stop;
    }
    
    /* Step9 */    
      clr_SI;
    set_STO;
        while (STO)                        /* Check STOP signal */
        {
            I2C_SI_Check();
            if (I2C_Reset_Flag)
                goto Read_Error_Stop;
        }
        
Read_Error_Stop: 
        if (I2C_Reset_Flag)
        {
                I2C_SI_Check();
              printf("\nI2C Read error, test stop");
                I2C_Reset_Flag = 0;
        }
}
//========================================================================================================
void One_Page_Write(UINT8 u8PageNumber,UINT8 u8DAT)
{
    UINT8  u8Count;
    UINT16 u16Address;

    u16Address = (UINT16)u8PageNumber*32;

    /* Step1 */
    set_STA;                                /* Send Start bit to I2C EEPROM */         
    clr_SI;
    while (!SI);
    if (I2STAT != 0x08)                     /* 0x08:  A START condition has been transmitted*/
    {
        I2C_Reset_Flag = 1;
        printf("\nI2C 'Send STA' error");
        goto Write_Error_Stop;
    }

    /* Step2 */
    clr_STA;                                /* Clear STA and Keep SI value in I2CON */
    I2DAT = EEPROM_SLA | EEPROM_WR;         /* Send (SLA+W) to EEPROM */
    clr_SI;
    while (!SI);
    if (I2STAT != 0x18)                     /* 0x18: SLA+W has been transmitted; ACK has been received */             
    {
        I2C_Reset_Flag = 1;
        printf("\nI2C 'Send SLA+W' error");
        goto Write_Error_Stop;
    }

    /* Step3 */
    I2DAT = HIBYTE(u16Address);             /* Send EEPROM's High Byte Address */
    clr_SI;
    while (!SI);
    if (I2STAT != 0x28)                     /* 0x28:  Data byte in S1DAT has been transmitted; ACK has been received */
    {
        I2C_Reset_Flag = 1;
        printf("\nI2C 'Send High byte address' error");
        goto Write_Error_Stop;
    }

    /* Step4 */
    I2DAT = LOBYTE(u16Address);             /* Send EEPROM's Low Byte Address */
    clr_SI;
    while (!SI);
    if (I2STAT != 0x28)                     /* 0x28:  Data byte in S1DAT has been transmitted; ACK has been received */
    {
        I2C_Reset_Flag = 1;
        printf("\nI2C 'Send Low byte address' error");
        goto Write_Error_Stop;
    }

    /* Step5 */
                                            /* Write data to I2C EEPROM */
    for (u8Count = 0; u8Count < PAGE_SIZE; u8Count++)
    {
        I2DAT = u8DAT;                      /* Send data to EEPROM */
        clr_SI;
        while (!SI);
        if (I2STAT != 0x28)                 /* 0x28:  Data byte in S1DAT has been transmitted; ACK has been received */
        {
            I2C_Reset_Flag = 1;
                        printf("\nI2C 'Write Data' error");
            goto Write_Error_Stop;
        }   
        u8DAT = ~u8DAT;        
    }
                                            //After STOP condition, a inner EEPROM timed-write-cycle 
                                            //will occure and EEPROM will not response to outside command
                                            /* 0x18: SLA+W has been transmitted; ACK has been received */
    /* Step6 */
    do
    {
              set_STO;                            /* Set I2C STOP Control Bit */
        clr_SI;
        while (STO)                        /* Check STOP signal */
                {
                    I2C_SI_Check();
                    if (I2C_Reset_Flag)
                        goto Write_Error_Stop;
                }
        
        set_STA;                            /* Check if no ACK is returned by EEPROM, it is under timed-write cycle */
        clr_SI;
        while (!SI);
        if (I2STAT != 0x08)                 /* 0x08:  A START condition has been transmitted*/
        {
            I2C_Reset_Flag = 1;
            printf("\nI2C 'Wait Ready' error");
            goto Write_Error_Stop;
        }

        clr_STA;                            /* Clear STA and Keep SI value in I2CON */
        I2DAT = (EEPROM_SLA | EEPROM_WR);   /* Send (SLA+W) to EEPROM */
        clr_SI;
        while (!SI);
    }while(I2STAT != 0x18);

    /* Step7 */
    set_STO;                                /* Set STOP Bit to I2C EEPROM */
    clr_SI;
        while (STO)                        /* Check STOP signal */
        {
            I2C_SI_Check();
            if (I2C_Reset_Flag)
                goto Write_Error_Stop;
        }
        
Write_Error_Stop: 
        if (I2C_Reset_Flag)
        {
                I2C_SI_Check();
                I2C_Reset_Flag    = 0;
                printf("\nI2C Write error, test stop");
        }
        
        
}
//========================================================================================================
void main(void)
{

    Set_All_GPIO_Quasi_Mode;
        InitialUART0_Timer3(115200);
  
    /* Initial I2C function */
    Init_I2C();                                 //initial I2C circuit
    
    /* page0 R/W */
    printf ("\n\n24LC64 Page0 Write (0x55,0xAA...)...");
    One_Page_Write(0,0x55);                     //page0, write 0x55,0xAA,........

    printf ("\n\n24LC64 Page0 Read...");
    One_Page_Read (0,0x55);                     //page0, read  0x55,0xAA,........

    /* page1 R/W */
    printf ("\n\n24LC64 Page1 Write (0x00,0xFF...)...");
    One_Page_Write(1,0x00);                     //page1, write 0x00,0xFF,........
    printf ("\n\n24LC64 Page1 Read...");
    One_Page_Read (1,0x00);                     //page1, read  0x00,0xFF,........

    /* page2 R/W */
    printf ("\n\n24LC64 Page2 Write (0xAA,0x55...)...");
    One_Page_Write(2,0xAA);                     //page2, write 0xAA,0x55,........
    printf ("\n\n24LC64 Page2 Read...");
    One_Page_Read (2,0xAA);                     //page2, read  0xAA,0x55,........

    /* page3 R/W */
    printf ("\n\n24LC64 Page3 Write (0xFF,0x00...)...");
    One_Page_Write(3,0xFF);                     //page3, write 0xFF,0x00,........
    printf ("\n\n24LC64 Page3 Read...");
    One_Page_Read (3,0xFF);                     //page3, read  0xFF,0x00,........

    /* page255 R/W */
    printf ("\n\n24LC64 Page255 Write (0x0F,0xF0...)...");
    One_Page_Write(255,0x0F);                   //page255, write 0x0F,0xF0,........
    printf ("\n\n24LC64 Page255 Read...");
    One_Page_Read (255,0x0F);                   //page255, read  0x0F,0xF0,........

    /* ==== Test Pass ==== */      
    printf ("\n\N76E003 <--> 24LC64, I2C Demo Code test pass...");

    while (1);
/* =================== */
}
聯系方式0755-82591179

郵箱:ivy@yingtexin.net

地址:深圳市南山區桃源街道平山社區平山一路2號南山云谷創業園二期11棟410-411

久久精品99久久_亚洲一区二区综合_狠狠色伊人亚洲综合成人_亚洲综合爱爱久久网
色一情一区二区三区| 中国一级黄色录像| 熟女少妇在线视频播放| www.男人天堂网| 男女h黄动漫啪啪无遮挡软件| www.天天射.com| 中文字幕视频在线免费观看| 精品视频一区二区在线| 日本成年人网址| aaa毛片在线观看| 男女无套免费视频网站动漫| 熟女性饥渴一区二区三区| 欧美国产亚洲一区| 久久久999视频| 成人性生生活性生交12| 中文字幕第17页| 精品国产乱码久久久久久1区二区| 午夜久久久精品| 国产不卡的av| 黄色国产一级视频| 亚洲三级视频网站| 夜夜爽久久精品91| 日本男女交配视频| 免费看a级黄色片| 国产又黄又猛的视频| 看全色黄大色大片| 日韩手机在线观看视频| 久久久精品视频国产| 日韩精品一区二区免费| 老熟妇仑乱视频一区二区| 99国产精品久久久久久| 日韩精品一区在线视频| 国产视频1区2区3区| 国产91在线亚洲| 亚洲成人福利在线观看| av动漫在线播放| 久久久久久三级| 妞干网视频在线观看| 欧美日韩一区二区在线免费观看| 婷婷中文字幕在线观看| a在线视频观看| 91免费网站视频| 精品久久久噜噜噜噜久久图片| 波多野结衣在线免费观看| 浮妇高潮喷白浆视频| 日本美女久久久| 天天操天天爽天天射| 国产精品自拍合集| 91xxx视频| 日韩av片专区| 国产精品一区二区羞羞答答| 国产精品裸体瑜伽视频| 一级黄色大片儿| 少妇一级淫免费放| 欧美性受xxxx黒人xyx性爽| 久久福利一区二区| 超碰97人人射妻| 国内外免费激情视频| 国产男女免费视频| 男女猛烈激情xx00免费视频| 免费无码毛片一区二三区| 国产二区视频在线| 老头吃奶性行交视频| 久久亚洲a v| 91最新在线观看| www.亚洲成人网| 亚洲精品国产suv一区88| 午夜精品免费看| 91 视频免费观看| 色婷婷综合网站| 中文字幕视频三区| mm131国产精品| 捷克做爰xxxⅹ性视频| 一区二区三区视频网| 春日野结衣av| 日本成人中文字幕在线| 无码内射中文字幕岛国片| 黄色三级视频片| 人人爽人人爽av| 中文字幕av导航| av网站手机在线观看| www.夜夜爱| www.欧美日本| 国产在线视频三区| 日韩在线观看a| 又粗又黑又大的吊av| 日韩精品xxxx| 亚洲一区二区三区观看| 超碰97免费观看| 国产又黄又大又粗视频| 又色又爽又高潮免费视频国产| 日本www高清视频| 手机免费看av网站| 日本欧美视频在线观看| 动漫av免费观看| 久久国产精品免费观看| 国产精品专区在线| 第四色婷婷基地| 欧美a级免费视频| 国产三级三级三级看三级| 国产四区在线观看| 乱子伦视频在线看| 成人一区二区av| 成人性做爰aaa片免费看不忠| 999热精品视频| 国模杨依粉嫩蝴蝶150p| wwwjizzjizzcom| 在线观看亚洲色图| 日韩免费一级视频| 中国一级大黄大黄大色毛片| 成年人视频网站免费观看| 国产av不卡一区二区| 亚洲少妇久久久| 老太脱裤子让老头玩xxxxx| 操人视频免费看| 日本高清久久久| 国产精品动漫网站| 丰满的少妇愉情hd高清果冻传媒| 国产欧美一区二| 牛夜精品久久久久久久| 国产精品视频网站在线观看| 国产大片一区二区三区| 亚洲这里只有精品| 国产精品无码av无码| 你懂的av在线| av在线免费观看国产| 无码人妻精品一区二区蜜桃百度| a在线观看免费视频| 色一情一乱一伦一区二区三区日本| 国产中文字幕二区| 东北少妇不带套对白| 男女激情免费视频| www.夜夜爱| 少妇高潮毛片色欲ava片| a级黄色片免费| 精品少妇人欧美激情在线观看| 亚洲欧美一二三| 国产激情在线看| 国产一区二区三区乱码| 免费看污污视频| 国产欧美日韩小视频| 日韩一级特黄毛片| 青青青国产在线观看| 2018国产在线| 国内外免费激情视频| 欧美精品性生活| 亚洲综合在线一区二区| avove在线观看| 免费成人午夜视频| 激情五月婷婷久久| 免费看啪啪网站| 国产曰肥老太婆无遮挡| 日韩av综合在线观看| 久热精品在线播放| 日韩人妻精品一区二区三区| 91成人综合网| 嫩草影院国产精品| 91精品一区二区三区四区| 国产日韩欧美精品在线观看| www日韩在线观看| 老司机午夜网站| 日韩精品免费播放| 天天看片天天操| av免费观看网| 日本福利视频导航| 亚洲熟妇av日韩熟妇在线| 潘金莲激情呻吟欲求不满视频| 女女同性女同一区二区三区按摩| 无码av天堂一区二区三区| 狠狠躁狠狠躁视频专区| 少妇高潮大叫好爽喷水| 黑人粗进入欧美aaaaa| 欧美 国产 精品| 亚洲一级免费在线观看| av日韩一区二区三区| 天美一区二区三区| 999在线免费视频| 欧美视频在线观看视频| 中文字幕在线视频精品| 久久久噜噜噜www成人网| 亚洲欧美一二三| 成人不卡免费视频| 久久午夜夜伦鲁鲁一区二区| 日韩a级在线观看| 欧美大片免费播放| 亚洲综合激情五月| 艹b视频在线观看| 可以在线看的黄色网址| 18禁裸男晨勃露j毛免费观看| 亚洲图色中文字幕| 亚洲精品一二三四五区| 日韩一级免费在线观看| 国产成人无码精品久久久性色| 狠狠精品干练久久久无码中文字幕 | 黄色一级片网址| 亚洲一区在线不卡| 91淫黄看大片| 在线观看免费黄网站| 超碰超碰在线观看| 欧美一级黄色影院|