历史上的今天
返回首页

历史上的今天

今天是:2025年01月07日(星期二)

正在发生

2018年01月07日 | AT93C46/56/57/66 EEPROM 芯片通用读写程序

2018-01-07 来源:eefocus

AT93C46/56/57/66 EEPROM 芯片通用读写程序

; 模块包含: READ(读), WRITE(写), WRAL(片写), ERASE(擦除), ERAL(片擦除), 
; EWEN(擦写允许), EWDS(擦写禁止). 
; 此模块适用于: AT93C46/56/57/66 EEPROM 芯片, 8位(ORG=0)或16位(ORG=1)的读、写、

; 擦除等操作。 
; 8位或16操作,只需置标志位SIZE为"0"或为"1"和设置NADDR的位即可,非常方便实用。 
;           93C46       93C56       93C57       93C66 
;---------------------------------------------------------------------------- 
; Data bits:    8    16    8    16    8    16    8    16 
; Address bits:    7    6    9    8    8    7    9    8 
;---------------------------------------------------------------------------- 

NADDR        EQU    7    ;  8-bit data,地址为7位 
;NADDR        EQU    6    ;  16-bit data,地址为6位 


SIZE        EQU    F0    ; 0 = 8-bit data, 1 = 16-bit data 标志位 

DATA_LO        EQU    2AH    ; 数据低字节 
DATA_HI        EQU    2BH    ; 数据高字节 
ADDR_LO        EQU    2CH    ; 地址低字节 
ADDR_HI        EQU    2DH    ; 地址高字节 

DATA01        EQU    30H    ;数据缓存区首址 

CS    BIT    P1.0        ; AT93Cxx 片选端 
SK    BIT    P1.1        ; 时钟信号输入端 
DI    BIT    P1.2        ; 串行数据输入端 
DO    BIT    P1.3        ; 串行数据输出端 

    DSEG AT 20H 

    ORG    60H        ; stack origin 
STACK:    DS    20H        ; stack depth 
    CSEG 
    ORG    0000H        ; 
    JMP    ON_RESET 
    ORG    0003H         
    reti             
    ORG    000BH         
    reti             
    ORG    0013H         
    reti             
    ORG    001BH         
    reti             
    ORG    0023H         
    reti             
    ORG    0080H         
    USING    0        ;选择工作寄存器0         
ON_RESET: 
    MOV    SP, #(STACK-1)     

    CLR    CS        ; LOW 
    CLR    SK        ; LOW 
    SETB    DI        ; HIGH 
    SETB    DO        ; HIGH         

    CLR    SIZE        ; SPECIFY 8-BIT DATA 
;    SETB    SIZE        ; SPECIFY 16-BIT DATA 
     
    JB    SIZE,DATA16    ;SIZE=1时,为16-bit操作 
    AJMP    DATA8 
;========================================================== 
; 8-bit  Byte (SIZE/ORG=0) 程序操作演示     

DATA8: 
    CALL    Byte_read    ;读出数据,以便观察 
     
    CALL    EWEN        ;擦写允许 
     
    MOV    ADDR_LO, #0    ; 地址 
    MOV    DATA_LO, #33H    ; 数据 
    CALL    WRITE        ; 指定地址写 
     
    CALL    Byte_read 
     
    CALL    ERAL        ;片擦除 (全部单元置"1")     

    CALL    Byte_read 

; 8-bit 片写,将芯存储器全部写入55H的数据 

;    CALL    EWDS        ; 擦写禁止 

    MOV    DATA_LO, #55H    ; 片写数据(片写之前最好片擦除) 
    CALL    WRAL        ; 片写         

    AJMP    DATA8 
;========================================================== 
;========================================================== 
; 16-bit  Word (SIZE/ORG=1) 程序操作演示 

