例說(shuō)單片機數據通信之模擬IIC通信

發(fā)布時(shí)間:2014-10-15 15:00    發(fā)布者:看門(mén)狗
關(guān)鍵詞: 單片機 , SDA , I2C
作者:Liklon

  IIC 即Inter-Integrated Circuit(集成電路總線(xiàn)),這種總線(xiàn)類(lèi)型是由飛利浦半導體公司在八十年代初設計出來(lái)的,主要是用來(lái)連接整體電路(ICS) ,IIC是一種多向控制總線(xiàn),也就是說(shuō)多個(gè)芯片可以連接到同一總線(xiàn)結構下,同時(shí)每個(gè)芯片都可以作為實(shí)時(shí)數據傳輸的控制源。這種方式簡(jiǎn)化了信號傳輸總線(xiàn)。

  I2C串行總線(xiàn)一般有兩根信號線(xiàn),一根是雙向的數據線(xiàn)SDA,另一根是時(shí)鐘線(xiàn)SCL。所有接到I2C總線(xiàn)設備上的串行數據SDA都接到總線(xiàn)的SDA上,各設備的時(shí)鐘線(xiàn)SCL接到總線(xiàn)的SCL上。以51單片機和AT24C02介紹IO模擬IIC通信。

  啟始與停止



  啟始條件:必須在所有命令之前發(fā)送,時(shí)鐘線(xiàn)保持高電平期間,數據線(xiàn)電平從高到低的跳變作為IIC總線(xiàn)的啟動(dòng)信號。

  停止條件:時(shí)鐘線(xiàn)保持高電平期間,數據線(xiàn)電平從低到高的跳變作為IIC總線(xiàn)的停止信號。操作結束時(shí)必須發(fā)送停止條件。

  void startbit()

  {

  clrSCL();

  setSDA();

  setSCL(); //時(shí)鐘為高時(shí)

  clrSDA(); //SDA下降沿

  clrSCL();

  }

  void stopbit()

  {

  clrSCL();

  clrSDA();

  setSCL(); //時(shí)鐘為高時(shí)

  setSDA(); //SDA上升沿

  clrSCL();

  }

  應答信號



  每次數據傳送成功后,從設備發(fā)送一個(gè)應答信號。當第九個(gè)時(shí)鐘信號產(chǎn)生時(shí),產(chǎn)生應答信號的器件將SDA下拉為低,通知已經(jīng)接收到8位數據。

  void respond()

  {

  unsigned char i = 0;

  setSDA(); //釋放總線(xiàn)

  setSCL(); //時(shí)鐘

  while(SDA != 0)

  {

  i++;

  if(i > 200) break;

  }

  clrSCL();

  }

  讀寫(xiě)字節操作



  IIC總線(xiàn)協(xié)議定義如下:

  1. 只有在總線(xiàn)非忙時(shí)才被允許進(jìn)行數據傳輸。

  2. 在數據傳輸時(shí),當時(shí)鐘線(xiàn)為高電平,數據線(xiàn)必須為固定狀態(tài),不允許跳變,時(shí)鐘線(xiàn)為高電平時(shí)數據線(xiàn)的任何電平變化都會(huì )被當做總線(xiàn)的啟動(dòng)或停止條件

  void writeByte(unsigned char dat)

  {

  unsigned char i = 0;

  for(i = 0;i < 8;i++)

  {

  clrSCL(); //拉低時(shí)鐘線(xiàn),改變SDA線(xiàn)的電平

  if(dat & 0x80) setSDA();

  else clrSDA();

  setSCL(); //SDA電平穩定后,拉高時(shí)鐘線(xiàn)

  dat <<= 1;

  }

  clrSCL();

  }

  unsigned char readByte()

  {

  unsigned char i = 0,tmp = 0;

  for(i = 0;i < 8;i++)

  {

  clrSCL(); //拉低時(shí)鐘線(xiàn)

  tmp <<= 1; //準備讀取數據

  setSCL(); //拉高時(shí)鐘線(xiàn)

  if(SDA) tmp |= 0x01;

  }

  clrSCL();

  return tmp;

  }

  AT24C02讀寫(xiě)操作



  void writeAT24XX(unsigned char addr,unsigned char dat)

  {

  startbit(); //起始信號

  writeByte(0xa0); //器件地址

  respond();

  writeByte(addr); //器件內部地址

  respond();

  writeByte(dat); //數據

  respond();

  stopbit(); //停止

  }



  unsigned char readAT24XX(unsigned char addr)

  {

  unsigned char dat;

  startbit(); //起始信號

  writeByte(0xa0); //器件地址

  respond();

  writeByte(addr); //器件內部地址

  respond();

  startbit(); //起始信號

  writeByte(0xa1); //器件地址

  respond();

  dat = readByte(); //數據

  stopbit(); //停止

  return dat;

  }

  主函數部分內容以及程序運行效果:

  void main()

  {

  unsigned char dat;

  initUart();

  sendString("UART INIT OK!!!\n"); //串口通信初始化

  sendString("write 0x05 --> addr 0x00 \n");//寫(xiě)入5到期間內部地址0

  writeAT24XX(0x00,0x05); //寫(xiě)入數據

  sendString("read dat <-- addr 0x00 \n"); //讀出寫(xiě)入數據

  dat = readAT24XX(0x00); //讀出數據

  sendString("dat-->"); //打印

  sendByte(dat + '0');

  while(1);

  }




本文地址:http://selenalain.com/thread-133438-1-1.html     【打印本頁(yè)】

本站部分文章為轉載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問(wèn)題,我們將根據著(zhù)作權人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

相關(guān)在線(xiàn)工具

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页