⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iicwr.c

📁 电能表源码
💻 C
字号:
/*************************************************************************************

	文件类型:IIC总线操作
	文件作用:
	修改权限:
	文件相关:
	
	创 建 人:chenbo
	创建日期:2007.06.21
	当前版本:Ver0.1
	
	版本信息:Ver0.1					GeminiKQ

**************************************************************************************/
#include "Tiger.h"

struct bit_eep {
       unsigned char    b0:1;
       unsigned char    b1:1;
       unsigned char    b2:1;
       unsigned char    b3:1;
       unsigned char    b4:1;
       unsigned char    b5:1;
       unsigned char    b6:1;
       unsigned char    b7:1;
};
union byte_eep{
    struct bit_eep bite;
    unsigned char byte;
};

void delay_4()
{
 nop();
 nop();
}

void eeprom_start()
{
 SET_SCL;
 SET_SDAW;
 EN_SCLOUT;
 EN_SDAOUT;
 SET_SCL;
 SET_SDAW;
 delay_4();
 CLR_SDAW;
 delay_4();
 CLR_SCL;
 delay_4();
}

void eeprom_stop()
{
 EN_SDAOUT;
 EN_SCLOUT;
 CLR_SCL;
 CLR_SDAW;
 delay_4();
 SET_SCL;
 delay_4();
 SET_SDAW;
 delay_4();
 CLR_SCL;
}
//======================================================
//
//
//=========================================================
void eeprom_wb(unsigned char a)
{unsigned char a1;
 union byte_eep eeprom_use;
 EN_SDAOUT;
 EN_SCLOUT;
 eeprom_use.byte=a;
 for(a1=8;a1>0;a1--)
   { if(1==eeprom_use.bite.b7)
         SET_SDAW;
     else
         CLR_SDAW;
   //SDAW_IO=eeprom_use.bite.b7;
     delay_4();
     SET_SCL;
     delay_4();
     CLR_SCL;
     eeprom_use.byte=eeprom_use.byte<<1;
    }
 delay_4();
}

unsigned char eeprom_rb()
{unsigned char a1;
 union byte_eep eeprom_use;
 EN_SDAIN;
 DISEN_SDAOUT;
 EN_SCLOUT;
 delay_4();
 for(a1=8;a1>0;a1--)
   { SET_SCL;
     //delay_4();
     eeprom_use.byte=eeprom_use.byte<<1;
     if((SDAR_IO&0x08)==0x08)
        eeprom_use.bite.b0=1;
     else
        eeprom_use.bite.b0=0;
     //eeprom_use.bite.b0=SDAR_IO;
     CLR_SCL;
     //delay_4();
   }
 return eeprom_use.byte;
}


//============================================
//函数功能:检测写是否正确
//备注:0表示错误,1表示正确
//============================================
unsigned char eeprom_ack()
{unsigned char a;
 a=0;
 EN_SDAIN;
 DISEN_SDAOUT;
 EN_SCLOUT;
 delay_4();
 SET_SCL;
 delay_4();
 while((a!=30)&&((SDAR_IO&0x08)!=0))
    a++;
 if(a==30) 
    a=0;
 else 
    a=1;
 CLR_SCL;
 delay_4();
 return a;
}

void send_ack(void)
{CLR_SDAW;
 CLR_SCL;
 EN_SDAOUT;
 EN_SCLOUT;
 CLR_SDAW;
 delay_4();
 SET_SCL;
 delay_4();
 CLR_SCL;
 DISEN_SDAOUT;
 delay_4();
}

void send_noack(void)
{ SET_SDAW;
  EN_SDAOUT;
  EN_SCLOUT;
  SET_SDAW;
  delay_4();
  SET_SCL;
  delay_4();
  CLR_SCL;
  DISEN_SDAOUT;
  delay_4();
}


