新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > I2C總線時序模擬(一)-加深理解總線協議

        I2C總線時序模擬(一)-加深理解總線協議

        作者: 時間:2016-11-22 來源:網絡 收藏
        [cpp]view plaincopy
        print?
        1. #include
        2. #defineucharunsignedchar
        3. sbitsda=P2^0;
        4. sbitscl=P2^1;//用單片機的兩個I/O口模擬I2C接口
        5. uchara;
        6. ***************************************************************************
        7. voiddelay()//簡單延時函數
        8. {;;}
        9. ***************************************************************************
        10. voidstart()//開始信號SCL在高電平期間,SDA一個下降沿則表示啟動信號
        11. {
        12. sda=1;//釋放SDA總線
        13. delay();
        14. scl=1;
        15. delay();
        16. sda=0;
        17. delay();
        18. }
        19. ***************************************************************************
        20. voidstop()//停止SCL在高電平期間,SDA一個上升沿則表示停止信號
        21. {
        22. sda=0;
        23. delay();
        24. scl=1;
        25. delay();
        26. sda=1;
        27. delay();
        28. }***************************************************************************
        29. voidrespons()//應答SCL在高電平期間,SDA被從設備拉為低電平表示應答
        30. {
        31. uchari;
        32. scl=1;
        33. delay();
        34. while((sda==1)&&(i<250))i++;
        35. scl=0;
        36. delay();
        37. }
        38. ***************************************************************************
        39. voidinit()//總線初始化將總線都拉高一釋放總線發送啟動信號前,要先初始化總線。即總有檢測到總線空閑才開始發送啟動信號
        40. {
        41. sda=1;
        42. delay();
        43. scl=1;
        44. delay();
        45. }
        46. ***************************************************************************
        47. voidwrite_byte(uchardate)//寫一個字節
        48. {
        49. uchari,temp;
        50. temp=date;
        51. for(i=0;i<8;i++)
        52. {
        53. temp=temp<<1;
        54. scl=0;//拉低SCL,因為只有在時鐘信號為低電平期間按數據線上的高低電平狀態才允許變化;并在此時和上一個循環的scl=1一起形成一個上升沿
        55. delay();
        56. sda=CY;
        57. delay();
        58. scl=1;//拉高SCL,此時SDA上的數據穩定
        59. delay();
        60. }
        61. scl=0;//拉低SCL,為下次數據傳輸做好準備
        62. delay();
        63. sda=1;//釋放SDA總線,接下來由從設備控制,比如從設備接收完數據后,在SCL為高時,拉低SDA作為應答信號
        64. delay();
        65. }
        66. ***************************************************************************
        67. ucharread_byte()//讀一個字節
        68. {
        69. uchari,k;
        70. scl=0;
        71. delay();
        72. sda=1;
        73. delay();
        74. for(i=0;i<8;i++)
        75. {
        76. scl=1;//上升沿時,IIC設備將數據放在sda線上,并在高電平期間數據已經穩定,可以接收啦
        77. delay();
        78. k=(k<<1)|sda;
        79. scl=0;//拉低SCL,使發送端可以把數據放在SDA上
        80. delay();
        81. }
        82. returnk;
        83. }
        84. ***************************************************************************
        85. voidwrite_add(ucharaddress,uchardate)//任意地址寫一個字節
        86. {
        87. start();//啟動
        88. write_byte(0xa0);//發送從設備地址
        89. respons();//等待從設備的響應
        90. write_byte(address);//發出芯片內地址
        91. respons();//等待從設備的響應
        92. write_byte(date);//發送數據
        93. respons();//等待從設備的響應
        94. stop();//停止
        95. }
        96. ***************************************************************************
        97. ucharread_add(ucharaddress)//讀取一個自己
        98. {
        99. uchardate;
        100. start();//啟動
        101. write_byte(0xa0);//發送發送從設備地址寫操作
        102. respons();//等待從設備的響應
        103. write_byte(address);//發送芯片內地址
        104. respons();//等待從設備的響應
        105. start();//啟動
        106. write_byte(0xa1);//發送發送從設備地址讀操作
        107. respons();//等待從設備的響應
        108. date=read_byte();//獲取數據
        109. stop();//停止
        110. returndate;//返回數據
        111. }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 衡水市| 东源县| 大方县| 邵武市| 泾源县| 娱乐| 逊克县| 玛沁县| 翁牛特旗| 牡丹江市| 威海市| 宁化县| 赣州市| 新干县| 仙游县| 滦平县| 天水市| 五家渠市| 白银市| 临朐县| 大埔区| 威远县| 黑龙江省| 吐鲁番市| 巩留县| 汤阴县| 江华| 江源县| 夏邑县| 沧源| 大田县| 瑞丽市| 安平县| 东丰县| 静安区| 徐汇区| 蚌埠市| 汕尾市| 余干县| 昌乐县| 新沂市|