6673|5

80

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

24LC64的EEPROM,用I2C方式读字节时SDA总是1,为什么啊 [复制链接]

所有字节的每一位都通过SDA传出,肯定有1有0.代码和以下的类似。
char ReadI2CByte(void)    {
        /*从I2C总线读一个字节*/
        char b=0,i;
        for(i=0;i<8;i++)
        {
            SDA=1;    /*释放总线*/
            SCL=1;    /*接受数据*/
            DELAY(10);
            F0=SDA;
            DELAY(10);
            SCL=0;
            if(F0==1)
                {
                    b=b<<1;
                    b=b0x01;
                }
            else
                b=b<<1;
        }
        return b;
    }
另外,我调试写函数的时候觉得好像是写进去了。因为程序每一步都和我预想相同。我想问一下 ,写入EEPROM的值,除了“读出”这个方法外,有没有其他办法知道到底有没有写进去,写对没有?能不能像在VC里面调试程序一样看内存的内容?我用的是开发环境是IAR 4.3,CPU是MSP430F2618,仿真器是USB口的 ,型号忘记了。呵呵

最新回复

在另外的一个帖子,已回复了。   详情 回复 发表于 2010-6-29 22:57
点赞 关注

回复
举报

76

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
看你的仿真环境咯,假如可以看到iic寄存器里面的数据,那么就可以看到读到的数据,至于发送的数据就难搞了,因为你难以知道它是否发送成功。最好的办法还是读出,只要写进一个数,读出的时候正确,才说明读写都正常。假如真的要调试,那么用示波器来分析它的时序吧。呵呵。
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
EEPROM里面有寄存器吗?该怎么看?另外,延时的长短对读写有没有影响啊
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

4
 
示波器
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

5
 
现在我把代码贴一下。代码我觉得应该没什么问题。是参考了几个类似的例子写出来的。现在问题是写不进去。I2CReceiveACK函数中SDA_IN一直为1 ,也就是SDA线P3.1一直为高,所以一直停在那里。
//使用MSP430F2618 完成该功能,P3.2 作为SCL,P3.1 作为SDA  EEPROM型号为24LC64


#define SDA_1 P3OUT |= BIT1 //SDA = 1
#define SDA_0 P3OUT &= ~BIT1 //SDA = 0
#define SCL_1 P3OUT |= BIT2 //SCL = 1
#define SCL_0 P3OUT &= ~BIT2 //SCL = 0
#define DIR_IN P3DIR &= ~BIT1 //I/O 口为输入
#define DIR_OUT P3DIR |= BIT1 //SDA 输出数据
#define SDA_IN ((P3IN >> 1) & 0x01)





void dly_usec(int time)
{
  for(int j=0;j }

void i2c_start(void)
{  
  DIR_OUT ;
  SDA_1 ; dly_usec(5) ;
  SCL_1 ; dly_usec(5) ;     
  SDA_0 ; dly_usec(5) ;   
  SCL_0 ; dly_usec(9) ;   
}
//.............................................................................
void i2c_stop(void)
{  
  DIR_OUT ;
  SDA_0 ; dly_usec(5);
  SCL_1 ;  dly_usec(6) ;
  SDA_1 ;      
}

void I2CReceiveACK(void)
{
  SCL_1;
  dly_usec(5);
  DIR_IN;
  while(SDA_IN);
  DIR_OUT;
  SCL_0;
  dly_usec(5);
}
void I2CAcknowledge(void)
{
  DIR_OUT;
  SCL_0;
  SDA_0;
  dly_usec(5) ;
  SCL_1;
  dly_usec(5) ;
  SCL_0;
}
//....先写高位
void i2c_wr(unsigned char wrbyte)         
{
  unsigned char bit_count = 0 ;   
  DIR_OUT ;
  while(bit_count<8)
  {
    SCL_0;
    dly_usec(9) ;     
    if((wrbyte&0x80)==0x80)
      SDA_1;
    else
      SDA_0;
    dly_usec(5) ;
    SCL_1;   
    dly_usec(4) ;
    wrbyte=wrbyte<<1;   
    bit_count++ ;dly_usec(10) ;
  }  // increment bit counter(repeat for 8b)
    SCL_0;
    SDA_1;                 
    dly_usec(5) ;     
}
//....先读高位
unsigned char i2c_rd(void)      // read an 8b streaming
{
  unsigned char bit_count = 0 ,temp, eep_buf;     
  DIR_OUT;
  SCL_0;
  dly_usec(5) ;  
  SDA_1;               
  DIR_IN ;
  while(bit_count<8)   
{
   SCL_1;
   dly_usec(9) ;
   temp=SDA_IN;           
   dly_usec(9) ;

   eep_buf=((eep_buf<<1)|temp);
   SCL_0;
   dly_usec(9) ;           
   bit_count++ ;
  }  // increment bit counter(repeat for 8b)
  return eep_buf ;   
}

void Byte_Write(unsigned int eep_adr,unsigned char lofsstr,unsigned char *source)
{
   unsigned char k = 0 ;  
   i2c_start();  // START command
   i2c_wr(DEV_ADR_WR);     // write SLAVE ADDRESS + wr_bit
   //I2CReceiveACK();
   i2c_wr(eep_adr>>8);     // write high address
   //I2CReceiveACK();
   i2c_wr(eep_adr&0xff) ;  // write low address
   //I2CReceiveACK();
   while(k    {
     i2c_wr(*source) ;     // stream data in the memory
     I2CReceiveACK();
     source++  ;             // increment pointer
     k++  ;               // increment counter
    }                                               // do until end
   i2c_stop()  ;        // STOP command
   dly_usec(10) ;       // final write cycle time
}         
//............................................................................
void Byte_Read(unsigned int eep_adr,unsigned char lofdstr,unsigned char *dest)
{  
  unsigned char k = 0        ;  // auxiliary counter
   i2c_start()                ;  // START command
   i2c_wr(DEV_ADR_WR)                   ;  // write slave address + write_bit
  // I2CReceiveACK();
   i2c_wr(eep_adr>>8)                   ;  // write the high_byte of the adr
  // I2CReceiveACK();
   i2c_wr(eep_adr&0xff)                   ;  // write the  low_byte of the adr
  // I2CReceiveACK();
   i2c_start()                ;  // REPEATED START condition
   i2c_wr(DEV_ADR_RD)                   ;  // change the direction of the trsf
  // I2CReceiveACK();
   if(lofdstr==1)   ;            // if single byte string
  //         {;}                         // do nothing , the byte will be read
                                 // & the NACK will be sent at the end
   else
   {
       while(k 1
                                 // do for the first (lofdstr-1) bytes
      {
        *dest = i2c_rd()           ;  // read byte
        I2CAcknowledge();
         dest++ ; k++ ;  
       }     
   }  // increment pointer & counter
     *dest = i2c_rd()         ;  // read the last byte
   I2CAcknowledge();
     //nack_mcu()               ;  // send the final NACK (for the last byte)   
     i2c_stop()         ;   
}  


main()
{
          while(1)
          {
           unsigned char mybyte;
          unsigned char dst_str[9];
         
          mybyte=0x02;
          Byte_Write(0x00,1,&mybyte);                    
          Byte_Read(0x00,1,dst_str);
          }

}         
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

6
 
在另外的一个帖子,已回复了。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表
  缈昏瘧锛