资讯详情

IIC总线通信模拟

语言:C语言 简介:IIC总线作为一种通信规范,广泛应用于各种芯片之间以及内部通信。可以毫不夸张的讲,不懂IIC总线的就不算是学过电子!
    /**************************************************************************/       #include"reg51.h"       #include "intrins.h"       /**************************端口定义************************************/        sbit SDA=P1^0;             //IIC数据总线        sbit SCL=P1^1;             //IIC时钟总线        /**************************数组定义************************************/        unsigned char wdata[8]={0x32,0xb5,0xab,0xd0,0xd6,0x50,0x3a,0xd3};        unsigned char rdata[8];           /**************************函数声明************************************/        void iic_start(void);        void iic_stop(void);        bit iic_write_byte(unsigned char wdata);        unsigned char iic_read_byte(bit re_data);        bit iic_read_some_bytes(unsigned reg_add,unsigned char *rdata,unsigned char len);        bit iic_write_some_bytes(unsigned reg_add,unsigned char *wdata,unsigned char len);           /**************************主函数**************************************/        void main(void)       {        ..................       }        /*************************IIC函数**************************************/       void iic_start(void)                                {       SDA=1;       _nop_();       SCL=1;       _nop_();      _nop_();      SDA=0;      _nop_();      _nop_();      SCL=0;     _nop_();    }   //_______________________________________________________________________void iic_stop(void)                                    {   SDA=0;  _nop_();  _nop_();  SCL=1;  _nop_();  _nop_();  SDA=1;  _nop_();  _nop_();  _nop_();  _nop_();}//_______________________________________________________________________bit iic_write_byte( unsigned char wdata )            {  unsigned char i=0;   for ( i =0 ;i < 8 ;i ++ )  { if ( wdata & 0x80 ) {  SDA=1;  _nop_(); } else {  SDA=0;  _nop_(); }   wdata <<= 1;  SCL=1;     _nop_();  SCL=0;  _nop_();     }   _nop_();   SDA=1;   _nop_();   SCL=1;   _nop_();      if(!SDA==1)   {         SCL=0;  _nop_();  return 1;            }   else                {  SCL=0;  _nop_();  return 0;   }}//_______________________________________________________________________// iic_read_byte re_data -- whether send ack bitunsigned char iic_read_byte(bit re_data)    {  unsigned char rdata=0,i=0;  SDA=1;   for(i=0;i<8;i++)  {      rdata <<=1;      SCL=0;      _nop_();      SCL=1;      _nop_();     if(SDA==1)     {           rdata++;      }     _nop_();  }  _nop_();  SCL=0;  _nop_();  if(re_data)  {       SDA=1;      _nop_();  }  else  {      SDA=0;     _nop_();  }  _nop_();  SCL=1;  _nop_();  SCL=0;  _nop_();  return(rdata);}//_______________________________________________________________________________________________________bit iic_write_some_bytes(unsigned reg_add,unsigned char *wdata,unsigned char len) {  unsigned i;  iic_start();  if(!iic_write_byte(0xA0))  {      iic_stop();   _nop_();   return 0;  }  if(!iic_write_byte(reg_add))  {      iic_stop();   _nop_();   return 0;  }  for(i=0;i<len;i++)  {     if(!iic_write_byte(wdata[i]))  {       iic_stop();    _nop_();    return 0;  }  }  iic_stop();  _nop_();  return 1;}//________________________________________________________________________________________________________bit iic_read_some_bytes(unsigned reg_add,unsigned char *rdata,unsigned char len)   {  unsigned char i;  iic_start();  if(!iic_write_byte(0xA0))  {     iic_stop();  _nop_();  return 0;  }  if(!iic_write_byte(reg_add))  {     iic_stop();  return 0;  }  iic_stop();  iic_start();  if(!iic_write_byte(0xA0|1))  {     iic_stop();  return 0;  }  for(i=0;i<len-1;i++)  {     rdata[i]=iic_read_byte(0);  _nop_();  }  rdata[i]=iic_read_byte(1);  iic_stop();  return 1; }
以上IIC总线模拟带有数据传输失败处理机制,是标准的IIC总线规范。在实际使用过程中,对于ACK应答信号的处理往往可以 简化!另外,对于不同的单片机或者主控芯片,可能涉及端口输入输出设置问题。在IIC读写数据时就会出现端口输入与输出的切换。 例如 C宏晶单片机就会涉及设置问题!以上使用的是标准51单片机,不涉及输入输出设置问题。 -电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

 锐单商城 - 一站式电子元器件采购平台  

 深圳锐单电子有限公司