打印
[ZLG-ARM]

I2C接收数据总是0xff?盼高手解答

[复制链接]
2583|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
silentband|  楼主 | 2008-5-30 15:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
I2c, TE, sd, IO, ui
      程序如下:

      Tend_I2C_Star();              //开始
      Tend_I2C_Byte(0xa0);          //24LC64器件地址,写入
      
      Tend_I2C_Byte(0x00);          //子地址高字节
      
      Tend_I2C_Byte(0x00);          //子地址低字节
      
      Tend_I2C_Byte(0x55);          //写入数据为0x55
      
      Tend_I2C_End();               //停止
      
      delayms(10);                  //延时10ms等待数据写入
      
      Tend_I2C_Star();              //再次启动
      Tend_I2C_Byte(0xa0);          
      
      Tend_I2C_Byte(0x00);
  
      Tend_I2C_Byte(0x00);      
 
      Tend_I2C_Byte(0xa1);         //器件地址,读出操作
    
      data_buf[0]=Recv_I2C_Byte();
     
      Tend_I2C_ACK(1);            //主机应答信号
      Tend_I2C_End();
    
      UART0_SendBuf(data_buf,1);

//    函数名称:    Recv_I2C_Byte(void)
//    MCU接收一个字节

uint8 Recv_I2C_Byte(void)
{
    uint8  i,recv_data;
    
    recv_data = 0;
    
    IO0DIR  = IO0DIR & EEP_SDA_IN;    // 方向寄存器[输入]      
    for(i=0;i<8;i++)
    {
        I2C_SDA_1();
        I2C_SCL_1();
        delay(4);
        recv_data = recv_data<<1;
        if ((IO0PIN&EEP_SDA_OUT)!=0)
             recv_data = recv_data | 0x01;
    }
    return(recv_data);


//    函数名称:    Tend_I2C_Byte(void)
//    发送一个字节到 I2C-EEPROM

void Tend_I2C_Byte(uint8 tend_data)
{
    uint8  i;
    
    for(i=0;i<8;i++)
    {
        if (((tend_data<<i)&0x80)==0)
            I2C_SDA_0();
        else
        I2C_SDA_1();
        I2C_SCL_1();
        delay(5);
        I2C_SCL_0();
    }
    IO0DIR   = IO0DIR & EEP_SDA_IN;                 // 方向寄存器[输入]
    I2C_SCL_1();
    delay(3);
    err_bz = 1;
    for(i=0;i<200;i++)
    {
        if ((IO0PIN&EEP_SDA_OUT)==0)
            {err_bz = 0;break;}
    }
    I2C_SCL_0();
    delay(2);




每次读到的数都是0xff,在每个操作之后查询ACK,从器件都能响应。用的LPC2132,GPIO模拟I2C~曾经有老师说I2C只要有应答都好办,呵呵,现在真的不好办了...求助了

相关帖子

沙发
helanmao| | 2008-5-30 16:42 | 只看该作者

程序小改一下试试

1、在“//器件地址,读出操作”之前先停止写操作,再重新开始读操作试试。
2、在读操作停止前, 将“//主机应答信号”换成not_ack信号试试。

使用特权

评论回复
板凳
eyuge2| | 2008-5-30 20:42 | 只看该作者

有问题

uint8 Recv_I2C_Byte(void)这个函数中的for循环,我只看到了 I2C_SCL_1(),没看到 I2C_SCL_0()。

  recv_data = recv_data<<1;
  if ((IO0PIN&EEP_SDA_OUT)!=0)
     recv_data = recv_data | 0x01;
这几句循序是不是也有问题,recv_data = recv_data<<1;应该放在后面才对吧。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

78

主题

272

帖子

0

粉丝