wzhenhua 发表于 2012-12-11 14:51:27

ATmega16 读写FM24C04 问题

程序在接收数据的地方有问题
      while(!(TWCR & (1<<TWINT)))
      {
                if(--err==0)                         ////读数据
                {
                        return 6;
                }
      }


wzhenhua 发表于 2012-12-11 14:52:55

//初始话
void TWI_FM24_INIT(void)
{
TWBR=0X00;
TWCR=TWCR|(1<<TWEN);//TWCR_TWEN=1//wzh   
}

//------------------------------------------------------------------------------------------------

u8 I2C_Write(u8 addr,u8 udata)
{
      u16 err;
      
      TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);      //发出STATA信号
      err = 1000;
      while((!(TWCR & (1<<TWINT))))
      {
                if(--err==0)
                {
                        return 1;
                }
      }
               
      TWDR = sLOVADDR|WRITE;                     //从器件地址
      TWCR = (1<<TWINT)|(1<<TWEN);
      err = 1000;
      while((!(TWCR & (1<<TWINT))))
      {
                if(--err==0)
                {
                        return 2;
                }
      }

      TWDR = addr;                           //字节地址
      TWCR = (1<<TWINT)|(1<<TWEN);
      err = 1000;
      while((!(TWCR & (1<<TWINT))))
      {
                if(--err==0)
                {
                        return 3;
                }
      }
               
      TWDR = udata;                        //发送数据
      TWCR = (1<<TWINT)|(1<<TWEN);
      err = 1000;
      while((!(TWCR & (1<<TWINT))))
      {
                if(--err==0)
                {
                        return 4;
                }
      }
      
      TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);    ////发出STOP信号
      
      return 0;
}




/****************读*********************/

u8 I2C_Read(u8 addr)
{
      //u8 udata=0;
      u16 err;
      TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);      //发出STATA信号
      err = 1000;
      while(!(TWCR & (1<<TWINT)))    //等待 TWINT置位, TWINT置位表示START信号已发出
      {
                if(--err==0)
                {
                        return 1;
                }
      }

      TWDR = sLOVADDR|WRITE;                  //从器件地址
      TWCR = (1<<TWINT)|(1<<TWEN);
      err = 1000;
      while(!(TWCR & (1<<TWINT)))
      {
                if(--err==0)
                {
                        return 2;
                }
      }
      
      
      
      TWDR = addr;                            //字节地址
      TWCR = (1<<TWINT)|(1<<TWEN);
      err = 1000;
      while(!(TWCR & (1<<TWINT)))
      {
                if(--err==0)
                {
                        return 3;
                }
      }
               
      TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);      //发出STATA信号
      err = 1000;
      while(!(TWCR & (1<<TWINT)))
      {
                if(--err==0)
                {
                        return 4;
                }
      }
      //wzh---------------------
         //TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);      //发出Restart信号   
          // while(!(TWCR&(1<<TWINT)));                   //等待TWINT置位         
       //----------------   
      TWDR = sLOVADDR|READ;                      //从器件地址-读数据
      TWCR = (1<<TWINT)|(1<<TWEN);
      err = 1000;
      while(!(TWCR & (1<<TWINT)))
      {
                if(--err==0)
                {
                        return 5;
                }
      }
      
      
      TWCR = (1<<TWINT)|(1<<TWEN);//|(1<<TWEA);
       // delay_us(5);
      //TWCR =TWCR|~0x80;
      err = 10000;
      while(!(TWCR & (1<<TWINT)))
      {
                if(--err==0)                         ////读数据
                {
                        return 6;
                }
      }
      
      ReveValue_g = TWDR;
               
      TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);    ////发出STOP信号

      return 0;
}

wzhenhua 发表于 2012-12-11 14:54:22

试了几个程序都有问题

高手问看看

wzhenhua 发表于 2012-12-11 16:17:24

没有人用过?

wzhenhua 发表于 2012-12-11 22:10:40

没人搞过?
来自:amoBBS 阿莫电子论坛 Android客户端

wzhenhua 发表于 2012-12-12 13:51:42

问题解决,FM24C04的工作电压是5V.程序是好用的
页: [1]
查看完整版本: ATmega16 读写FM24C04 问题