阅读:1667回复:7
求救:dsp与EEPROM的接口编程!
我现在在用DSPTMS320LF2407与EEPROM24LC256通过IO口通讯,可是一旦写完控制字和块内高、低地址后,写字节到EEPROM就会应答出错!这是怎么回事!那位高手救救小妹!
|
|
|
沙发#
发布于:2003-06-17 19:52
直接贴上来看
|
|
板凳#
发布于:2003-06-18 22:27
程序贴在上面了!
问题具体是这样的:当发送的无论是控制字、高低地址还是数据时,当8位数据中最低一位为1的时候,应答信号就出错(1为出错),当最低一位为0的时候,应答信号就正确(0为正确)。 如,当发送“读”控制字(0A0H)时,应答信号为1,出错 当发送“写”控制字(0A1H)时,应答信号为0,正确 请问这是怎么回事?? |
|
|
地板#
发布于:2003-06-22 17:45
是不是因为最低位的问题呢?
|
|
地下室#
发布于: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 ;---------------------------------------------------------- |
|
5楼#
发布于:2003-06-27 11:15
我分析是你的DSP出的时钟太快,EEPROM还没来得及响应,DSP读取的ACK位是你数据的最低位。正确方法是一直读取ACK位(要送时钟)直到正确的ACK位后再继续后续时序。
|
|
|
6楼#
发布于:2003-06-27 11:40
我现在能够正确接受应答信号了!
但是读进来的数据为全1,所以不知道是因为我写入没有成功,还是读数据的时候出了问题! 另外,在进行读的时候,当送完写控制字,高位地址,低位地址后要立即发送开始信号后才能再送读控制字。问题就在于,该开始信号接在低位地址的应答信号(SDA=0)后,不知道SDA由0-〉1->0中0-〉1的跳变是放在scl时钟信号的高电平处,还是低电平处。因为放在低电平处,会不会判为第10位数据位;放在高电平处,会不会判为结束信号? 急需答案!! |
|
7楼#
发布于:2003-06-29 11:16
把片子写入后取下来在编程器上读一下,看是否写进去了。我估计是你没写进去。
|
|
|