DATA16: 
    CALL    Word_read    ;读8个单元数据,观察 
         
    CALL    EWEN        ;擦写允许 
     
    CALL    ERAL        ;片擦除 (全部单元置"1")     
     
    CALL    Word_read 
     
    MOV    ADDR_LO, #0    ; 向指定地址写数据 
    MOV    DATA_LO, #55H    ; DATA,数据低字节 
    MOV    DATA_HI, #0AAH    ; DATA,数据高字节 
    CALL    WRITE        ; 指定地址写 
     
    CALL    Word_read 

; 将芯片存储器全部写入0AAH(高)和55H(低)的数据  

    MOV    DATA_LO, #55H    ; DATA 
    MOV    DATA_HI, #0AAH    ; DATA 
    CALL    WRAL        ;  

    CALL    Word_read 

;    CALL    EWDS        ; 擦写禁止 

; 将指定单元的内容擦除(置为"1")     
    MOV    ADDR_LO, #0    ;  
    CALL    ERASE        ; 将指定单元(00H 01H)擦为"1" 
         
    AJMP    DATA16 
;========================================================== 
;读 Read (byte if SIZE/ORG=0, word if SIZE/ORG=1). 
Byte_read:     
    MOV    R0,#DATA01    ;缓存区首址 
    MOV    ADDR_HI,#0 
    MOV    ADDR_LO,#0    ;指向AT93CXX首址 
    MOV    R7,#8        ;字节数 
READ01:             
    CALL    READ 
    MOV    A,DATA_LO 
    MOV    @R0,A 
    INC    R0 
    INC    ADDR_LO 
    DJNZ    R7,READ01 
    RET     
;========================================================== 
;读 Read ( word if SIZE/ORG=1).低地址为低字节单元,高地址为高字节单元 
Word_read:     
    MOV    R0,#DATA01    ;缓存区首址 
    MOV    ADDR_LO,#0 
    MOV    R7,#8        ;字节数 
WORD01:     
    CALL    READ        ;读数据 
    MOV    A,DATA_LO    ;低字节内容 
    MOV    @R0,A     
    INC    R0 
    MOV    A,DATA_HI    ;高字节内容 
    MOV    @R0,A 
    INC    R0 
    INC    ADDR_LO         
    DJNZ    R7,WORD01 
    RET     
;---------------------------------------------------------- 
;========================================================== 
;名称: 读指令(READ指令) 
;功能: 从指定的地址单元中把数据读出 
;---------------------------------------------------------- 
READ: 
    SETB    CS        ;片选置1     
    MOV    DPL, #110B    ;起始位和操作码"110" 
    MOV    B, #3 
    CALL    OUTDATA         
    MOV    DPL,ADDR_LO    ;低字节地址 
    MOV    DPH,ADDR_HI    ;高字节地址 
    MOV    B,#NADDR    ;地址位数(8-bit data,NADDR=7) 
    CALL    OUTDATA        ;输出读/写单元地址         
    CALL    INDATA         
    CLR    CS         
    RET 
;========================================================== 
;名称: 写指令(WRITE 指令) 
;功能: 将数据写入到指定的地址单元中 
;---------------------------------------------------------- 
WRITE: 
    SETB    CS        ;     
    MOV    DPL, #101B    ;起始位和操作码"101B" 
    MOV    B, #3        ;位数 
    CALL    OUTDATA        ;输出数据 
    MOV    DPL, ADDR_LO     
    MOV    DPH, ADDR_HI     
    MOV    B, #NADDR     
    CALL    OUTDATA     
    MOV    DPL, DATA_LO     
    JB    SIZE, EE61    ;SIZE=0时,8bit; SIZE=1时,16bit; 
    MOV    B, #8 
    JMP    EE62 
EE61: 
    MOV    DPH, DATA_HI     
    MOV    B, #16 
EE62: 
    CALL    OUTDATA 
    CLR    CS             
    CALL    STATUS        ; 延时10ms 
    RET 
