<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > I2C總線(xiàn)的單片機C語(yǔ)言實(shí)現及其應用

I2C總線(xiàn)的單片機C語(yǔ)言實(shí)現及其應用

作者: 時(shí)間:2012-02-08 來(lái)源:網(wǎng)絡(luò ) 收藏

1 概述

本文引用地址:http://dyxdggzs.com/article/172160.htm

(Intel-Integrated Circuit)是荷蘭的Philips公司于八十年代初推出的一種芯片間串行擴展技術(shù)。它用兩根線(xiàn)(數據線(xiàn)SDA、時(shí)鐘線(xiàn)SCL)可完成總線(xiàn)上主機與器件的全雙工同步數據傳送,可極方便地構成多主機系統和外圍器件擴展系統。總線(xiàn)支持所有NMOS、CMOS、TTL等工藝制造的器件,其上所有的節點(diǎn)都連到同名的SDA、SCL上。I2C總方法,數據傳送都有相同的操作模式,接口電器特性相同且獨立,可在系統供電情況下從系統中移去或增加IC芯片,有I2C接口的外圍器件都有應答能力,讀寫(xiě)片內單元時(shí)有地址自動(dòng)加1功能,易多個(gè)字節的自動(dòng)操作。近年來(lái),國際上有關(guān)公司制造了多達幾百種的I2C總線(xiàn)器件,如8051系列8XC752、LCD驅動(dòng)器、RAM、I/O接口等芯片都使用了I2C總線(xiàn)接口。隨著(zhù)數字技術(shù)的發(fā)展,I2C總線(xiàn)控制系統已經(jīng)于越來(lái)越多的電子產(chǎn)品。

2 I2C總線(xiàn)的數據傳輸

2.1 接口特性

I2C總線(xiàn)接口的數據線(xiàn)SDA和時(shí)鐘線(xiàn)SCL必須經(jīng)過(guò)上拉電阻接到正電源VDD上,各個(gè)I2C接口電路輸出端必須是漏極開(kāi)路或集電極開(kāi)路,以便完成“線(xiàn)與”的功能。I2C的SDA和SCL都是雙向傳輸線(xiàn),當總線(xiàn)空閑時(shí),此兩線(xiàn)都是“1”(高電平)。由于不同的器件都會(huì )接到I2C總線(xiàn),邏輯的“0”(低)及“1”(高)的信號電平取決于VDD的電壓??偩€(xiàn)上能連接的最大器件數取決于其電容容限400PF。

2.2 I2C總線(xiàn)上的傳輸時(shí)序

I2C總線(xiàn)上每傳輸一位數據都有一個(gè)時(shí)鐘脈沖相對應,在標準模式下可達100 kbit/s,高速模式下可達400kbit/s,總線(xiàn)上依據器件功能不同可建立簡(jiǎn)單的主/從關(guān)系(master/slave),只有帶CPU的器件才可成主控器。圖1為I2C總線(xiàn)一次完整的數據傳輸。SCL為高期間,SDA狀態(tài)必須穩定,SCL為低時(shí)才允許SDA狀態(tài)變化。SCL保持高電平期間,SDA出現由高至低的轉換將啟動(dòng)I2C總線(xiàn),出現由低至高的轉換將停止數據傳輸。起始和終止信號通常由主控器產(chǎn)生。I2C總線(xiàn)的信號時(shí)序有嚴格規定,本采用標準模式,SCL低電平周期≥4.7μs,SCL高電平周期≥4.0μs,START和STOP之間的總線(xiàn)空閑時(shí)間≥4.7μs。

I2C 總線(xiàn)上傳送的每個(gè)字節必須為8位,啟動(dòng)和停止之間可傳輸的數據字節數不受限制。采用串行傳送,首先傳送最高位,每傳送一個(gè)字節后必須跟一個(gè)應答位。主控器產(chǎn)生應答所需的時(shí)鐘脈沖期間,發(fā)送器必須釋放數據線(xiàn)(SDA為高),以便接收器輸出應答位。低電平為應答信號,高電平為非應答信號。非應答信號是當主控器作為接收器時(shí),收到最后一個(gè)字節數據后,必須發(fā)送一個(gè)非應答信號給被控發(fā)送器,使被控發(fā)送器釋放數據線(xiàn),以便主控器發(fā)停止信號,終止數據傳送。當從器件不能再接收字節時(shí)也會(huì )出現非應答信號這種情況。

I2C總線(xiàn)上的器件一般有兩個(gè)地址:受控地址和通用廣播訪(fǎng)問(wèn)地址,每個(gè)器件有唯一的受控地址用于定點(diǎn)通信,而相同的通用廣播訪(fǎng)問(wèn)地址則用于主控方同時(shí)對所有器件進(jìn)行訪(fǎng)問(wèn)。如圖1所示,起始信號后主控器發(fā)送的第一個(gè)字節就是被讀器件的受控地址,稱(chēng)作尋址字節。尋址字節由高7位地址和最低1位方向位組成,方向位為“0”表明主控器對被控器的寫(xiě)操作(W),方向位為 “1”表明對被控器的讀操作(R)??偩€(xiàn)上每個(gè)器件在起始信號后都把自己的地址與尋址字節的前7位相比較,如相同則器件被選中,產(chǎn)生應答,并根據讀寫(xiě)位決定在數據傳送中是接收還是發(fā)送。無(wú)論是主發(fā)、主收還是從發(fā)、從收,都是由主器件控制,數據傳送完后,主控器都必須發(fā)停止信號。

