使用PIC单片机读写1-wire EEPROM DS2430的范例程序

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

;

;   1-wire device access

;DS2430

;memory function

;write scratchpad

;read scratchpad

;

;read memory :

;   resource occupy by ICD2

;   PROM 0x1f00 - 0x1fff

;   RAM  0x70,0xf0,0x170,0x1e5~0x1f0

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

;       master                      action

;       0xf0 + start addr(8)  =>     scratchpad(8)   -->  master

;       none                  =>     scratchpad(9)   -->  master

;       none                  => scartchpad(a)   -->  master

;      

;       none                  => scratchpad(0x1f)-->  master[wrap around]

;       reset pulse           =>    stop sending data

;

;       0xf0+reset pulse      =>     EEPROM(0x00-0x1F) --> scratchpad(0x00-0x1F)

; copy scratchpad

;       master

;       0x55 + 0xa5     =>   scratchpad(000-0x1f)    --> EEPROM(0x00-0x1F)

;       held hi for 10ms   

;       0xf0 + reset pulse => copy whole from EEPROM to SCRATCHPAD

;                               use timer as a delay timer

;

;       author  : Rex Chen

;       date    : May,8th

;       ver     : 1.81

;

            list p=16F877A

#include    p16f877a.inc

    __CONFIG _CPD_OFF & _CP_ALL & _DEBUG_ON & _BODEN_OFF & _LVP_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC

     

     

#define OneWireDHi  bsf PORTC,Bit2

#define OneWireDLo  bcf PORTC,Bit2

                     

#define CARRY       STATUS,C

#define ZERO        STATUS,Z

Bit0        equ H'0000'

Bit1        equ H'0001'

Bit2        equ H'0002'

Bit3        equ H'0003'

Bit4        equ H'0004'

Bit5        equ H'0005'

Bit6        equ H'0006'

Bit7        equ H'0007'

;variable defination

    cblock      0x20        ; RAM area 0x20- 0x7f

    SYSFLAG

    TxB                     ; Command buffer been send

    TxBuffer                ; data buffer been send

    RxB                     ; Command buffer been received

    TempB                   ; Temp Byte to roll the data

    LoopCounter

    Addr                    ; address to access BQ2430A

    PBDir                   ; port C direction log file

    PADir                   ; port A direction log file

    Temp

    ErrCode                 ;

    W_SAVE

    STATUS_SAVE

    TxBuf:8                 ; Tx Temp buffer

    Offset

    endc               

     

;;

    cblock  0xa0

    SARS1

    SARS2

    SARS3

    endc   

     

    cblock  0x100

    HateSARS1

    HateSARS2

    HateSARS3

    HateSARS4

    endc

     

    cblock  0x190

    SARSIsAPig0

    SARSIsAPig1

    SARSIsAPig2

    SARSIsAPig3

    SARSIsAPig4

    SARSIsAPig5

    endc   

     

     

;----------------   SYSFLAG ----------------------------------

fTxHi       equ     H'0000'

fTxLo       equ     H'0001'

fRxMode     equ     H'0002'

;;

;;

;;  there are 4 memory block

;;  1. EEPROM & 2. memory scratchpad

;;  3. application register

;;  4.register scratchpad

;; aliase

;;

;; memory function

;; write memory scratch

;; read memory scratch

;; copy memory scratch to EEPROM

;; read EEPROM to memory scratch

;;

WScratch    equ     H'0F'       ; 0x0f + Addr + data + data + .+ reset pulse

                                ; // [Master --> ScratchPad ]

RScratch    equ     H'AA'       ; 0xaa + Addr + R + R +.. + reset pulse

                                ; // [ScratchPad --> Master ]

CPScratch   equ     H'55'       ; 0x55 + 0xa5 + hi 10ms     // [ScratchPad --> EEPROM ]

REEROM      equ     H'F0'       ; 0xf0 + Addr +R +R + reset pulse

                                ; // [EEPROM(addr) --> ScratchPad]

                                ; 0xf0 + reset pulse        // [EEPROM --> ScratchPad]

