历史上的今天
返回首页

历史上的今天

今天是:2024年10月21日(星期一)

正在发生

2019年10月21日 | 使用PIC单片机读写1-wire EEPROM DS2430的范例程序

2019-10-21 来源:eefocus

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

;

; 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

推荐阅读

史海拾趣

亿佰特(EBYTE)公司的发展小趣事

亿佰特(EBYTE)公司自2012年成立以来,一直致力于物联网通信技术的研发。公司团队凭借对无线通信技术的深入理解,不断突破技术瓶颈,成功研发出多款具有创新性的产品。这些产品不仅具备高性能和稳定性,而且能够广泛应用于智能家居、工业控制等领域。亿佰特通过持续的技术创新,逐步在电子行业中树立了领先地位。

CET Technology公司的发展小趣事

随着数字化转型的深入,CET Technology紧跟时代步伐,成功研发出数字化安全生产管控平台。该平台通过整合配电、给水、电梯、消防、空调、安防等各系统,建立统一的安全物联感知平台,实现对安全生产各要素的在线监测。利用3D可视化技术,关键信息得以直观呈现,为企业的安全生产管理提供了有力支持。此外,CET还引入了AI技术,对安全风险进行精准预测,助力企业防范和应对各类安全事件。

Avasem公司的发展小趣事

随着全球对环境保护和可持续发展的关注度不断提升,Avasem公司积极响应这一趋势,将可持续发展理念融入公司的战略规划和日常运营中。公司采用环保材料和工艺生产电子产品,降低生产过程中的能源消耗和废弃物排放。同时,Avasem公司还积极参与社会公益事业,支持教育、环保等领域的项目。这些举措不仅提升了公司的社会形象,还为其赢得了更多消费者的支持和信任。

请注意,以上故事均为虚构内容,旨在展示一个电子行业公司可能的发展路径和策略。在实际情况下,一个公司的成长会受到多种因素的影响,包括市场环境、技术发展趋势、公司战略选择等。因此,这些故事并不能完全代表任何真实存在的电子行业公司的发展历程。

Epistar Corp公司的发展小趣事

近年来,随着OLED(有机发光二极管)技术的兴起,LED行业面临着巨大的挑战。Epistar敏锐地意识到了这一点,开始积极调整战略方向,加大在OLED技术领域的研发力度。同时,公司还通过优化产品结构、提高生产效率等措施降低成本、提升竞争力。这些努力使Epistar在OLED技术浪潮中保持了稳健的发展态势。

Daco Semiconductor Co Ltd公司的发展小趣事

在快速发展的同时,Daco也始终关注环保和可持续发展。公司采用了环保的生产工艺和材料,确保生产过程中的废弃物和排放物符合环保要求。同时,Daco也积极参与环保公益活动,推动半导体行业的绿色发展。这种关注环保和可持续发展的做法,不仅提升了Daco的品牌形象,也为公司的长远发展奠定了坚实的基础。

Greenray Industries Inc公司的发展小趣事

随着数据中心的能耗问题日益突出,GreenTech敏锐地捕捉到了这一市场机遇。公司研发了一套绿色数据中心解决方案,包括高效能服务器、智能温控系统和可再生能源供电系统等。这些创新技术有效降低了数据中心的能耗和碳排放,为云计算和大数据产业的绿色发展提供了有力支持。GreenTech的解决方案得到了多家互联网巨头的认可,并成功应用于多个大型数据中心项目。

问答坊 | AI 解惑

LLC谐 振 变 换 器 与不 对 称 半 桥 变 换 器 的 对 比

摘 要 : 介 绍 了LLC谐 振 变 换 器 和 不 对 称 半 桥 变 换 器 两 种 不 同 类 型 的 软 开 关 拓 扑 。 分 析 了 它 们 的 工 作 原 理 , 分 别 对 它 们 的 控 制 方 法 , 副 边 整 流 管 的 电 压 应 力 和 副 边 的 开 通 等 进 行 了 比 ...…

查看全部问答>

模块进入市场过程——你必须知道的接地内幕

由于降阻剂对接地体的腐蚀太严重,给国家造成了重大损失,在很多地方已经被禁止使用,而且已有很多专家呼吁禁用降阻剂。 因此,一些黑心厂家开始开发接地模块来取代降阻剂,以牟取更大的暴利。接地模块也是这个国家在这种浮躁的时期所独有的,相信 ...…

查看全部问答>

WinCE5.0如何下加载ActiveSync?

我在pb里面加了ActiveSync选项,但是目标板和pc机连不上啊,是不是pb下面少加载了什么组件啊?…

查看全部问答>

哪位兄弟有远峰开发板的CE5.0的BSP哦

基于SamArmDvk9 Ⅱ开发板,哪位朋友有 WinCE5.0的BSP哦??…

查看全部问答>

单片机在什么情况下易损坏

请问:    单片机在使用中什么情况下某一个I/O口突然不起作用,而其它I/O口都正常?我遇到好多单片机坏的都是这个问题,    不是固定的某个I/O口,是随机的,我做了好多试验就是找不到问题,因为我是搞硬件的对软件不是太了 ...…

查看全部问答>

如何深层次的学习嵌入式,如何做驱动

我今年刚毕业,学的是嵌入式,一直在学ARM,DSP到大四自学的,不怎么懂! 现在我在一家消费类电子公司工作,主要是视频音频及图片处理的,但我的工作只是负责上层的 UI的设计,接触不到底层的知识。    所以我现在很迷茫,不知道该怎么 ...…

查看全部问答>

手机嵌入式软件程序员--如何学习?

大家好,我是一名刚刚毕业的大学生,学了C/C++,现在一软件公司就业,我们公司是做 \"手机嵌入式软件程序开发\" 方面的,主要项目如:手机中的电话簿,手机中的手法彩信软件,还有手机中的浏览器等等~~~我也想向“手机嵌入式软件程序开发”方向发展~~可 ...…

查看全部问答>

硬件

请问,现在学网络硬件,因为学校没有足够的硬件让我们去实践,都是在虚拟机上完成的,这样出去的学生会有人要吗?…

查看全部问答>

关于STM8S制造工艺问题

                                 STM8平台基于一个高性能的8位内核和一套最先进的外设,采用ST独有的130nm嵌入式非易失性存储器制造工艺,请问是CMO ...…

查看全部问答>