46.jpg
3 I2C總線(xiàn)的C51

C51是針對Intel的8位MCS-51系列而開(kāi)發(fā)的、具有一般C特點(diǎn)的高級編程語(yǔ)言。從1985年至今,有許多公司推出 51系列的C語(yǔ)言編譯器,其中以Franklin C51編譯器在代碼生成方面較為領(lǐng)先,它可生成最少的代碼,支持浮點(diǎn)和長(cháng)整數、重入和遞歸。頭文件reg51.h中包含了51的特殊功能寄存器(SFR)的字節定義與位定義。為了與具有I2C總線(xiàn)接口的51單片機兼容,可在程序開(kāi)始處定義單片機的P1.6和P1.7作為I2C總線(xiàn)的SCL和SDA信號,實(shí)際中也可用其它的I/O引腳作為SCL和SDA信號。C51語(yǔ)言中只要用賦值語(yǔ)句”=”就可I/O口某位的數據輸出和讀入?,F將I2C總線(xiàn)底層讀寫(xiě)函數接口及功能列舉如下,它可用于沒(méi)有內部I2C接口的51系列單片機與I2C總線(xiàn)器件通信。
#include<reg51.h>
/*全局符號定義*/
#define HIGH1
#define LOW 0
#define FALSE0
#define TRUE1
#define time 1
#define uchar unsigned char  
#define uint unsigned int
sbit SCL=P1^6;
sbie SDA=P1^7;

1)函數原型:void delay(uchar nu m) 

功  能:用for()循環(huán)提供延時(shí)。在實(shí)際中可依具體情況改變傳入參數,但必須滿(mǎn)足I2C總線(xiàn)時(shí)序中對SCL高、低電平周期的要求,本應用中取1,調用形式為delay(time)。

2)函數原型:void start(void) 

功  能:提供I2C總線(xiàn)工作時(shí)序中的起始位,在SCL=HIGH期間,SDA出現由高到底的轉變,返回前將SCL拉低,允許數據變化,準備傳輸。其中調用函數1。

3)函數原型:void stop(void) 

功  能:函數提供I2C總線(xiàn)工作時(shí)序中的起始位,在SCL=HIGH期間,SDA出現由低到高的轉變。其中調用函數1。

4)函數原型:void sendbyte(uchar b,uchar*error) 

功  能:在時(shí)鐘作用下,將入口參數b中8位數據由高至低通過(guò)SDA線(xiàn)發(fā)送,并讀回應答信號,存于指針變量*error中。其中調用函數1、2、3。

5)函數原型:void readbyte(uchar*b,bit Ack) 

功  能:函數在時(shí)鐘作用下接收8位數據,存于*b中,先接收的為高位,并發(fā)送應答信號(Ack=0),當接收到最后一字節時(shí)發(fā)送非應答(Ack=1)。其中調用函數1、2、3。

6)函數原型:void send-n-byte(uchar*info,uint n,uchar address,uchar*fault) 功  能:向I2C器件連續發(fā)送n個(gè)數據字節,數據存于數組info[]中,address為器件受控地址,末位為0(寫(xiě)),n個(gè)數據的地址可作為數據字節發(fā)送,或設置地址自動(dòng)加減功能。*fault存收到的應答位。其中調用函數1-4.

7)函數原型:void receive_n_byte(uchar*info,uint n,uchar address,uchar*fault) 

功  能:從I2 C器件連續接收n個(gè)字節的數據,存于數組info[]中,address為器件地址,本函數保證器件地址末位是1(讀),n個(gè)數據的器件內地址可作為數據字節發(fā)送,或設置地址自動(dòng)加減功能。收最后一字節時(shí)發(fā)非應答信號1。*fault存收到的應答位。其中調用函數1-5。

以下僅以sendbyte()函數原型為例說(shuō)明C51如何具體實(shí)現I2C總線(xiàn)的發(fā)送:
void sendbyte(uchar b,uchar*error)
{int count;
bit data_bit;
*error=0;
for(count=7;count>=0;count--)
{data_bit=(bit)(b&0x80);
b=b<<1;
/*送數據位,產(chǎn)生時(shí)鐘脈沖*/
SDA=data_bit;
SCL=LOW;delay(time);
SCL=HIGH;delay(time);
SCL=LOW;delay(time);

/*釋放數據線(xiàn),產(chǎn)生時(shí)鐘脈沖,讀回應答*/
SDA=HIGH;

SCL=LOW;delay(time);
SCL=HIGH;delay(time);
*error=(uchar)SDA;
/*釋放數據線(xiàn),時(shí)鐘置低*/
SDA=HIGH;
SCL=LOW;delay(time);}


上一頁(yè) 1 2 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>