新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 24LCxx系列的EEPROM的讀寫程序實例

        24LCxx系列的EEPROM的讀寫程序實例

        作者: 時間:2012-08-12 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/171046.htm

        banksel I2C_Ctrl
        movlw _CMD ; Load command address @ 0xA0
        movwf I2C_Ctrl
        movlw 0x00 ; Select location at 0x00
        movwf I2C_Addr
        movlw 0xAA ; Write data 0x5A to location 0x00 of EEPROM
        movwf I2C_Data
        call EE_Byte_Write
        ;
        Test2 call EE_Ack_Check ; Polling Acknowledge for next access
        ;
        banksel I2C_Data
        movlw 0x00 ; Clear I2C data buffer
        movwf I2C_Data
        ;
        Test3
        banksel I2C_Ctrl
        movlw EEPROM_CMD ; Load EEPROM command address @ 0xA0
        movwf I2C_Ctrl
        movlw 0x00
        movwf I2C_Addr
        call EE_Random_Read
        ;
        goto $
        ;

        ;
        ;******************************************************
        ;* Random Read a Byte from EEPROM
        ;*
        ;* Input:
        ;* - I2C_Ctrl : Control Byte of EEPROM
        ;* - I2C_Addr : Location of EEPROM
        ;* Output:
        ;* - I2C_Data : Read Data from EEPROM
        ;******************************************************
        ;
        ; Send Command for RANDOM READ :
        ; Start+ 0xA0 + EE_Address + ReStart + 0xA1 + Read_Data + NAck + Stop
        ;

        EE_Random_Read
        call StartI2C ; Set SSPCON2.SEN
        ;
        bcf I2C_Ctrl,0 ; set for write Command
        movf I2C_Ctrl,W ; Send Slave Address to I2C Bus
        call Send_Byte
        ;
        movf I2C_Addr,W ; Send out the Rendom address of EEPROM
        call Send_Byte
        ;
        call RstartI2C ; Send a Repeat Start to I2C
        ;
        bsf I2C_Ctrl,0 ; set for Read Command
        movf I2C_Ctrl,W ; Send Slave Address to I2C Bus
        call Send_Byte
        ;
        call RecI2C ; Enable I2C Receive
        ;
        BANKSEL SSPBUF
        movf SSPBUF,W ; Save to I2C_Data First !!
        movwf I2C_Data

        call Non_Ack ; Initial NACK Response !!

        call StopI2C ; Initial STOP Condition
        return
        ;
        ;***************************************************************
        ;* Sequential Read from EEPROM
        ;*
        ;* Input:
        ;* - I2C_Ctrl : Control Byte of EEPROM
        ;* - I2C_Addr : Start Location of EEPROM
        ;* - I2C_Page_Length : How many byte need to read
        ;* Output:
        ;* - I2C_SEQU_Buffer : Sequential Read Data buffer
        ;*
        ;***************************************************************
        ;
        ; Send Command for RANDOM READ :
        ; Start+ 0xA0 + EE_Address + ReStart + 0xA1 + Read_Data + NAck + Stop
        ;
        EE_SEQU_Read
        call StartI2C ; Set SSPCON2.SEN
        ;
        bcf I2C_Ctrl,0 ; set for write Command
        movf I2C_Ctrl,W ; Send Slave Address to I2C Bus
        call Send_Byte
        ;
        movf I2C_Addr,W ; Send out the Rendom address of EEPROM
        call Send_Byte
        ;
        call RstartI2C ; Send a Repeat Start to I2C
        ;
        bsf I2C_Ctrl,0 ; set for Read Command
        movf I2C_Ctrl,W ; Send Slave Address to I2C Bus
        call Send_Byte
        ;
        movlw I2C_SEQU_Buffer
        movwf FSR
        ;
        _Sequ_Loop call RecI2C ; Enable I2C Receive
        BANKSEL SSPBUF
        movf SSPBUF,W ; Save to I2C_Data First !!
        movwf INDF
        incf FSR,F
        decfsz I2C_Page_Length,F
        goto _Cont_Read
        goto _End_Read
        _Cont_Read call An_Ack
        goto _Sequ_Loop
        ;
        _End_Read call Non_Ack ; Initial NACK Response !!
        call StopI2C ; Initial STOP Condition
        return
        ;
        ;******************************************************
        ;* EEPROM Acknowledge Polling
        ;*
        ;* -- The routine will polling the ACK
        ;* response from EEPROM
        ;* -- ACK=0 return
        ;* -- ACK=1 send Restart loop check
        ;*
        ;******************************************************
        ;
        EE_Ack_Check
        call StartI2C ; Set SSPCON2.SEN

        bcf I2C_Ctrl,0 ; Clear for Write Command
        movf I2C_Ctrl,W ; Send Slave Address to I2C Bus
        call Send_Byte
        _Ack_Polling
        BANKSEL SSPCON2
        btfss SSPCON2,ACKSTAT ; Check ACKSTAT bit , 0 = ACK , 1 = NACK
        goto ACK_Return ; Ack = 0 ; EEPROM is Ready
        _Ack_Hi ; Ack = 1 ; EEPROM is Busy for Write
        call Delay_mS ; Delay 500uS for next Ack polling
        call RstartI2C ; Send a Repeat Start to I2C
        bcf I2C_Ctrl,0 ; Clear for Write Command
        movf I2C_Ctrl,W ; Send Slave Address to I2C Bus
        call Send_Byte
        goto _Ack_Polling

        ACK_Return
        call StopI2C ; Initial STOP Condition
        return
        ;
        ;**********************************************************
        ;* Page Write 1 to 8 Bytes to EEPROM
        ;*
        ;* Input:
        ;* - I2C_Ctrl : Control Byte of EEPROM
        ;* - I2C_Addr : Location of EEPROM
        ;* - I2C_Page_Buffer: RAM location of Data
        ;* - I2C_Page_Length : Data length count
        ;*
        ;**********************************************************
        ;
        ; Send Command for PAGE WRITE :
        ; Start+ 0xA0 + EE_Address + W_Data 0+ .. + W_Data N + Stop
        ;
        EE_Page_Write
        movf I2C_Page_Length,W
        btfsc STATUS,Z
        return
        ;
        call StartI2C ; Set SSPCON2.SEN
        ;
        bcf I2C_Ctrl,0 ; Clear for Write Command
        movf I2C_Ctrl,W ; Send Slave Address to I2C Bus
        call Send_Byte
        ;
        movf I2C_Addr,W ; Send out the Command
        call Send_Byte
        ;
        movlw I2C_Page_Buffer
        movwf FSR
        _W1 movf INDF,W
        call Send_Byte
        incf FSR,F
        decfsz I2C_Page_Length,F
        goto _W1
        ;
        call StopI2C ; Initial STOP Condition
        return
        ;
        ;
        ;*******************************************************
        ;* Write a Byte to EEPROM
        ;*
        ;* Input:
        ;* - I2C_Ctrl : Control Byte of EEPROM
        ;* - I2C_Addr : Location of EEPROM
        ;* - I2C_Data : Data to EEPROM



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 梅河口市| 墨脱县| 莱州市| 沁源县| 崇州市| 北海市| 潞西市| 朝阳区| 青川县| 华阴市| 湖北省| 鄂托克旗| 清徐县| 改则县| 汉寿县| 深州市| 营山县| 邯郸市| 沾益县| 剑河县| 衢州市| 龙门县| 永康市| 定西市| 靖安县| 贞丰县| 竹北市| 扬中市| 大英县| 大渡口区| 隆林| 武川县| 巴林左旗| 泰顺县| 天长市| 布尔津县| 兰坪| 新野县| 新沂市| 深州市| 辰溪县|