標(biāo)題: 51單片機(jī)IIC時(shí)序及對(duì)IIC器件使用時(shí)的一些理解和源程序 [打印本頁(yè)]

作者: yang陽(yáng)    時(shí)間: 2018-9-8 11:10
標(biāo)題: 51單片機(jī)IIC時(shí)序及對(duì)IIC器件使用時(shí)的一些理解和源程序
IIC時(shí)序在多種通訊方式中是明顯比較復(fù)雜,他不僅在時(shí)間上有嚴(yán)格的要求,而且還具有多種模式。
新手往往對(duì)SCK,SDA還有讀寫(xiě)應(yīng)答時(shí)序很難理解,而且對(duì)主從機(jī)與接收發(fā)送機(jī)的關(guān)系很頭疼。
這次整理了一些常用程序和個(gè)人理解,以及IIC協(xié)議講解,希望對(duì)大家有幫助。

一、IIC通訊協(xié)議其實(shí)對(duì)大部分iic器件是通用的,但是它有不同的工作模式,比如說(shuō)在單片機(jī)中,我們就學(xué)習(xí)了標(biāo)準(zhǔn)模式(PCF8591 A/D轉(zhuǎn)換芯片),快速模式(24C02存儲(chǔ)芯片),其實(shí)還有HS模式等等,目前我感覺(jué)得區(qū)別就是時(shí)間上的區(qū)別。


二、對(duì)于應(yīng)答信號(hào)來(lái)說(shuō),雖然主機(jī)和從機(jī)的身份是固定的,但是接收方和發(fā)送方的身份是可以變化的,而且應(yīng)答信號(hào)的產(chǎn)生是接收方發(fā)出的,所以比如說(shuō)讀的時(shí)候,主機(jī)是接收方,從機(jī)是發(fā)送方,主機(jī)在讀完數(shù)據(jù)后,需要根據(jù)情況發(fā)出(非)應(yīng)答信號(hào);寫(xiě)的時(shí)候則是相反的,需要從機(jī)作出應(yīng)答。


三、接收從機(jī)應(yīng)答的時(shí)序和讀時(shí)序其實(shí)很相似,都需要自從機(jī)接收數(shù)據(jù)。


SDA_IN與起始、終止及寫(xiě)時(shí)序有關(guān)
SDA_OUT與應(yīng)答、讀時(shí)序有關(guān)

單片機(jī)源程序如下:
  1. /**********************BST-V51實(shí)驗(yàn)開(kāi)發(fā)板例程************************
  2. *  平臺(tái):BST-V51 + Keil U3 + STC89C52
  3. *  名稱(chēng):為IIC總線的基本驅(qū)動(dòng)程序(此程序沒(méi)有寫(xiě)主函數(shù),只是一些IIC必備的子函數(shù))
  4. *  晶振:11.0592MHZ
  5. *  說(shuō)明:免費(fèi)開(kāi)源,不提供源代碼分析.
  6. ******************************************************************/

  7. #include<reg51.h>
  8. #include <intrins.h>
  9. #define uint unsigned int
  10. #define uchar unsigned char
  11. sbit sda=P2^0;                          //IO口定義
  12. sbit scl=P2^1;

  13. void nop()
  14. {
  15.         _nop_();
  16.         _nop_();
  17. }
  18. /////////24C02讀寫(xiě)驅(qū)動(dòng)程序////////////////////
  19. void delay1(unsigned int m)
  20. {        unsigned int n;
  21.           for(n=0;n<m;n++);
  22. }

  23. void init()  //24c02初始化子程序
  24. {
  25.         scl=1;
  26.         nop();
  27.         sda=1;
  28.         nop();
  29. }

  30. void start()        //啟動(dòng)I2C總線
  31. {
  32.         sda=1;
  33.         nop();
  34.         scl=1;
  35.         nop();
  36.         sda=0;
  37.         nop();
  38.         scl=0;
  39.         nop();
  40. }

  41. void stop()         //停止I2C總線
  42. {
  43.         sda=0;
  44.         nop();
  45.         scl=1;
  46.         nop();
  47.         sda=1;
  48.         nop();
  49. }

  50. void writebyte(unsigned char j)  //寫(xiě)一個(gè)字節(jié)
  51. {
  52.         unsigned char i,temp;
  53.            temp=j;
  54.            for (i=0;i<8;i++)
  55.    {
  56.            temp=temp<<1;
  57.            scl=0;
  58.            nop();
  59.            sda=CY;                //temp左移時(shí),移出的值放入了CY中
  60.            nop();
  61.            scl=1;                //待sda線上的數(shù)據(jù)穩(wěn)定后,將scl拉高
  62.            nop();
  63.    }
  64.    scl=0;
  65.    nop();
  66.    sda=1;
  67.    nop();
  68. }

  69. unsigned char readbyte()   //讀一個(gè)字節(jié)
  70. {
  71.    unsigned char i,j,k=0;
  72.    scl=0; nop(); sda=1;
  73.    for (i=0;i<8;i++)
  74.    {  
  75.                 nop(); scl=1; nop();
  76.               if(sda==1)
  77.                 j=1;
  78.               else
  79.                 j=0;
  80.               k=(k<<1)|j;
  81.                   scl=0;
  82.         }
  83.            nop();
  84.         return(k);
  85. }

  86. void clock()         //I2C總線時(shí)鐘
  87. {
  88.    unsigned char i=0;
  89.    scl=1;
  90.    nop();
  91.    while((sda==1)&&(i<255))
  92.              i++;
  93.    scl=0;
  94.    nop();
  95. }
復(fù)制代碼

所有資料51hei提供下載:
iic時(shí)序及講解.rar (1.4 MB, 下載次數(shù): 43)
51單片機(jī)IIC常用函數(shù).rar (1.04 KB, 下載次數(shù): 35)



作者: amwu_1984    時(shí)間: 2019-9-17 10:14
收藏學(xué)習(xí)一下
作者: linge100    時(shí)間: 2020-4-16 09:20
收藏學(xué)習(xí)學(xué)學(xué)。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1