使用PIC读写1-wire EEPROM DS2430的实例程序

时间:2012-08-12来源:网络

;------------------------------------------------
; template to init before read
; to DS2430
;-------------------------------------------------
; movlw H'00'
; movwf Addr

;-------------------------------------------------
; read DS2430 one byte
; input
; Addr = starting address to read
; output
; RxB = data to read
;--------------------------------------------------
RdDS2430
call REE2ScratchPAD
call HostRdScratchPAD
return


;;--------- host read scratch pad ----------------------------
;; save desired data into RxB
;;
;;--------------------------------------------------------------

HostRdScratchPAD
call DS2430AInitState
banksel TxB
movlw SkipROM
movwf TxB
call TxBYTE ; SkipROM

movlw RScratch ; read scratch PAD Command
movwf TxB
call TxBYTE

movf Addr,W ; starting address to read
movwf TxB
call TxBYTE

call R2430A ; read desired scratch pad into RxB
call RstPulse
return


;-------------- write memory scratch scratch pad ------------------------
; write one byte into scratch PAD
; input
; Addr = starting address to write
; TxBuffer = data to save
; output
; ErrCode = 0 -> write ok
; = 1 -> write fail
;---------------------------------------------------------------------------

WrScratchPAD
call DS2430AInitState
movlw SkipROM ; 0xCC
movwf TxB
call TxBYTE ; SkipROM

movlw WScratch ; write memory scratch pad, 0x0f
movwf TxB
call TxBYTE

movf Addr,W ; starting address of memory scratch pad
movwf TxB ; TxBYTE use TxB
call TxBYTE

movf TxBuffer,W ;
movwf TxB
call TxBYTE
call RstPulse ; reset pulse
call delay500us ; wait presence pulse
return

;---------- CP2EE ---copy whole scratch pad to EE ----------------------
; write memory scratch
; verify memory scratch
; copy memory scratch to EE
;----------------------------------------------------------------------
CP2EE
call DS2430AInitState ; 0x55 + 0xa5 + hi 10ms // [ScratchPad -> EEPROM ]
banksel TxB
movlw SkipROM
movwf TxB
call TxBYTE ; SkipROM
movlw CPScratch ; 0x55
movwf TxB
call TxBYTE
movlw H'a5'
movwf TxB
call TxBYTE
call ForceHi ; min 10ms refter to datasheet
return

;--------- REE2ScratchPAD --- copy whole EE to ScrathPAD ----------------
; copy EE to whole memory scatch
; read memory scratch
;format I: 0xf0 + Addr +R +R + reset pulse, copy byte by byte
;format II: 0xf0 + Addr + reset pulse, copy whole
;------------------------------------------------------------------------
REE2ScratchPAD
call DS2430AInitState
banksel TxB
movlw SkipROM
movwf TxB
call TxBYTE ; SkipROM
movlw REEROM ;; Read from EE into ScratchPAD
movwf TxB
call TxBYTE ;;
call RstPulse ;; copy all
return

;----------R2430A ---- Host read the scratch PAD ------------------------
; Read 2430A Scratch PAD
; LSB first
; save the result in RxB
;------------------------------------------------------------------------

R2430A ; returns byte in RxB
movlw .8
movwf LoopCounter
clrf RxB
RLoop
call SetLo ;
nop
call SetHi ; it will pull up by resistor
nop ; delay to sample reliable bit
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop

banksel PORTB
movf PORTB,W
movwf Temp
btfss Temp,Bit2

goto gLo
bsf CARRY
goto rol
gLo
bcf CARRY
rol
banksel RxB
rrf RxB,F
call delay60us ; tdrv + trelease
banksel LoopCounter
decfsz LoopCounter,F
goto RLoop
movf RxB,W ; save the result in W
return

;----------------------------------------------------------
; strong pull up
;
;----------------------------------------------------------
ForceHi

bsf PBDir,Bit2
movf PBDir,W ;; input

banksel TRISB
movwf TRISB ;; set input, pull by external resistor
call delay100ms
bcf PBDir,Bit2 ;; output
movf PBDir,W
movwf TRISB
return
;-------------------------------------------------------------
; reset pulse
;
;--------------------------------------------------------------
RstPulse
call SetHi
call SetLo
call delay500us
call SetHi ;Pull up by resistor
return
;---------------------------------------------------------------
; reset pulse followed presence pulse
;
;---------------------------------------------------------------
DS2430AInitState
call SetHi
call SetLo
call delay500us ; reset pulse
call SetHi
call delay500us ; presence pulse, pull up by resistor
return


;-----------------------------------------------------------------------

init
movlw H'3f'
movwf PBDir ; 0x00111111
banksel TRISB
movwf TRISB ; force all portC as input
; movlw b'00000000' ; GP2 pull-up,GP4 output
; movwf WPU ; connect the D of DS2430A to Port A
;--------------------------------------------------------------------
; toggle from bank0 to bank1
; option register
; 7: 1: port A pull-up OFF, 0:port A pull-up ON
; 6: 1: rising INT , 0:fall INT
; 5: 1: T0CKI to TMR0, 0: internal cycle to TMR0
; 4: 1: Hi to Lo count 0: Lo to Hi count
; 3: 1: Precale to WDT 0: Prescale to TMR0
; 2:0 prescale value
;---------------------------------------------------------------------
movlw b'11000010' ;; pull-up ON,rising INT, internal cycle to TMR0,Lo to Hi count,Pre to TMR0,1:8
movwf OPTION_REG ;; ,prescal over 8
banksel INTCON
clrf INTCON
clrf PORTB
movlw 0x07 ;; comparator off
movwf CMCON ;; comparator off
clrf TMR0

;;--------------------------------------------------------
;; 7: X
;; 6: 1: Timer1 on if T1G
;; 5:4 : 11:/8,10:/4,01:/2,00:/1
;; 3 : 1 LP for timer 1 on, 0: LP for timer1 of
;; 2 : 1 do not sync external , 0 sync external clock
;; 1 : 1: clock source external , 0: clock source internal
;; 0 : 1: enable timer 1 ,0: disable timer 1
;;---------------------------------------------------------

; movlw b'00000000' ;x,no gate control,over 8,LP osc to timer1 off,x,internal clock,stop timer
; movwf T1CON
movlw b'00111000'
movwf T1CON
clrf PIR1
return

;;-------------------------
;; init interrup enable,
;;-------------------------
init_int_en

1 2 3

关键词: DS2430 实例 程序 EEPROM 1-wire PIC 读写 使用

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版