您当前的位置:五五电子网电子知识单片机-工控设备源码-程序读写24LCxx系列的EEPROM的实例程序 正文
读写24LCxx系列的EEPROM的实例程序

读写24LCxx系列的EEPROM的实例程序

点击数:7144 次   录入时间:03-04 11:36:41   整理:http://www.55dianzi.com   源码-程序
;
   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               

上一页  [1] [2] [3]  下一页


本文关键字:程序  源码-程序单片机-工控设备 - 源码-程序