Interfacing with a Dallas DS2430A 256-bit EEPROM

copyright, Peter H. Anderson, Baltimore, MD, April, '98


Introduction

This discussion focuses on interfacing a Dallas DS2430A 256 bit (32 byte) EEPROM with a PIC12C508.

Microchip has announced a number of 8-pin PICs which include on chip EEPROM. However, the DS2430A is a relatively inexpensive alternative for PICs that do no have on-board EEPROM. The DS2430 uses only one of the PICs I/O leads.

A data sheet for the DS2430A is available at http://www.dalsemi.com. We sell the DS2430A in a TO-92 package.

Details

The following example illustrates how N bytes may be written to EEPROM, beginning at a specific address and how they may tehn be read. In this example, the eight values to write are dummied and nothing is done with the values which are read.

Note that the DS2430A contains a volatile scratch pad. Data is first written to this scratch pad using the 0F command and the entire scratch pad is programmed to EEPROM using the 55 command followed by the validation key A5. However, note that the entire scratch pad is programmed to EEPROM.

Thus, if one desires to only modify specific bytes, the EEPROM content is first transferred to the scratch pad using the F0 command, the specific bytes are written to the scratch pad (0F) and the entire scatch pad is programmed to EEPROM (55 followed by the validation code).

Data is read by transferring EEPROM to scratch pad (F0), followed by the address of the first byte followed by sequential reads.

Note that in the example, the device lasered ROM addressing capability of the Dallas 1-wire family is not used. Rather the skip ROM (CC) feature is used.

The following example does not show an interesting write capability to the 64-bit application register followed by a copy and lock.


; Program 2430_1.asm
;
; Performs temperature measurment.  No addressing.
;
; Illustrates use of DS2430A 1-W 256 bit EEPROM
;
; 12C508			                 DS2430A		
; GPIO.0 (term 7) ------------------------------ DQ (term 2)
;
; copyright, P. H. Anderson
	
	LIST p=12C508
#include <p12C508.inc>	
	__CONFIG 0EH	; MCLR dis, CP off, WDT enabled, INTRC

	CONSTANT DATA_PIN=0

	CONSTANT BASE_VAR=07H

	CONSTANT DATA_BUFF=18H
	CONSTANT BUFF_SIZE=8


PIN_DIRS        EQU BASE_VAR+0
N		EQU BASE_VAR+1
ADR		EQU BASE_VAR+2

INDEX	   	EQU BASE_VAR+2	; these vars used by the 
O_BYTE	   	EQU BASE_VAR+3	; common 1-wire routines
I_BYTE	   	EQU BASE_VAR+4

LOOP2	   	EQU BASE_VAR+5
LOOP1	   	EQU BASE_VAR+6
TEMP	   	EQU BASE_VAR+7


B0		EQU DATA_BUFF+0	; first location in DATA_BUFF
B1		EQU DATA_BUFF+1
B2   		EQU DATA_BUFF+2
B3	   	EQU DATA_BUFF+3
B4		EQU DATA_BUFF+4
B5		EQU DATA_BUFF+5
B6   		EQU DATA_BUFF+6
B7		EQU DATA_BUFF+7
	
		ORG 000H	        

MAIN:
	MOVLW	0C0H	; GPWU dis, GPPU dis, other bits are not used
        OPTION	

        MOVLW	1FH
        MOVWF	PIN_DIRS	; make all I/Os inputs
        TRIS	GPIO

	CALL	DUMMY_VARS	; set B7 - B0 to some values

; the following illustrates how to write these eight values to EEPROM
; beginning at EEPROM address 06.

	MOVLW 	06H
	MOVWF 	ADR		; start address of where data is
				; to be stored

 	CALL	INIT		; intitialize DS2430
	
        MOVLW	0CCH		; skip ROM
        MOVWF	O_BYTE
        CALL	OUT_BYTE

        MOVLW	0F0H		; read memory into scratch pad
        MOVWF	O_BYTE
        CALL	OUT_BYTE

	CALL	INIT
	MOVLW	0CCH		; skip ROM
        MOVWF	O_BYTE
        CALL	OUT_BYTE

	MOVLW	0FH		; write scratchpad command
	MOVWF	O_BYTE
	CALL	OUT_BYTE

	MOVF	ADR, W		; address of where to start writing
	MOVWF	O_BYTE
	CALL	OUT_BYTE

	MOVLW	BUFF_SIZE	; number of bytes of data
	MOVWF	N

	MOVLW	18H		; beginning of data buffer
	MOVWF	FSR

WRITE_1:
	MOVF	INDF, W		; get the data
	MOVWF	O_BYTE
	CALL	OUT_BYTE
	INCF	FSR, F
	DECFSZ	N, F
	GOTO	WRITE_1
	
	; done writing to scratch pad
	; now program to EEPROM
	
	CALL	INIT

	MOVLW	0CCH		; skip ROM
        MOVWF	O_BYTE
        CALL	OUT_BYTE

	MOVLW 	55H		; copy scratch pad
	MOVWF	O_BYTE
	CALL	OUT_BYTE

	MOVLW	0A5H		; validation key
	MOVWF	O_BYTE
	CALL	OUT_BYTE

        CALL	STRONG_PULL_UP	; provide strong pull up during conversion

