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

📄 i2c.c

📁 使用MSP430F413的低功耗水表系统
💻 C
字号:
/*****************************************************************************/
/*公司名称:     杭州五星电子                                                */
/*模块名:       i2c通信                                                     */
/*创建人:       赖智城                      日期 2008-4-17                  */
/*修改人:                                   日期 2008-5-13                  */
/*功能描述:24cxx eerom 进行指定地址的n位读写                                */
/*其他功能                                                                   */
/*版本号:33 34 00                                                           */
/*****************************************************************************/
uchar F0;

//发送起始信号
void str_i2c(void)
{
           P6DIR|=SDA+SCL;
           _NOP();
           SDA_1;
	   _NOP();
           SCL_1;
	   _NOP();
	   _NOP();
           _NOP();
           _NOP();
           _NOP();	//起始建立时间大于4.7us
	   SDA_0;
	   _NOP();
	   _NOP();
           _NOP();
           _NOP();     //大于4us
           SCL_0;
}
//发送结束信号
void stop_i2c(void)
{
     SDA_0;
   //_NOP();
     SCL_1;
     _NOP();
     _NOP();
     _NOP();
     _NOP(); 
     SDA_1;
     _NOP();
     _NOP();
     _NOP();
     _NOP();
     SCL_0;
}
//发送iic总线应答信号
void  ack_i2c(uchar a)
{
     if(!a) SDA_0;//ACK
     else SDA_1;			//NACK
   //_NOP();
     SCL_1;
     _NOP();
     _NOP();
     _NOP();
     _NOP();//delay1(1);
     SCL_0;
     if(a)SDA_0; else SDA_1;
}

//发送一个字节
wrbyte_i2c(uchar c)
{
  uchar i;
  for(i=8;i;i--)
     {
      if(c&0x80)SDA_1;
      else SDA_0;
      //_NOP();
      SCL_1;
      _NOP();
      _NOP();
      _NOP();
      _NOP();//delay1(1);
      SCL_0;
      c=c<<1;
     }
   //_NOP();
      DIR_IN;
  //SDA_1;//=释放数据线,准备接收应答信号
  //_NOP();
     SCL_1;
     _NOP();
     _NOP();
     _NOP();
     _NOP();//delay1(1);//SDA=0 SCL=1
     if(SDA_IN) {F0=1;P6DIR&=~(SDA+SCL);}//判断是否收到应答信号-------未收到ACK
     else F0=0;//   ------收到ACK
     SCL_0;
     DIR_OUT;
}
//读取一个字节
uchar rdbyte_i2c(void)
{
  uchar i,r=0;
  DIR_IN;
  for(i=8;i;i--)
     {
      r=r<<1; //左移补0
      //_NOP();
      SCL_1;  //使数据有效
      _NOP();
      _NOP();
      _NOP();
      _NOP();      
      if(SDA_IN) r++;
      SCL_0;
     }
  DIR_OUT;
  return r;
}
//发送N个字节
void WRNBYTE_I2C(uchar addrh,uchar addrl,uchar *s,uchar num)
{
  unsigned char i;
  str_i2c();  
  wrbyte_i2c(addrh);  //发送从器件地址
  if(F0) return;
  wrbyte_i2c(addrl);
  if(F0) return;
  if(s==0)return;//s=0不发送数据
  for(i=num;i;i--)
  {
   wrbyte_i2c(*s);
   if(F0) return;
   s++;
  }
  stop_i2c();
  delay_ms(15);//ATML
  //延时10~15ms来将数据写入EEPROM
  P6DIR&=~(SDA+SCL);
}
//读取N个字节
void RDNBYTE_I2C(uchar addrh,uchar addrl,uchar *s,uchar num)
{
  uchar i;
  str_i2c();
  wrbyte_i2c(addrh);  //发送从器件地址
  if(F0) return;
  wrbyte_i2c(addrl);  //发送指令
  if(F0) return;
  str_i2c();
  addrh|=1;
  wrbyte_i2c(addrh);  //发送从器件地址
  if(F0) return;
  for(i=num-1;i;i--)
     {
      *s=rdbyte_i2c();
      ack_i2c(0);//ack
      s++;
     }
  *s=rdbyte_i2c();
  ack_i2c(1);//nack
  stop_i2c();
  P6DIR&=~(SDA+SCL);
}

⌨️ 快捷键说明

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