//-------------------------------------------------------
//函数功能:从指定的EEPROM中读出需要的数据
//备注:1、参数addr表示的是芯片物理中地址。要读数据的地址放在data.addr中
//      2、返回数据放在读写缓存WR_BUFF数组中,最多一次读取50字节数据
//      3、返回1表示读成功,0表示读数据失败
//-------------------------------------------------------
unsigned char read_byte(a,addr)
unsigned char a,addr;
{unsigned char i,l;   	  
 l=0; 
 eeprom_stop();
 eeprom_start();
 eeprom_wb(addr); 
 #if(Type_EEP==E24C128||Type_EEP==E24C256)
 if(1==eeprom_ack())
  {eeprom_wb(data_addr.byte[2]);                                          
   if(1==eeprom_ack())
       { eeprom_wb(data_addr.byte[3]);                                            
         if(1==eeprom_ack())
          { eeprom_start();
            eeprom_wb(addr|0x1);                                               
            if(1==eeprom_ack())
               { for(i=0;i<a;i++)
                    { wr_buff[i]=eeprom_rb();
                      if(i<(a-1))
                          send_ack();
				      else 
                 	    { send_noack();
                 	      eeprom_stop();
                 	      l=1;
                        }
           	       }
              }
           else 
              { eeprom_stop();
                l=0;
			  }
          }
        else 
      	  { eeprom_stop();
            l=0;
		  }
    }
  else 
    { eeprom_stop();
      l=0;
	}
  }
 else 
  { eeprom_stop();
    l=0;
  }
 #else
 if(1==eeprom_ack())
  { eeprom_wb(data_addr.byte[3]);                                            
    if(1==eeprom_ack())
      { eeprom_start();
        eeprom_wb(addr|0x1);                                               
        if(1==eeprom_ack())
           { for(i=0;i<a;i++)
                { wr_buff[i]=eeprom_rb();
                  if(i<(a-1))
                     send_ack();
				   else 
                     { send_noack();
                       eeprom_stop();
                       l=1;
                     }
           	    }
           }
       else 
           { eeprom_stop();
             l=0;
		   }
     }
   else 
    { eeprom_stop();
      l=0;
	}
  }
 else 
  { eeprom_stop();
    l=0;
  }

 #endif
return l;
}

//-------------------------------------------------------
//函数功能:写数据到指定的EEPROM
//备注:1、参数addr表示的是芯片物理中地址。要写数据的地址放在data.addr中
//      2、要写的数据放在读写缓存WR_BUFF数组中,最多一次写50字节数据
//      3、返回1表示写成功,0表示写失败
//-------------------------------------------------------

unsigned char write_byte(unsigned char a,unsigned char addr,unsigned char *addrpoint)
{unsigned char i,value;     //a==0 kao lv
 CLR_WP;		// WP输出低,允许写入	
 EN_WPOUT; 		// WP允许输出
 CLR_WP;		// WP输出低,允许写入	
 eeprom_stop();
 eeprom_start();
 #if(Type_EEP==E24C128||Type_EEP==E24C256)
   eeprom_wb(addr);    //a2                                     //eeprom_wb(0xa0|((data_addr.addrc[2]<<1)&0xe));
   if(1==eeprom_ack())
      { eeprom_wb(data_addr.byte[2]);
        if(1==eeprom_ack())
             { eeprom_wb(data_addr.byte[3]);
               if(1==eeprom_ack())
                   {value=1;
                    for(i=0;i<a;i++)
                        { eeprom_wb(addrpoint[i]);
                          if(0==eeprom_ack())
                    	      { i=a;
                                value=0;
                              }
                     	}
                      eeprom_stop();
                      return value;
                    }
               else
                 	{ eeprom_stop();
                      return 0;
                    }
            }
          else
            { eeprom_stop();
              return 0;
            }
       }
    else
       { eeprom_stop();
         return 0;
       }
 #else 
   eeprom_wb(addr);             //a2                                     //eeprom_wb(0xa0|((data_addr.addrc[2]<<1)&0xe));
   if(1==eeprom_ack())
      { eeprom_wb(data_addr.byte[3]);
        if(1==eeprom_ack())
            {value=1;
             for(i=0;i<a;i++)
                { eeprom_wb(addrpoint[i]);
                  if(0==eeprom_ack())
            	    { i=a;
                      value=0;
                    }
                }
             eeprom_stop();
             return value;
            }
       else
          	{ eeprom_stop();
              return 0;
            }
      }
  else
     { eeprom_stop();
       return 0;
     }

 #endif

//CLR_WP; 		// WP=1 禁止写入
 }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -