新闻中心

EEPW首页>嵌入式系统>设计应用> 基于I2C总线的单主多从单片机之间的通信

基于I2C总线的单主多从单片机之间的通信

作者: 时间:2013-02-17 来源:网络 收藏

  4.1 主机发送/从机接收I2C子程序流程图

  图2和图3给出了主机发送,从机接收I2C子程序流程图,通过发送/接收数据时,的控制寄存器的中断位必须先置位,为了避免因为某种原因不能使控制寄存器的中断位置位而导致程序进入死循环,作者在通信程序发送/接收数据前编写了中断循环等待和错误处理程序,大大提高了程序的可靠性,具体程序如下:

  while(!(TWCR (1TWINT) j10000) j++;

  if(j>10000) return O:

  应用I2C总线发送数据时,作者采用了状态位查询方法,并且给出了错误标志置位、错误跳出程序,下面的程序是发送从机地址的部分程序:

  switch(TWSR 0XF8)

  {

  case Oxl8: flag=0; break;

  case 0x20:flag=1; break;

  case 0x38:flag=l; break;

  default:return 0:

  }

  if(flag) continue;

图2 I2C主机发送程序框图

  程序中的flag=0表示从机地址发送成功,flag=1表示从机地址发送失败,当TWSR寄存器中的状态码为0x18时,表明从机地址已发送,并且接收到ACK,同时错误标志“flag”置0,下一步通过心发送数据,当TWSR寄存器中的状态码为0x20时,表明从机地址已发送,但是接收到NO ACK,同时错误标志”flag”置1,下一步执行“if(flag)continue;”语句,结束本次循环,当TWSR寄存器中的状态码为0x38时,表明从机地址仲裁失败,同时错误标志“flag”置1,下一步执行“if(flag)continue;"语句,结束本次循环。总线将释放,并进入未寻址从机模式,总线空闲后将发送“start”。程序中“if(flag)continue;”语句使得当数据发送失败时,结束本次循环,返回到开始等待发送命令,这样避免了由于偶尔数据发送失败造成整个程序无法运行,甚至整个设备无法运行,因而,用“if(flag)continue;”语句结束错误传输。可提高I2C通信的质量,同时也提高了使用I2C总线通信的设备的效率。

通信相关文章:通信原理


双控开关相关文章:双控开关原理


评论


相关推荐

技术专区

关闭