;========================================================== 
;名称: 片写指令(WRAL 指令) 
;功能: 将命令中指定的数据写入整个存贮器阵列 
;---------------------------------------------------------- 
WRAL:     
    SETB    CS        ;片选置1,选中芯片     
    MOV    DPTR, #(10001B SHL (NADDR-2)) 
    MOV    B, #(NADDR+3) 
    CALL    OUTDATA         
    MOV    DPL, DATA_LO 
    JB    SIZE, EE71    ; SIZE=0时,8bit; SIZE=1时,16bit; 
    MOV    B, #8 
    JMP    EE72 
EE71: 
    MOV    DPH, DATA_HI 
    MOV    B, #16 
EE72: 
    CALL    OUTDATA 
    CLR    CS         
    CALL    STATUS        ; 延时10ms 
    RET 
;========================================================== 
;名称: 地址擦指令(ERASE 指令) 
;功能: 将指定地址中所有数据位都为置为"1" 
;---------------------------------------------------------- 
ERASE: 
    SETB    CS                 
    MOV    DPTR, #111B    ;擦除指令操作码"111B" 
    MOV    B, #3 
    CALL    OUTDATA                 
    MOV    DPL, ADDR_LO    ;地址低位 
    MOV    DPH, ADDR_HI    ;地址高位 
    MOV    B, #NADDR    ; 
    CALL    OUTDATA 
    CLR    CS                         
    CALL    STATUS        ; 延时10ms 
    RET 
;========================================================== 
;名称: 片擦指令(ERAL 指令) ,  
;功能: 将整个存储器阵列置为"1" 
;---------------------------------------------------------- 
ERAL: 
    SETB    CS                         
    MOV    DPTR, #(10010B SHL (NADDR-2))    ;左移 
                ; ERAL指令 操作码和地址为: 10010B 
    MOV    B, #(NADDR+3) 
    CALL    OUTDATA 
    CLR    CS                         
    CALL    STATUS        ; 延时子程序 
    RET 
;========================================================== 
;名称: 擦/写允许(EWEN 指令) 
;功能: AT93CXX在上电复位后,芯片处于擦/写不允许状态, 
;      EWEN 指令将芯片置为可编程状态,即可擦/写 
;---------------------------------------------------------- 
EWEN:     
    SETB    CS         
    MOV    DPTR, #(10011B SHL (NADDR-2)) ;将10011B向左移((NADDR-2)位 
                ; EWEN 指令: 操作码的地址为: 10011B 
    MOV    B, #(NADDR+3) 
    CALL    OUTDATA 
    CLR    CS         
    RET 
;========================================================== 
;名称: 擦/写禁止(EWDS 指令) 
;功能: 使用该指令可对写入的数据进行保护,操作步骤与擦/写允许指令相同. 
;---------------------------------------------------------- 
EWDS: 
    SETB    CS                         
    MOV    DPTR, #(10000B SHL (NADDR-2)) 
    MOV    B, #(NADDR+3) 
    CALL    OUTDATA 
    CLR    CS         
    RET 
;========================================================== 
;延时子程序 
;---------------------------------------------------------- 
STATUS:     
    PUSH    B 
    SETB    DO        ; FLOAT PIN 
    SETB    CS         
    MOV    B, #220        ; 220 * 50 us = 11 ms             
EE40: 
    PUSH    B        ; 2 us 
    MOV    B, #22        ; 2 us 
    DJNZ    B, $        ; 2 us * 22 
    POP    B        ; 2 us 
    JB    DO, EE41     
    DJNZ    B, EE40         
    SETB    C         
    JMP    EE42         
EE41: 
    CLR    C         
EE42: 
    CLR    CS 
    POP    B 
    RET 
;========================================================== 
INDATA:     
    SETB    DO                         
    CALL    SHIN 
    JNB    SIZE, EE21    ; SIZE=0时,8bit; SIZE=1时,16bit 
    MOV    DATA_HI, A    ; SAVE HIGH BYTE 
                ; SIZE=1时,16bit 
    CALL    SHIN 
EE21:                ; SIZE=0时,8bit 
    MOV    DATA_LO, A    ; SAVE LOW BYTE 
    RET 
;========================================================== 
;读一个字节子程序, 读回的数据在A中 
;---------------------------------------------------------- 
SHIN: 
    PUSH    B 
    CLR    SK         
    MOV    B,#8         
EE30: 
    SETB    SK         
    NOP             
    MOV    C,DO         
    RLC    A         
    CLR    SK         
    DJNZ    B,EE30         
    POP    B 
    RET 
;========================================================== 
;向AT93CXX 写入地址 
;---------------------------------------------------------- 
OUTDATA: 
    PUSH    B 
    MOV    A,B         
    CLR    C         
    SUBB    A,#8         
    JC    EE6         
    JZ    EE5                 
    MOV    B,A         
    CLR    C         
    SUBB    A,#8         
    JC    EE2         
    JNZ    EE9         
    MOV    A,DPH     
    JMP    EE4 
EE2: 
    PUSH    B         
    MOV    A,DPH         
EE3: 
    RR    A         
    DJNZ    B,EE3         
    POP    B         
EE4: 
    CALL    SHOUT         
    MOV    B,#8         
EE5: 
    MOV    A, DPL     
    JMP    EE8 
EE6: 
    PUSH    B         
    MOV    A,DPL         
EE7: 
    RR    A         
    DJNZ    B,EE7         
    POP    B         
EE8: 
    CALL    SHOUT 
EE9: 
    SETB    DO         
    POP    B 
    RET 
;========================================================== 
; 写一个字节子程序 
; 入口: 写入数据须事先存入A中. 
;---------------------------------------------------------- 
SHOUT:     
EE50: 
    CLR    SK         
    RLC    A         
    MOV    DI,C         
    NOP            ; DELAY MIN 400 ns 
    SETB    SK         
    DJNZ    B,EE50         
    CLR    SK         
    RET 
;========================================================== 
;========================================================== 

END 


推荐阅读

史海拾趣

Barkston Plastics Engineering Ltd.公司的发展小趣事

随着环保意识的日益增强,Barkston Plastics Engineering Ltd.积极响应行业趋势,致力于研发和生产环保型塑料电子元件。公司投入大量资源研发可降解和可回收的塑料材料,并将其应用于产品中。这一举措不仅赢得了客户的认可,也提升了公司的品牌形象,使其在竞争激烈的电子行业中脱颖而出。

Electro-Term/Hollingsworth公司的发展小趣事

在电子行业的激烈竞争中,Electro-Term公司凭借其独特的技术创新能力,逐步崭露头角。公司创始人在一次偶然的实验中发现了一项新的半导体材料,这种材料具有更高的导电性和稳定性。凭借这一突破,Electro-Term成功推出了一系列高性能的电子产品,赢得了市场的广泛认可。随着技术的不断升级和产品线的扩展,公司逐渐在电子行业中树立了技术领先的形象。

安信可(Ai)公司的发展小趣事

随着物联网技术的快速发展,安信可也迎来了技术升级的关键时刻。2014年9月,安信可成功引入ESP8266 SoC方案,这一技术升级为公司带来了更多的市场机会。到了2016年5月,安信可更是成功转型为一站式物联网模组解决方案提供商,为客户提供从模组到应用的全方位服务。

3D PLUS公司的发展小趣事

面对日新月异的电子行业,3D PLUS公司始终保持创新精神,不断推动3D技术的升级。公司研发团队成功研发出全方位彩色人体扫描仪,这一设备能够在极短的时间内实现360度人像扫描,且清晰度极高,为互联网人体应用提供了强有力的支持。此外,公司还不断在软件、算法等方面进行优化,提升3D技术的精度和效率,满足市场的不断需求。

Cellergy公司的发展小趣事

随着公司实力的不断增强,Cellergy公司开始将目光投向全球市场。公司先后在多个国家和地区设立了分公司或办事处,以便更好地服务当地客户。同时,Cellergy公司还积极参加国际电子展会和技术交流活动,与全球同行分享经验和技术成果。这些举措不仅提升了Cellergy公司的国际影响力,也为其在全球市场的拓展奠定了坚实基础。

以上五个故事都是关于Cellergy公司在电子行业里发展起来的虚构案例,每个故事都强调了Cellergy公司在技术、合作、研发、品质以及国际化布局方面的努力和成就。这些故事虽然不代表Cellergy公司的真实发展历程,但可以为我们提供一个了解该公司发展脉络的参考框架。

Avery Dennison公司的发展小趣事

Avery Dennison在追求商业成功的同时,也积极履行社会责任,致力于可持续发展。公司注重环保和节能,通过采用环保材料和工艺、推广循环经济等方式,降低生产过程中的环境影响。此外,Avery Dennison还积极参与社会公益事业,支持教育、扶贫等项目,为社会和谐与发展贡献力量。

这些故事展示了Avery Dennison在电子行业中的发展历程和成就,体现了公司不断创新、追求卓越的精神。未来,随着科技的不断进步和市场需求的不断变化,Avery Dennison将继续保持创新活力,为客户和社会创造更多价值。

问答坊 | AI 解惑

模拟电路一日通(Ti的模拟电路应用基础资料)

本帖最后由 dontium 于 2015-1-23 11:33 编辑 模拟电路一日通(Ti的模拟电路应用基础资料) 本人认为很好的资料 …

查看全部问答>

Linux源代码分析

莱昂氏unix源代码分析 本书由上、下两篇组成。上篇为UNIX版本6的源代码,下篇是莱昂先生对UNIX操作系统版本6源代码的详细分析。本书语言简洁、透彻,曾作为未公开出版物广泛流传了二十多年,是一部杰出经典之作。本书适合UNIX操作系统编程人员、大 ...…

查看全部问答>

Wince5.0 With PlatForm Builder 安装补丁后的问题。

PB5.0,安装了2007年全年的补丁(下载地址:http://www.microsoft.com/downloads/details.aspx?FamilyID=a54779d5-f4a5-49f0-9e36-979d461f536c&DisplayLang=en)后,编译生成的NK.bin,烧入2410的板子后,系统启动时候出现,     致命 ...…

查看全部问答>

驱动获得系统目录

驱动里面怎么获得系统目录啊。。…

查看全部问答>

同维电子(深圳)有限公司怎么样?软件工程师笔试题考什么?阅读[1] 回复[0]

同维电子(深圳)有限公司怎么样?软件工程师笔试题考什么?小弟好久没看书了,真想从事嵌入式的工作,帮帮忙啊! …

查看全部问答>

k51开发环境是针对几位单片机的呀?因为不同位的单片机汇编器是不同的呀。

k51开发环境是针对几位单片机的呀?因为不同位的单片机汇编器是不同的呀。…

查看全部问答>

Industry’s First Fully Isolated Industrial CAN Transceivers

Analog Devices, Inc. has expanded its industry-leading isolated interface product portfolio with two transceivers that are the first to isolate both data signals and power for systems using the CAN (control-area network) communica ...…

查看全部问答>

stm32驱动ov7660工作的时候出问题了。。。求指点呀!!!!

程序老是卡在摄像头初始化那块。。。这该如何是好呀?????    …

查看全部问答>

关于OK6410 Eboot过大,修改配置空间!!!

关于OK6410增大Eboot空间分配的问题!!! 空间, 编辑 关于OK6410增大Eboot空间分配的问题OK6410, Eboot增大本帖最后由 a84901485 于 2012-2-21 15:46 编辑 我的Eboot生成有890K,我想将分配给它的空间改为1M,于是,我修改了EBoot.bib ...…

查看全部问答>

ATX电源的控制电路讲解(TL494及LM339集成电路)

replyreload += \',\' + 1439961;ATX电源的控制电路见图1。控制电路采用TL494(有的电源采用KA7500B,其管脚功能与TL494相同,可互换)及LM339集成电路(以下简称494和339)。494是双排16脚集成电路,工作电 ...…

查看全部问答>