;; application register , application register is OTP, there are 7 bytes

;; pay attention when you use application register , it's a 64 bit OTP

WApR        equ     H'99'       ; 0x99 + Addr + data + data .. + reset pulse

                                ; [Master  --> Application Reg]

RStatus     equ     H'66'       ; 0x66 + 0x00 + status + reset pulse

RApR        equ     H'C3'       ; 0xc3 + addr + data + .. + reset pulse

                                ; application register --> master  ( locked)

                                ; register scratchpad  --> master  ( not lock)

LockAp      equ     H'5A'       ; 0x5A + 0xa5

                                ; [ register scratchpad --> application register]

                                ; 0x5A + reset pulse    cancel copy command

                                ; a OTP type do once only

                         

                         

AppLocked   equ     B'11111100' ; application locked, the value is data in the status

                                 

                                 

;; ROM function command// implement skip rom only

SkipROM     equ     H'CC'   ;access memory directly

SerachROM   equ     H'f0'   ;read a bit , read the complement of the bit,write bit

MatchROM    equ     H'55'   ;0x55 + 64 bit rom bit  

ReadROM     equ     H'33'   ;[family code & serial number & CRC ==> master ]

     

            org         H'00'

            nop

            goto    main

             

;;ISR       **

            org     H'04'

            goto    isr        

isr

            movwf   W_SAVE              ;; W_SAVE=W

            swapf   STATUS,W            ;;

            movwf   STATUS_SAVE         ;; STATUS_SAVE=STATUS[3:0]& STATUS[7:4]

            btfss   PIR1,TMR1IF         ;; TMR1IF

            goto    exit_int_source_check

                                        ;; timer 1 service                                     

            nop

            nop

            nop

            nop

                                         

                                         

exit_int_source_check                   ;; restore STATUS & W before exit from

            swapf   STATUS_SAVE,W       ;; W=STATUS_SAVE=STATUS[3:0]& STATUS[7:4]

            movwf   STATUS                 

            swapf   W_SAVE,F            ;; restore W

            swapf   W_SAVE,W                                       

            retfie

;; ISR      &&&        

main                                       

         

        call    init

        call    init_int_en

        movlw   H'21'

        movwf   FSR

        movlw   H'3c'

        movwf   INDF                    ;

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

;---------  read test --------------------------       

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

;       movlw   H'00'

;       banksel Addr

;       movwf   Addr   

;       call    RdDS2430

         

;       movlw   H'01'

;       banksel Addr

;       movwf   Addr   

;       call    RdDS2430

;      

;       movlw   H'02'

;       banksel Addr

;       movwf   Addr   

;       call    RdDS2430

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

;       banksel Offset

;       clrf    Offset 

;       pagesel VendorTable

;       call    VendorTable

;       movwf   Temp

;      

;

         

        movlw   H'00'

        banksel Addr

        movwf   Addr       

        movlw   H'34'

        banksel TxBuffer

        movwf   TxBuffer

        call    WrDS2430

         

        movlw   H'01'

        banksel Addr

        movwf   Addr

        movlw   H'35'      

        banksel TxBuffer

        movwf   TxBuffer

        call    WrDS2430       

         

        movlw   H'02'

        banksel Addr

        movwf   Addr

        movlw   H'36'

        banksel TxBuffer

        movwf   TxBuffer

        call    WrDS2430       

         

                 

;-------- read address 0 --------------------------    

        movlw   H'00'

        movwf   Addr   

        call    RdDS2430

         

        goto    $                  

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

;   template to init before write

;   to DS2430

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

;       movlw   H'00'

;       movwf   Addr       

;       movlw   H'3C'

;       movwf   TxBuffer       

         

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

;   write DS2430 one byte

;   input

;   Addr = starting address to write

;   TxB  = data to save

;   output  =

;   ErrCode = 0 -> write ok

;           = 1 -> write fail

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

