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

发布者:泉趣人最新更新时间:2018-03-12 来源: eefocus关键字:PIC读写  1-wire  EEPROM  DS2430 手机看文章 扫描二维码
随时随地手机看文章

使用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
#i nclude 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

;;---------------------------------------------------------
TxL
 call SetLo
 call delay60us   ; min 60 us
    call SetHi
    nop       ; recovery time min 1us
    nop  
    return
;-----------------------------------------------------------
; tx hi
;-----------------------------------------------------------

TxHi:
 call SetLo    ;1us 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
;;----------------------------------------------------------------------------

SetL
  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


关键字:PIC读写  1-wire  EEPROM  DS2430 引用地址:使用PIC读写1-wire EEPROM DS2430的实例

上一篇:PIC16F84产生两组PWM输出的实例源程序
下一篇:读写24LCxx系列的EEPROM的实例程序

推荐阅读最新更新时间:2024-03-16 15:57

51单片机—IIC—EEPROM(CAT24WCXX)—03
今天没事做,突然想起来了IIC,所以决定回顾一下下,呵呵,忘记了不少,所以打算写出来,便于以后记忆。。。 ,这里的例子就拿CAT24WCXX的EEPROM来解释吧~~(我也是边写文章,边写代码~~~累啊) 一、IIC总线简介 1.IIC总线的主要特点 IIC总线是一种简单、双向二线制同步串行总线。 (1)总线只有两根线,既串行时钟线(SCL)和串行数据线(SDA),这在设计中大大减少了硬件接口 (2)每个连接到总线上的器件都有一个用于识别的器件地址,(注意,器件地址由芯片内部硬件电路和外部地址引脚同时决定,这样就避免了~~你懂得)从而建立了简单的主从关系,从而每个器件都可以作为发送器,也可以作为接收器。 (3)同步时钟允许
[单片机]
51单片机—IIC—<font color='red'>EEPROM</font>(CAT24WCXX)—03
Microchip推出SPD EEPROM
全球领先的单片机和模拟半导体供应商——Microchip Technology Inc.(美国微芯科技公司)今天宣布推出全新系列串行存在检测 (Serial Presence Detect,简称SPD) EEPROM器件。它们既能支持现今高速个人计算机中最新的双倍数据速率 (DDR2) DIMM模块,还可支持未来的DDR3 DIMM模块。新器件编号分别为34AA02、34LC02以及34VL02 (34XX02),符合SPD EEPROM器件最新的JEDEC标准,其中34VL02可支持业界任何一款SPD EEPROM 的最低工作电压范围(1.5V至3.6V) 。各款EEPROM均备有JEDEC标准封装,也是目前唯一采用深受欢迎
[模拟电子]
1-wire总线汇编程序
;**************1-wire总线汇编程************************** ;文件:1-wire.asm ;功能:1-wire总线接口程序 ;器件:AT90S2313,DS1821 ;时钟:4.0MHz ;**************************************** ;过程名:w1_init ;功能:初始化1_wire总线 ;入口参数:无 ;出口参数:R30 1:有器件应答 0:无器件应答 ;影响资源:R24,R25 ;***************1-wire总线汇编程************************** w1_init: clr R30 cbi
[单片机]
stm32 片上flash用作EEPROM(掉电保存)
#if !defined (_FLASH_H) #define _FLASH_H #define FLASH_ADR 0x08010000 //要写入数据的地址 #define u8 INT8U #define u16 INT16U #define u32 INT32U union union_temp16 { unsigned int un_temp16; unsigned char un_temp8 ; // example 16: 0x0102 8: 2 1 }my_unTemp16; typedef struct { u8 apn ; u8 useName ; u8 password ; u8 serverIP
[单片机]
STM8的EEPROM解锁是可以重复进行的
STM8的EEPROM在复位后,要想要写入数据,必须先解锁,必然无法写入数据。解锁就是向 FLASH_DUKR 中先后写入: 第一个硬件秘钥:0xAE 第二个硬件秘钥:0x56 两个字节的数据。 此时 FLASH_IAPSR 中的 DUL 位将会变为1,表示 EEPROM 已经成功解锁,可以进行写入操作了。如果发现 DUL 位不为 1 ,是可以按顺序重复写入秘钥的,直到 DUL 位为 1 为止。 但手册上是这么说的: 中文手册: 2. 如果密钥输入错误,应用程序可以尝试重新输入这两个MASS密钥来对DATA区域进行解 锁。 4. 如果密钥输入错误,DATA EEPROM区域在下一次系统复位之前将一直
[单片机]
STC12C5A60S2原版EEPROM
//STC 12C5A60S2系列单片机EEPROM/IAP 功能测试程序演示 #include reg5 1.h #include intrins.h typedef unsigned char BYTE; typedef unsigned int WORD; //IAP相关端口定义 sfr IAP_DATA = 0xC2; //Flash 数据寄存器 sfr IAP_ADDRH = 0xC3; //Flash 高位地址 sfr IAP_ADDRL = 0xC4; //Flash 低位地址 sfr IAP_CMD = 0xC5; //Flash 命令寄存器 sfr IAP_TRIG = 0xC6; //
[单片机]
PIC IIC读写
用c语言实现 24LC256 读写(非软件模拟方式) #include PIC1687X.H unsigned CHAR i=0; unsigned CHAR receive=0x00; void i2c_start() { SEN=1; //启动 do{ }while(SSPIF==0); SSPIF=0; } void i2c_stop() { PEN=1; //产生停止条件 do{ ; }while(SSPIF==0); SSPIF=0; } void i2c_restart() { RSEN=1; //启动,反复启动
[单片机]
单片机调EEPROM存储器24C256
简介:(单片机基础知识之单片机存储器)设置MSP430单片机为主设备,24C256为从设备。IIC总线由SDA和SCL两条线组成,每根线都联结4.7K的上拉电阻。 设置MSP430单片机为主设备,24C256为从设备。IIC总线由SDA和SCL两条线组成,每根线都联结4.7K的上拉电阻。 主设备向24C56写:主设备发送start信号— 接着发送8位Device address(0xa0写)— 24C256比较受到的地址,发送应答信号ack- 主设备受到ACK后,先发送First word address(高8位)— 24C256受到后返回ack应答— 主设备发送Second word address(低8位)— 24C2
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved