这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » AT24C02 请教AT24C02的写入问题

共2条 1/1 1 跳转至

AT24C02 请教AT24C02的写入问题

院士
2006-09-17 18:14:16     打赏
AT24C02 请教AT24C02的写入问题



关键词: AT24C02     请教     写入     问题    

院士
2006-12-22 22:43:00     打赏
2楼
问 我的AT24C02的程序可以正常读,但是每次写都是写了FFH进去(实际上我控制写入的并不是FFH)。我想啊,既然能够正常读,说明主MCU应该是正常控制C02的,因为在读的过程中也需要向C02发送命令啊,既然这些都正常,说明MCU向C02发送字节的程序是没有问题的啊,可是为什么写进去的东西都变成FFH了呢?(我有烧片器,所以可以分开调试读写功能)。 1: 很简单,没有写入,芯片本来的数据就是FFH,程序问题 2: 确定写入了(有内容)我有烧片器,先用烧片器写入了不是FFH的数据,然后再执行我的写程序,然后用烧片器读出内容,我写的存储单元就变成FFH了,没写的地方就还是没变。

我想也应该是程序问题,可是MCU向24C02发送字节的程序应该没错啊,如果要错的话,我的读程序也不应该正常。到底有可能在哪方面出问题呢? 3: 656可以把你的chengxu贴出来吗? 4: 应该是程序问题把你的chengxu贴出来吗 5: 把你的“写”程序贴出来看看 6: 注意延时EEPROM写的时候很慢,注意在写入时应当适当延时。 7: 用93C46代替试一下, 和24C02功能一样但更皮实, 8: 也有可能是硬件问题  你24C02的写保护脚(WP)确定接地了吗 9: 24C02读写程序WP没有接地,默认时控制为高,写时控制为低。
现将程序贴出,请看看为什么总是写入FFH。
在初始化的时候(另外一个文件)还有两句话:JSR ClrI2CClk; JSR SetI2CWP

外部主要调用I2CTxStr和I2CRxStr这两个函数。

I2CTxByteBeforeRx:
        JSR I2CDelay
        LDA R_BitStatus
        ORA #BIT0
        JMP I2CTxByteIn

I2CTxByte:
;input: r1=translated byte
;output: A=0:error; A=1:success
;effect: r1-r2,X
        LDA R_BitStatus
        AND #BIT0_
I2CTxByteIn:
        STA R_BitStatus

        LDX #08H
I2CTxByte0:
        LDA #80H
        BIT R1
        BEQ I2CTxByteLo
I2CTxByteHi:
        JSR SetI2CDat
        JMP I2CTxByte_
I2CTxByteLo:
        JSR ClrI2CDat
I2CTxByte_:
        JSR I2CDelay
        JSR SetI2CClk
        JSR I2CDelay

        ASL R1

        JSR ClrI2CClk
        JSR I2CDelay
        JSR I2CDelay
        DEX
        BNE I2CTxByte0
I2CTxByteAck:
        JSR SetI2CDat
        NOP
        NOP

        JSR I2CDatDirIn
        JSR I2CDelay

        LDA PIOS
        STA R2
        LDA #C_C02DatBit
        BIT R2
        BNE I2CTxByteErr
I2CTxByteOk:
        LDA #BIT0
        BIT R_BitStatus
        BNE I2CTxByteOk_
        JSR I2CDatDirOut
I2CTxByteOk_:
        JSR SetI2CClk               ;Clk=1
        JSR I2CDelay
        JSR ClrI2CClk               ;Clk=0
        JSR I2CDelay

        LDA #C_OK
        RTS

I2CTxByteErr:
        JSR I2CDatDirOut

        JSR SetI2CClk               ;Clk=1
        JSR I2CDelay
        JSR ClrI2CClk               ;Clk=0
        JSR I2CDelay

        LDA #C_ERROR
        RTS

I2CRxByte:
;input: none
;output: r1=received byte
;effect: r1-r2,X
        LDX #08H
        LDA #00H
        STA R1
I2CRxByte0:
        ASL R1

        LDA PIOS
        STA R2
        LDA #C_C02DatBit
        BIT R2
        BEQ I2CRxByte_

        INC R1
I2CRxByte_:
        JSR SetI2CClk               ; Clk=1
        JSR I2CDelay
        JSR ClrI2CClk               ; Clk=0
        JSR I2CDelay

        DEX
        BNE I2CRxByte0

        RTS

;;;;;;;;Write a string to 24c02
I2CTxStr:
;input: r4:C02_Addr; r5-C02Buf offset; r6-Length
;output: A=0:error; A=1:success
;        r4-r6 don't changed
;effect: r1-r3,X,Y
        JSR ClrI2CWP
        JSR I2CStart

        LDA #A0H                     ;write mesage
        STA R1
        JSR I2CTxByte
        CMP #00H
        BEQ I2CTxStrErr

        LDA R4
        STA R1                       ;C02_Addr
        JSR I2CTxByte
        CMP #C_ERROR
        BEQ I2CTxStrErr

I2CTxStr1:                           ;Write data
        LDA R6                       ;Length
        STA R3
        LDY R5                       ;offset
I2CTxStr10:
        LDA R_I2CBuf,Y
        STA R1
        JSR I2CTxByte
        CMP #C_ERROR
        BEQ I2CTxStrErr

        INY
        DEC R3
        BNE I2CTxStr10

        JSR I2CStop
        JSR SetI2CWP

        LDA #80H
        JSR Delay

        LDA #C_OK
        RTS
I2CTxStrErr:
        JSR I2CStop
        JSR SetI2CWP

        LDA #10H
        JSR Delay

        LDA #C_ERROR
        RTS

