注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

易拉罐的博客

心静自然凉

 
 
 

日志

 
 

IIC总线编程  

2012-07-18 09:48:08|  分类: 串行通信 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

/******************************************************************************
 * 函数名称:ISendStr
 *
 * 功能描述:从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
 *            地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
 *           如果返回1表示操作成功,否则操作有误。
 *          
 *
 * 参    数:sla - 从器件地址
 *           suba - 从器件子地址
 *           *s - 数据
 *           no - 数据字节数目
 *
 * 返 回 值:0 -- 失败
 *           1 -- 成功
 *
 * 注    意:使用前必须已结束总线。
 *****************************************************************************/

uint8 ISendStr(uint8 sla,uint8 suba,uint8 *s,uint8 no)
{
   uint8 i;

   Start_I2c();               /*启动总线*/
   SendByte(sla);             /*发送器件地址*/
     if(ack==0)return(0);
   SendByte(suba);            /*发送器件子地址*/
     if(ack==0)return(0);
   for(i=0;i<no;i++)
    {  
     SendByte(*s);            /*发送数据*/
       if(ack==0)return(0);
     s++;
    }
 Stop_I2c();                  /*结束总线*/
  return(1);
}

 

/******************************************************************************
 * 函数名称:Start_I2c
 *
 * 功能描述:启动I2C总线,即发送I2C起始条件.
 *
 * 参    数:无
 *
 * 返 回 值:无
 *****************************************************************************/
void Start_I2c()
{
  IO_DIR_PORT_PIN(1, 0, IO_OUT);    //设置P1.0为输出
  IO_DIR_PORT_PIN(1, 1, IO_OUT);    //设置P1.1为输出
 
  SDA=1;                   /*发送起始条件的数据信号*/
  asm("NOP");
  SCL=1;
  QWait();                /*起始条件建立时间大于4.7us,延时*/
  QWait();
  QWait();
  QWait();
  QWait();   
  SDA=0;                   /*发送起始信号*/
  QWait();                 /* 起始条件锁定时间大于4μs*/
  QWait();
  QWait();
  QWait();
  QWait();      
  SCL=0;                   /*钳住I2C总线,准备发送或接收数据 */
  asm("NOP");
  asm("NOP");
}

 

/******************************************************************************
 * 函数名称:SendByte
 *
 * 功能描述:将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
 *           此状态位进行操作.(不应答或非应答都使ack=0 假)    
 *           发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
 *
 * 参    数:c - 需发送的数据
 *
 * 返 回 值:无
 *****************************************************************************/
void  SendByte(uint8 c)
{
 uint8 BitCnt;
 IO_DIR_PORT_PIN(1, 0, IO_OUT);    //设置P1.0为输出
 IO_DIR_PORT_PIN(1, 1, IO_OUT);    //设置P1.1为输出
 for(BitCnt=0;BitCnt<8;BitCnt++)  /*要传送的数据长度为8位*/
    {
     if((c<<BitCnt)&0x80)SDA=1;   /*判断发送位*/
       else  SDA=0;               
      asm("NOP");
     SCL=1;                       /*置时钟线为高,通知被控器开始接收数据位*/
      QWait();
      QWait();                    /*保证时钟高电平周期大于4μs*/
      QWait();
      QWait();
      QWait();        
     SCL=0;
    }   
    QWait();
    QWait();
    QWait();
    SDA=1;                        /*8位发送完后释放数据线,准备接收应答位*/
    asm("NOP");
    IO_DIR_PORT_PIN(1, 1, IO_IN); 
    SCL=1;
    QWait();
    QWait();
    QWait();
    QWait();
    if(SDA==1)ack=0;    
    else ack=1;                   /*判断是否接收到应答信号*/
    SCL=0;  
    QWait();
    QWait();
    IO_DIR_PORT_PIN(1, 1, IO_OUT);
}

 

 /******************************************************************************
 * 函数名称:Stop_I2c
 *
 * 功能描述:结束I2C总线,即发送I2C结束条件.
 *
 * 参    数:无
 *
 * 返 回 值:无
 *****************************************************************************/
void Stop_I2c()
{
  IO_DIR_PORT_PIN(1, 0, IO_OUT);    //设置P1.0为输出
  IO_DIR_PORT_PIN(1, 1, IO_OUT);    //设置P1.1为输出
  SDA=0;                            /*发送结束条件的数据信号*/
  asm("NOP");                       /*发送结束条件的时钟信号*/
  SCL=1;                            /*结束条件建立时间大于4μs*/
  QWait();
  QWait();
  QWait();
  QWait();
  QWait();
  SDA=1;                           /*发送I2C总线结束信号*/
  QWait();
  QWait();
  QWait();
  QWait();
}

  评论这张
 
阅读(275)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017