WrDS2430       

        call    WrScratchPAD

        call    CP2EE

        return

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

;   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    

    banksel INTCON

    bsf INTCON,GIE          ;; GIE=1

    bcf INTCON,PEIE         ;;

    bcf INTCON,T0IE         ;; T0IE=1

    bcf INTCON,INTE         ;; GP2 interrupt enable

;   bcf INTCON,RAIE         ;; disable GPIO port change interrupt

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

;   clear int flag

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

    bcf INTCON,T0IF

    bcf INTCON,INTF

;   bcf INTCON,RAIF

    bcf PIR1,TMR1IF    

;   movlw   H'00'

;   movwf   INTCON 

    banksel PIE1

    bcf PIE1,EEIE

    bcf PIE1,ADIE

    bcf PIE1,CMIE

    bsf PIE1,TMR1IE         ; enable Timer 1, timer 1 use as delay

    return 

             

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

;   Tx  BYTE to 2430A

;   LSB first, MSB last

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

TxBYTE

    movlw   .8

    movwf   LoopCounter

    bcf     CARRY

RollTxB

    banksel TxB

    rrf     TxB,F

    btfss   CARRY

    goto    LoBit

    call    TxHi

    goto    bloop

LoBit  

    call    TxLo

bloop  

    banksel LoopCounter

    decfsz  LoopCounter,F

    goto    RollTxB

    return

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

TxLo:

    call    SetLo

    call    delay60us           ; min 60 us

    call    SetHi

    nop                         ; recovery time min 1us

    nop    

    return

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

;   tx hi

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

TxHi:

    call    SetLo               ;1us<tlow1<15us

    nop

    call    SetHi

    call    delay60us

    nop

    nop                         ;recovery time min 1us

    return

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

;;      toggle the RC0 as input and the bus was pulled up by externl resistor

;;      application default PCDir.Bit0 to output

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

SetHi:

        bsf     PBDir,Bit2

        movf    PBDir,w

;       bsf     bank1

        banksel TRISB

        movwf   TRISB

        return

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

;;      clear register file RC0

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

SetLo:

        banksel PORTB

        bcf     PORTB,Bit2      ; data lo

        bcf     PBDir,Bit2      ; direction out

        movf    PBDir,W

        banksel TRISB

        movwf   TRISB       

        return

         

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

;   fix delay 60 us

;   0xffff - 8 = 0xfff7

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

delay60us

    banksel PIR1

    bcf     PIR1,TMR1IF

    movlw   H'EE'

    movwf   TMR1L

    movlw   H'FF'

    movwf   TMR1H

    bsf     T1CON,TMR1ON

    btfss   PIR1,TMR1IF

    goto    $-1

    bcf     T1CON,TMR1ON

    bcf     PIR1,TMR1IF

    return 

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

;   fix delay 500 us

;   0xffff - 0x3e = 0xffc1

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

delay500us

    banksel PIR1

    bcf     PIR1,TMR1IF

    movlw   H'C0'

    movwf   TMR1L

    movlw   H'FF'

    movwf   TMR1H

    bsf     T1CON,TMR1ON

    btfss   PIR1,TMR1IF

    goto    $-1

    bcf     T1CON,TMR1ON

    bcf     PIR1,TMR1IF

    return 

     

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

;   fix delay 100 ms

;   0xffff - 30d4 = 0xcf26

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

delay100ms

    banksel PIR1

    bcf     PIR1,TMR1IF

    movlw   H'26'

    movwf   TMR1L

    movlw   H'CF'

    movwf   TMR1H

    bsf     T1CON,TMR1ON

    btfss   PIR1,TMR1IF

    goto    $-1

    bcf     T1CON,TMR1ON

    bcf     PIR1,TMR1IF

    return         

     

    org     H'800'

VendorTable

    movf    Offset,W        ; Save offset in Temp

    andlw   H'ff'

    addwf   PCL,f           ; PCL = PCL+Offset

         

    dt      "MiCallChip",0 

    end

    

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_38220914

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值