这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 综合技术» 基础知识» 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 跳转至

回复

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