查看: 843|回复: 0
打印 上一主题 下一主题

用TWI中断对24c16的字节读写 共享

[复制链接]
跳转到指定楼层
沙发
发表于 2016-4-14 21:24:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//TWI初始化

TWSR=0x00;

TWBR=0x06;

TWAR=0x01;

TWCR=0x41;



//TWI中断函数



SIGNAL(SIG_2WIRE_SERIAL)

{//IIC中断

  switch(eep_int_seq)

   {

           case 1 :

                   {

                    if((TWSR&0xf8) != 0x08)

                     {//发送start信号出错

                      eep_int_seq=1;

                      TWCR = 0xa5;                        //错误,启动start信号

                      return;

                     }

                    else

                     {//发送start信号成功

                      TWDR=slave_rw&0xfe;                //发送器件地址

                   TWCR &= ~0x20;                        //清start发送标志

                     }

                    break;

                   }

           case 2 :

                   {

                 if((TWSR&0xf8) != 0x18)

                  {//发送器件地址出错

                   eep_int_seq=1;

                      TWCR = 0xa5;                        //错误,启动start信号

                      return;

                  }

                 else

                  {//发送器件地址成功

                   TWDR=eeprom_addr;

                  }

                 break;

                }

        case 3 :

                {

                 if((TWSR&0xf8) != 0x28)

                  {//发送eeprom地址出错

                   eep_int_seq=1;

                      TWCR = 0xa5;                        //错误,启动start信号

                      return;

                  }

                 else

                  {//发送eeprom地址成功

                   if((slave_rw&0x01)==0)  //写数据进eeprom

                    TWDR=eeprom_data;

                   else

                    {//从eeprom读数据

                     TWCR = 0xa5;                        //重新启动start信号

                     eep_int_seq++;

                     return;

                    }

                  }

                 break;

                }

        case 4 :

                {

                 if((slave_rw&0x01)==0)

                  {//写eeprom

                   if((TWSR&0xf8) != 0x28)

                    {//发送eeprom数据出错

                     eep_int_seq=1;

                        TWCR = 0xa5;                        //错误,启动start信号

                        return;

                    }

                   else

                    {//发送eeprom数据成功

                     eep_int_seq=0;//0xff;

                     write_eep_flag=YES;        //写eeprom延时标志

                     TWCR = 0x94;                         //发送停止信号

                     return;

                    }

                  }

                 else

                  {//读eeprom

                   if((TWSR&0xf8) != 0x10)

                    {//重发start信号出错

                     eep_int_seq=1;

                        TWCR = 0xa5;                        //错误,启动start信号

                        return;

                    }

                   else

                    {//重发start信号成功

                     TWDR=slave_rw;                        //发器件地址

                     TWCR &= ~0x20;                        //清start发送标志

                    }

                  }

                 break;

                }

        case 5 :

                {

                 if((TWSR&0xf8) != 0x40)

                  {//发送器件地址出错

                   eep_int_seq=1;

                      TWCR = 0xa5;                        //错误,启动start信号

                      return;

                  }

                // else

                 // TWCR |= 0x04;                        //slave_rw发送成功,并接收到ack

                 break;

                }

        case 6 :

                {

                 if((TWSR&0xf8) != 0x50 && (TWSR&0xf8) != 0x58)

                  {

                   eep_int_seq=1;

                      TWCR = 0xa5;                        //错误,启动start信号

                      return;

                  }

                 else

                  {//发送器件地址成功

                   eep_int_seq=0;//0xff;

                   //write_eep_flag=YES;

                   get_eeprom_data=TWDR;

                   TWCR |= 0x94;//发送停止信号

                   return;

                  }

                 break;

                }

        default : break;

   }

  eep_int_seq++;

  TWCR |= 0x80;                //清TWINT标志

}



//AT24C16的字节读写函数

void OprateEepromByte(unchar read_flag,unchar byte_addr,unchar byte_data)

{

  slave_rw=(read_flag&0x0f)|0xa0;

  eeprom_addr=byte_addr;

  eeprom_data=byte_data;

  eep_int_seq=1;

  TWCR |= 0xa4;                        //启动start信号

}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表