;;;;;;;;Read a string from 24c02
I2CRxStr:
;input: r4:C02_Addr; r5-C02Buf offset; r6-Length
;output: A=0:error; A=1:success
;        r4-r6 don't changed
;effect: r1-r3,X,Y
        JSR I2CStart

        LDA #A0H
        STA R1
        JSR I2CTxByte

        CMP #C_ERROR
        BEQ I2CRxStrErr

        LDA R4                       ; C02_Addr
        STA R1
        JSR I2CTxByte

        CMP #C_ERROR
        BEQ I2CRxStrErr
        JSR I2CStart

        LDA #A1H
        STA R1
        JSR I2CTxByteBeforeRx

        CMP #C_ERROR
        BEQ I2CRxStrErr

        LDA R6                      ; Length
        STA R3
        LDY R5                      ; C02Buf offset
I2CRxStr1:
        JSR I2CRxByte
        LDA R1
        STA R_I2CBuf,Y

        INY
        DEC R3
        BEQ I2CRxStrEnd

        JSR I2CDatDirOut            ; ** ACK
        JSR I2CDelay
        JSR ClrI2CDat               ; Dat=0
        JSR I2CDelay
        JSR SetI2CClk               ; Clk=1
        JSR I2CDelay                ; Delay
        JSR ClrI2CClk               ; Clk=0
        JSR I2CDelay
        JSR I2CDatDirIn
        JSR I2CDelay
        JMP I2CRxStr1
I2CRxStrEnd:
        JSR I2CDatDirOut            ; ** ACK
        JSR I2CDelay
        JSR SetI2CDat               ; Dat=1
        JSR I2CDelay
        JSR SetI2CClk               ; Clk=1
        JSR I2CDelay                ; Delay
        JSR ClrI2CClk
        JSR I2CDelay
        JSR I2CStop

        LDA #C_OK
        RTS
I2CRxStrErr:
        JSR I2CStop
        LDA #C_ERROR
        RTS

I2CDelay:
        LDA #05H
I2CDelay0:
        SEC
        SBC #01H
        BNE I2CDelay0
        RTS

ClrI2CClk:
        LDA POF
        AND #C_C02ClkBit_
        STA POF
        RTS

SetI2CClk:
        LDA POF
        ORA #C_C02ClkBit
        STA POF
        RTS

SetI2CDat:
        LDA PIOS
        ORA #C_C02DatBit
        STA PIOS
        RTS

ClrI2CDat:
        LDA PIOS
        AND #C_C02DatBit_
        STA PIOS
        RTS

SetI2CWP:
        LDA POF
        ORA #C_C02WPBit
        STA POF
        RTS

ClrI2CWP:
        LDA POF
        AND #C_C02WPBit_
        STA POF
        RTS

I2CDatDirIn:
        LDA #00000011B
        STA PSDR
        LDA #11111100B
        STA PSR
        RTS

I2CDatDirOut:
        LDA #00100011B
        STA PSDR
        LDA #11011100B
        STA PSR
        RTS

I2CStart:
        JSR SetI2CDat
        JSR I2CDelay                ; Delay
        JSR SetI2CClk               ; Clk=1
        JSR I2CDelay                ; Delay
        JSR ClrI2CDat
        JSR I2CDelay                ; Delay
        JSR ClrI2CClk               ; Clk=0
        JSR I2CDelay                ; Delay

        RTS

I2CStop:
        JSR ClrI2CDat               ; Dat=0
        JSR I2CDelay                ; Delay
        JSR SetI2CClk               ; Clk=1
        JSR I2CDelay                ; Delay
        JSR SetI2CDat               ; Dat=1
        JSR I2CDelay                ; Delay
        JSR ClrI2CClk               ; Clk=0
        JSR I2CDelay                ; Delay

        RTS



10: 我晕  如果你把WP接成高电平,那你写一辈子也写不进去!
  老兄,你就拿起烙铁把它接至GND试试看吧 11: 24c02的写保护到底是什么意思?把写保护直接接地就一切正常了,那么这个写保护到底起什么作用啊? 12: 写保护当然是只让你读不让你写啊不过汇编的程序看起来真是累! 13: to:白眼狼  这是24C02的SPEC上的一段话,仔细看看:
  WRITE PROTECT(WP):The write protect input,when connected to GND,allows normal write operations.When WP is connected to VCC,all write operations to the memory are inhibited.
  友情提醒:看样子楼主是写软件出生,出了问题第一反应就是程序错了,然后就把代码帖出来让别人分析;但做我们这一行的,就算你软件写得再牛,如果不了解硬件,基本属于不称职的软件工程师(也许我的词锋有点犀利,那就得罪了);所以,我还是比较相信我以前那家公司的一个台湾人说的话:在这个行业里(电子行业),没有真正的software engineer,只有firmware engineer! 14: 说得对cxd说得对,搞我们这行的,必须要软硬兼施。

通过试验,WP脚通过一个上拉电阻接VCC还是起不了保护作用,仍然可以正常读写。我正在尝试如何让MCU来控制WP,可以在程序运行期间控制WP的写保护和正常读写,如果有此经验的请告知您的做法,谢谢!
15: 我不明白您为什么一定要用MCU来控制WP 只要将WP接地,一切功能就会正常;I2C首先传送的器件地址,所以你不用担心你在写别的器件时会干扰24C02。
我是从来没有用MCU来控制过WP,我想大部分人应该也不会这样做;不过你的想法到是很有创意,如果有什么新的发现,帖上来让大家共享你的成果

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]