; the following shows how to read 8 bytes beginning at address 06

	CALL	INIT		; intitialize DS2430
	
        MOVLW	0CCH		; skip ROM
        MOVWF	O_BYTE
        CALL	OUT_BYTE

        MOVLW	0F0H		; read memory into scratch pad
        MOVWF	O_BYTE
        CALL	OUT_BYTE

	MOVF	ADR, W		; address of where to read from
	MOVWF	O_BYTE
	CALL	OUT_BYTE

	MOVLW	BUFF_SIZE	; number of bytes of data
	MOVWF	N

	MOVLW	18H		; beginning of data buffer
	MOVWF	FSR

READ_1:
	CALL	IN_BYTE
	MOVF	I_BYTE, W
	MOVWF	INDF
	
	INCF	FSR, F
	DECFSZ	N, F
	GOTO	READ_1
	
	; done reading
DONE:
	GOTO	DONE

DUMMY_VARS:	; dummy up the data buffer with some values

	MOVLW	.8
	MOVWF	B0
	MOVLW	.7
	MOVWF	B1
	MOVLW	.6
	MOVWF	B2
	MOVLW	.5
	MOVWF	B3
	MOVLW	.4
	MOVWF	B4
	MOVLW	.3
	MOVWF	B5
	MOVLW	.2
	MOVWF	B6
	MOVLW	.1
	MOVWF	B7
        RETURN

; The following are standard 1-Wire routines.

INIT:
        CALL	PIN_HI
        CALL	PIN_LO

	MOVLW	.50              ; 500 us delay
	CALL DELAY_10USEC

	CALL	PIN_HI		  
        MOVLW 	.50		; 500 usec delay
        CALL DELAY_10USEC

        RETURN

IN_BYTE:              ; returns byte in I_BYTE
	MOVLW	.8
	MOVWF	 INDEX
        CLRF	I_BYTE

IN_BYTE_1:
	CALL PIN_LO		; momentary low on DATA_PIN
        NOP
	CALL PIN_HI
	NOP
	NOP
	NOP
	NOP
	NOP
        NOP
        MOVF	GPIO, W	; 7 usecs later, fetch from DATA_PIN
	MOVWF	TEMP                                                        
	BTFSS	TEMP, DATA_PIN
	BCF STATUS, C		; its a zero
	BTFSC	TEMP, DATA_PIN
	BSF STATUS, C		; its a one

        RRF	I_BYTE, F
	MOVLW .6		; now delay 60 usecs
        CALL	DELAY_10USEC
        DECFSZ	INDEX, F
        GOTO	IN_BYTE_1

        MOVF	I_BYTE, W	; return the result in W
        RETURN

OUT_BYTE:	; sends O_BYTE to 2430
	MOVLW	.8
        MOVWF	INDEX
OUT_BYTE_1:
	RRF	O_BYTE, F
        BTFSS	STATUS, C
	GOTO	OUT_0
	GOTO	OUT_1	
OUT_BYTE_2:
	DECFSZ	INDEX, F
        GOTO	OUT_BYTE_1
        RETURN

OUT_0:
	CALL	PIN_LO		; bring DATA_PIN low
	MOVLW	.6		; for 60 usecs
	CALL 	DELAY_10USEC
        CALL	PIN_HI
        GOTO	OUT_BYTE_2

OUT_1:
	CALL	PIN_LO		; momentary low
        CALL	PIN_HI
        MOVLW .6		; 60 usec delay
	CALL DELAY_10USEC
        GOTO	OUT_BYTE_2

;;;;;;

PIN_HI:
	BSF	PIN_DIRS, DATA_PIN
        MOVF	PIN_DIRS, W
        TRIS	GPIO
        
        RETURN

PIN_LO:
	BCF	GPIO,  DATA_PIN
	BCF	PIN_DIRS, DATA_PIN	
        MOVF	PIN_DIRS, W
        TRIS	GPIO
        
        RETURN

STRONG_PULL_UP:
	BSF	GPIO, DATA_PIN
        BCF	PIN_DIRS, DATA_PIN
        MOVF	PIN_DIRS, W
        TRIS	GPIO
        CALL	DELAY_LONG
        BSF	PIN_DIRS, DATA_PIN
        MOVF	DATA_PIN, W
        TRIS	GPIO
        RETURN
	

DELAY_LONG:
	MOVLW .100	; 100 msec delay
	MOVWF LOOP1
DELAY_N_MS:
OUTTER:
	MOVLW	.110	; close to 1.0 msec delay when set to .110
	MOVWF 	LOOP2
INNER:
	CLRWDT
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	DECFSZ	LOOP2, F	; decrement and leave result in LOOP2 
				; skip next statement if zero
	GOTO INNER
	DECFSZ 	LOOP1, F
	GOTO OUTTER
	RETURN

DELAY_10USEC:	; provides a delay equal to W * 10 usecs
	MOVWF LOOP1
DELAY_10USEC_1:
	CLRWDT
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	DECFSZ LOOP1, F
	GOTO DELAY_10USEC_1
	RETURN

	END