共2条
1/1 1 跳转至页
AT24C02 请教AT24C02的写入问题
问
我的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,我想大部分人应该也不会这样做;不过你的想法到是很有创意,如果有什么新的发现,帖上来让大家共享你的成果
我想也应该是程序问题,可是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 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |