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

2019-10-21来源: eefocus关键字: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

        

ba

[1] [2]
关键字:PIC单片机  读写1-wire  EEPROM  DS2430 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic477780.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:用HI-TECH C写的使用PIC12C508单片机读写93LC46范例程式
下一篇:PS7219的PIC单片机接口程序

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

PIC单片机基础学习之程序设计(一)
1、PIC单片机程序的基本格式先介绍二条伪指令:EQU ——标号赋值伪指令ORG ——地址定义伪指令PIC16C5X单片机在RESET后指令计算器PC被置为全“1”,所以PIC16C5X几种型号芯片的复位地址为:PIC16C54/55:1FFHPIC16C56:3FFHPIC16C57/58:7FFH一般来说,PIC单片机的源程序并没有要求统一的格式,大家可以根据自己的风格来编写。但这里我们推荐一种清晰明了的格式供参考。;--------------------------------------;名称定义和变量定义;--------------------------------------F0    EQU  0RTCC
发表于 2019-12-06
PIC单片机学习知识之程序设计(二)
上文中我们讲述了PIC单片机基础学习之程序设计(一),接下来将继续为大家讲解PIC单片机程序设计(二),供大家学习。PIC单片机的查表程序可以利用子程序带值返回的特点来实现。具体是在主程序中先取表数据地址放入W,接着调用子程序,子程序的第一条指令将W置入PC,则程序跳到数据地址的地方,再由“RETLW”指令将数据放入W返回到主程序。下面程序以F10放表头地址。MOVLW  TABLE     ;表头地址→F10MOVWF  10MOVLW  1        ;1→W,准备取“1”的线段值ADDWF  10,1      ;F10+W =“1”的数据地址CALL  CONVERTMOVWF  6        ;线段值置到B口
发表于 2019-12-06
PIC单片机程序结构框架
…INTSRV …     ;中断服务程序区SVBRTH…     ;子程序区END      ;程序结束符当然,在编写程序时可根据实际情况加以调整。下面是一份实际程序清单,要求将数据88H写入PIC16F84单片机内部EEPROM的20H单元,而后再从20H单元将其读出。LIST P=16F84,F=INHX8M;……………………………STATUS EQU  03  ;定义寄存器EEDATA EQU  08EEADR EQU   09INTCON EQU  0BHEECON1 EQU  88HEECON2 EQU  89H;…………………………RD    EQU  0    ;定义位WR  EQU  1RP0   EQU
发表于 2019-12-06
pic单片机复位电路
pic单片机复位电路
发表于 2019-12-06
pic单片机复位电路
PIC单片机该如何选型?PIC单片机选型参考
单片机的选型是一件重要而费心的事,如果选型得当,则做出来的产品就会性价比较高,且工作稳定;反之,则可能会造成产品成本过高或影响产品正常运行,甚至可能根本就达不到预先设计要求。PIC12CXXX家族产品为Microchip功能强大的基于RISC的PICmicro系列8号|脚DIP及SOIC封装。PIC12CXXX产品具有12或14位宽指令集,2.5V低运行电压,小封装引脚,中断处理,深硬件堆栈,多通道以及EEPROM数据存储器。这些智能级特性由于价格与尺寸的原因在以前的产品中是不具备的。PIC单片机该如何选型?PIC单片机选型参考PIC16C5X家族具有全套基础产品,为您提供最有效的价格解决方案。PIC16C5X产品具备12位宽
发表于 2019-12-06
PIC单片机该如何选型?PIC单片机选型参考
pic单片机的八大优势总结
pic单片机作为许多人工作内容之一,扮演着重要角色。但大部分人却不知为什么要使用pic单片机,为解决这个问题,我们必须从pic单片机几大优点谈起。借由这篇有关pic单片机优势的文章,希望相关人士能对pic单片机有一定的把握,并充分了解为什么使用pic单片机以及使用场景。pic单片机的八大优势总结优势1:PIC最大的特点是不搞单纯的功能堆积,而是从实际出发,重视产品的性能与价格比,靠发展多种型号来满足不同层次的应用要求。就实际而言,不同的应用对单片机功能和资源的需求也是不同的。比如,一个摩托车的点火器需要一个I/O较少、RAM及程序存储空间不大、可靠性较高的小型单片机,若采用40脚且功能强大的单片机,投资大不说,使用起来也不
发表于 2019-12-06
pic单片机的八大优势总结
小广播
何立民专栏 单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved