chenglijun02
驱动牛犊
驱动牛犊
  • 注册日期2003-06-13
  • 最后登录2003-06-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1666回复:7

求救:dsp与EEPROM的接口编程!

楼主#
更多 发布于:2003-06-13 14:26
我现在在用DSPTMS320LF2407与EEPROM24LC256通过IO口通讯,可是一旦写完控制字和块内高、低地址后,写字节到EEPROM就会应答出错!这是怎么回事!那位高手救救小妹!
附件名称/大小 下载次数 最后更新
2003-06-13_eeprom1.asm (9KB)  2
huttu
驱动大牛
驱动大牛
  • 注册日期2002-11-19
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望25点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-06-17 19:52
直接贴上来看
chenglijun02
驱动牛犊
驱动牛犊
  • 注册日期2003-06-13
  • 最后登录2003-06-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-06-18 22:27
程序贴在上面了!
问题具体是这样的:当发送的无论是控制字、高低地址还是数据时,当8位数据中最低一位为1的时候,应答信号就出错(1为出错),当最低一位为0的时候,应答信号就正确(0为正确)。
如,当发送“读”控制字(0A0H)时,应答信号为1,出错
    当发送“写”控制字(0A1H)时,应答信号为0,正确
请问这是怎么回事??
附件名称/大小 下载次数 最后更新
2003-06-18_eeprom1.asm (10KB)  0
huttu
驱动大牛
驱动大牛
  • 注册日期2002-11-19
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望25点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-06-22 17:45
是不是因为最低位的问题呢?
linjunchao
驱动牛犊
驱动牛犊
  • 注册日期2003-01-14
  • 最后登录2005-04-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-06-27 10:50

我有51读写24LC01的程序(已调试通过),你同你的程序对一对,找找看看有没有时序问题;
另外,DSP时序快,IIC总线频率高时,上拉电阻不能太大,你尝试把上拉电阻减小,或者在你的程序你多加些NOP,我记得以前54X对24LC256调通过。

;*********************************************************
; read a byte from eeprom
; r7:input address temp:output data
;*********************************************************
eeprom_rd:
lcall iic_start
nop
nop
mov temp,#0a0h
lcall iic_send
lcall iic_ack

mov temp,r7
lcall iic_send
lcall iic_ack

lcall iic_start

mov temp,#0a1h
lcall iic_send
lcall iic_ack

lcall iic_receive
lcall iic_noack
lcall iic_stop

ret

;*********************************************************
; write a byte to eeprom
; r7:input address r6:input data
;*********************************************************
eeprom_wr:
lcall iic_start

mov temp,#0a0h
lcall iic_send
lcall iic_ack

mov temp,r7
lcall iic_send
lcall iic_ack

mov temp,r6
lcall iic_send
lcall iic_ack

lcall iic_stop

mov temp_1,#10
eeprom_wr_delay0:
mov temp_2,#200
eeprom_wr_delay1:
djnz temp_2,eeprom_wr_delay1
djnz temp_1,eeprom_wr_delay0

ret

;*********************************************************
; simulate iic timing
; SCL:P3.4 SDA:P3.5
;*********************************************************
iic_start:
SETB SDA
lcall iic_delay
SETB SCL
lcall iic_delay
CLR SDA
lcall iic_delay
RET

iic_stop:
CLR SDA
lcall iic_delay
SETB SCL
lcall iic_delay
SETB SDA
lcall iic_delay
RET

iic_clock:
setb SCL
lcall iic_delay
mov c,SDA
CLR SCL
lcall iic_delay
RET

iic_send:
mov r0,#8
mov a,temp
iic_send_loop:
clr SCL
lcall iic_delay

rlc a
mov SDA,c
lcall iic_delay

setb SCL
lcall iic_delay
djnz r0,iic_send_loop

clr SCL
RET

iic_receive:
setb SDA

mov r0,#8
mov a,#0
clr c
iic_receive_loop:
clr SCL
lcall iic_delay
setb SCL

mov c,SDA
rlc a
lcall iic_clock

djnz r0,iic_receive_loop

mov temp,a
ret

iic_delay:
mov temp_1,#5
iic_delay_loop:
NOP
NOP
djnz temp_1,iic_delay_loop
RET

iic_ack:
setb SDA
lcall iic_delay
setb SCL
lcall iic_delay
CLR SCL
lcall iic_delay
ret

iic_noack:
setb SDA
lcall iic_delay
setb SCL
lcall iic_delay
CLR SCL
lcall iic_delay
ret
;----------------------------------------------------------
lllggg
驱动小牛
驱动小牛
  • 注册日期2002-05-04
  • 最后登录2007-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-06-27 11:15
我分析是你的DSP出的时钟太快,EEPROM还没来得及响应,DSP读取的ACK位是你数据的最低位。正确方法是一直读取ACK位(要送时钟)直到正确的ACK位后再继续后续时序。
(DEEP + BROAD + SIMPLE) & delicate
chenglijun02
驱动牛犊
驱动牛犊
  • 注册日期2003-06-13
  • 最后登录2003-06-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-06-27 11:40
我现在能够正确接受应答信号了!
但是读进来的数据为全1,所以不知道是因为我写入没有成功,还是读数据的时候出了问题!
另外,在进行读的时候,当送完写控制字,高位地址,低位地址后要立即发送开始信号后才能再送读控制字。问题就在于,该开始信号接在低位地址的应答信号(SDA=0)后,不知道SDA由0-〉1->0中0-〉1的跳变是放在scl时钟信号的高电平处,还是低电平处。因为放在低电平处,会不会判为第10位数据位;放在高电平处,会不会判为结束信号?
急需答案!!
lllggg
驱动小牛
驱动小牛
  • 注册日期2002-05-04
  • 最后登录2007-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-06-29 11:16
把片子写入后取下来在编程器上读一下,看是否写进去了。我估计是你没写进去。
(DEEP + BROAD + SIMPLE) & delicate
游客

返回顶部