久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

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總線通信的設備的效率。

通信相關文章:通信原理


雙控開關相關文章:雙控開關原理


評論


相關推薦

技術專區

關閉