0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

I2C總線的工作原理及使用方法詳細分析

2oON_changxuemc ? 來源:未知 ? 2019-06-30 10:34 ? 次閱讀

大家好,通過前一期的學(xué)習(xí),我們已經(jīng)對ICD2 仿真燒寫器和增強型PIC 實驗板的使用方法及學(xué)習(xí)方式有所了解與熟悉,學(xué)會了如何用單片機來控制發(fā)光管、繼電器、蜂鳴器、按鍵、數(shù)碼管RS232 串口、步進電機、溫度傳感器等資源,體會到了學(xué)習(xí)板的易用性與易學(xué)性,看了前幾期實例,當(dāng)你實驗成功后一定很興奮,很有成就感吧!現(xiàn)在我們就趁熱打鐵,再向上跨一步,一起來學(xué)習(xí)一下I2C 總線的工作原理及使用方法,這樣我們可以將一些我們要保存的數(shù)據(jù)存儲到I2C總線的非易失存儲器中,實現(xiàn)斷電保持的功能,比如:你設(shè)置了一個密碼,但不至于這個設(shè)備斷過電以后就要重新設(shè)置過,我們可以將密碼數(shù)據(jù)寫在非易失存儲器里面,還有如汽車的量程表的讀數(shù)是不斷累計的,可以通過不斷訪問I2C 存儲器實現(xiàn)。

一、I2C總線特點

I2C 總線是主從結(jié)構(gòu),單片機是主器件,存儲器是從器件。一條總線可以帶多個從器件( 也可以有多主結(jié)構(gòu)),I2C 總線的SDA 和SCL 是雙向的,開路門結(jié)構(gòu),通過上拉電阻接正電源。進行數(shù)據(jù)傳輸時,SDA 線上的數(shù)據(jù)必須在時鐘的高電平周期保持穩(wěn)定。數(shù)據(jù)線的高或低電平狀態(tài)只有在SCL 線的時鐘信號是低電平時才能改變,如圖1 所示。

圖1 數(shù)據(jù)位的有效性規(guī)定

在SCL 線是高電平時,SDA 線從高電平向低電平切換表示起始條件;當(dāng)SCL 是高電平時SDA 線由低電平向高電平切換表示停止條件如圖2 所示。

圖2 起始和停止信號

發(fā)送到SDA 線上的每個字節(jié)必須為8 位。

可以由高位到低位傳輸多個字節(jié)。每個字節(jié)后必須跟一個響應(yīng)位(ACK)。響應(yīng)時鐘脈沖由主機產(chǎn)生。主機釋放SDA 線從機將SDA 線拉低,并在時鐘脈沖的高電平期間保持穩(wěn)定。如圖3 示。當(dāng)主機接受數(shù)據(jù)時,它收到最后一個數(shù)據(jù)字節(jié)后,必須向從機發(fā)出一個結(jié)束傳送的信號。這個信號是由主機對從機的“非應(yīng)答”來實現(xiàn)的。然后,從機釋放SDA 線,以允許主機產(chǎn)生終止或重復(fù)起始信號。

圖3 字節(jié)格式與應(yīng)答

二、數(shù)據(jù)幀格式

(1)主機向從機發(fā)送數(shù)據(jù),數(shù)據(jù)的傳送方向在傳輸過程中不改變,如圖4 所示。

圖4 主機向從機發(fā)送數(shù)據(jù)

注:陰影部分:表示主機向從機發(fā)送數(shù)據(jù);無陰影部分:表示主機向從機讀取數(shù)據(jù)。

A:表示應(yīng)答;:表示非應(yīng)答。S:起始信號;P :終止信號。

(2)主機在第一個字節(jié)后,立即向從機讀取數(shù)據(jù),如圖5 所示。

圖5 主機在第一個字節(jié)后立即讀從機

(3)復(fù)合格式,如圖6 所示。傳輸改變方向的時候,起始條件和從機地址都會被重復(fù),但R/ W-位取反。如果主機接收器發(fā)送一個停止或重復(fù)起始信號,它之前應(yīng)該發(fā)送了一個不響應(yīng)信號()。

圖6 復(fù)合格式

由以上格式可見,無論哪種傳輸方式,起始信號、終止信號和地址均由主機發(fā)出(圖中陰影部分),數(shù)據(jù)字節(jié)的傳送方向則由尋址字節(jié)中的方向位規(guī)定,每個字節(jié)的傳送都必須有應(yīng)答位(A 或)。

下面通過24C02 實例在增強型PIC 實驗板上編程,其硬件原理圖如圖7 所示,U7 為實驗板上24C02 芯片,SDA 與單片機的RB5 口相連,SCL 與單片機RB4 相連,七段數(shù)碼管D5、D7、D8 組成了顯示單元,字形碼的數(shù)據(jù)通過RC 口送入,各數(shù)碼管的顯示片選信號分別不同的RA 口進行控制。

圖7 讀/ 寫AT24C 系列存儲器原理圖

MPLab IDE 軟件中新建工程,加入源程序代碼,同時進行芯片型號的選擇和配置位的設(shè)置,我們實驗所用的芯片型號為PIC16F877A。

編寫的程序代碼如下,其中程序流程圖如圖8 所示。

三、軟件流程圖

圖8 I2C 總線讀/ 寫數(shù)據(jù)流程圖

四、軟件代碼

/**********/

/* 目標(biāo)器件:PIC16F877A */

/* 晶振:4.0MHZ */

/* 編譯環(huán)境:MPLAB V7.51 */

/**********/

/**********

包含頭文件

**********/

#include

/**********

數(shù)據(jù)定義

**********/

#define address 0xa

#define nop() asm("nop")

#define OP_READ 0xa1

// 器件地址以及讀取操作

#define OP_WRITE 0xa0

// 器件地址以及寫入操作

/**********

端口定義

**********/

#define SCL RB4

#define SDA RB5

#define SCLIO TRISB4

#define SDAIO TRISB5

/**********

共陰LED 段碼表

**********/

const char table[]={0xC0,0xF9,0xA4,0x

B0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x

83,0xC6,0xA1,0x86,0x8E};

/**********

函數(shù)功能: 延時子程序

**********/

void delay()

{

int i;

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

{;}

}

/**********

函數(shù)功能: 開始信號

**********/

void start()

{

SDA=1;

nop();

SCL=1;

nop();nop();nop();nop();nop();

SDA=0;

nop();nop();nop();nop();nop();

SCL=0;

nop();nop();

}

/**********

函數(shù)功能: 停止信號

**********/

void stop()

{

SDA=0;

nop();

SCL=1;

nop();nop();nop();nop();nop();

SDA=1;

nop();nop();nop();nop();

}

/**********

函數(shù)功能: 讀取數(shù)據(jù)

出口參數(shù):read_data

**********/

unsigned char shin()

{

unsigned char i,read_data;

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

{ nop();nop();nop();

SCL=1;

nop();nop();

read_data《=1;

if(SDA == 1)

read_data=read_data+1;

nop();

SCL=0;

}

return(read_data);

}

/**********

函數(shù)功能: 向EEPROM 寫數(shù)據(jù)

入口參數(shù):write_data

出口參數(shù):ack_bit

**********/

bit shout(unsigned char write_data)

{

unsigned char i;

unsigned char ack_bit;

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

{

if(write_data&0x80)

SDA=1;

else

SDA=0;

nop();

SCL = 1;

nop();nop();nop();nop();nop();

SCL = 0;

nop();

write_data 《= 1;

}

nop();nop();

SDA = 1;

nop();nop();

SCL = 1;

nop();nop();nop();

ack_bit = SDA; // 讀取應(yīng)答

SCL = 0;

nop();nop();

return ack_bit;

// 返回AT24Cxx 應(yīng)答位

}

/**********

函數(shù)功能: 向指定地址寫數(shù)據(jù)

入口參數(shù):addr,write_data

**********/

void write_byte(unsigned char addr,

unsigned char write_data)

{

start();

shout(OP_WRITE);

shout(addr);

SDAIO = 0;

// 在寫入數(shù)據(jù)前SDA 應(yīng)設(shè)置為輸出

shout(write_data);

stop();

delay();

}

/**********

函數(shù)功能: 向指定地址讀數(shù)據(jù)

入口參數(shù):random_addr

出口參數(shù):read_data

**********/

unsigned char read_random(unsigned

char random_addr)

{ unsigned char read_data;

start();

shout(OP_WRITE);

shout(random_addr);

start();

shout(OP_READ);

SDAIO = 1;

// 讀取數(shù)據(jù)前SDA 應(yīng)設(shè)置為輸入

read_data = shin();

stop();

return(read_data);

}

/**********

函數(shù)功能: 顯示子程序

入口參數(shù):k

**********/

void display(unsigned char k)

{

TRISA=0X00;

// 設(shè)置A 口全為輸出

PORTC=table[k/1000];

// 顯示千位

PORTA=0xEF;

delay();

PORTC=table[k/100%10];

// 顯示百位

PORTA=0xDF;

delay();

PORTC = table [k/ 10%10] ;

// 顯示十位

PORTA=0xFB;

delay();

PORTC=table[k%10]; // 顯示個位

PORTA=0xF7;

delay();

}

/**********

函數(shù)功能: 主程序

**********/

void main()

{

unsigned char eepromdata;

TRISB=0X00;

OPTION&=~(1《7);

// 設(shè)置RB 口內(nèi)部上拉電阻有效

TRISC=0X00;

PORTB=0X00;

PORTC=0xff;

TRISA=0X00;

eepromdata=0;

write_byte(0x01,0x55);

// 向0x01 地址寫入0x55(85) 的數(shù)據(jù)

delay();

write_byte(0x02,0xaa);

// 向0x02 地址寫入0xAA(170) 的數(shù)據(jù)

delay();

eepromdata=read_random(0x02);

// 讀取其中一個地址內(nèi)的數(shù)據(jù)來驗證

while(1)

{

display(eepromdata);

}

}

編好程序后將編譯好的HEX 碼通過ICD2仿真燒寫器燒入單片機芯片,上電運行,主程序中在0x01 地址寫入了“0x55”, 在0x02 地址寫入了“0xaa”,然后在while 循環(huán)中讀出0x02地址的值,也就是我們之前寫入的“0x55”,讀出后顯示在數(shù)碼管上,我們可以看到數(shù)碼管顯示“170”,即“0xaa”相應(yīng)的十進制數(shù)。

作為初學(xué)者的讀者一定對有些語句會有點疑問,可以看程序中的注釋部份,24c 系列IC 數(shù)據(jù)手冊和源程序相結(jié)合來進行分析。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 單片機
    +關(guān)注

    關(guān)注

    6026

    文章

    44456

    瀏覽量

    631027
  • 存儲器
    +關(guān)注

    關(guān)注

    38

    文章

    7405

    瀏覽量

    163407
  • I2C
    I2C
    +關(guān)注

    關(guān)注

    28

    文章

    1468

    瀏覽量

    122796

原文標(biāo)題:PIC單片機之I2C總線

文章出處:【微信號:changxuemcu,微信公眾號:暢學(xué)單片機】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    I2C總線工作原理和應(yīng)用

    深入探討I2C總線工作原理與應(yīng)用,帶您了解這個在電子領(lǐng)域中扮演著重要角色的通信技術(shù)。 一、簡介 I2C(Inter-Integrated Circuit)
    的頭像 發(fā)表于 08-21 09:24 ?1930次閱讀
    <b class='flag-5'>I2C</b><b class='flag-5'>總線</b>的<b class='flag-5'>工作原理</b>和應(yīng)用

    I2C總線具有什么特點?工作原理是什么?

    I2C總線特點是什么?I2C總線工作原理是什么?USB2I2C功能特點是什么?
    發(fā)表于 05-20 06:27

    詳細分析了VTIM和VMIN的功能

    上一篇文章中,我們詳細分析了VTIM和VMIN的功能,《嵌入式Linux 串口編程系列2--termios的VMIN和VTIME深入理解》 也明白了這兩個參數(shù)設(shè)計的初衷和使用方法,接下來我們 就
    發(fā)表于 11-05 07:09

    i2c總線ppt(I2C總線器件應(yīng)用)

    I2C總線器件應(yīng)用第一節(jié) I2C總線器件應(yīng)用概述I2C總線
    發(fā)表于 08-13 17:34 ?0次下載

    基于Verilog HDL的I2C總線分析

    提出了采用Verilog HDL 設(shè)計I2C 總線分析器的方法,該I2C 總線
    發(fā)表于 08-10 15:32 ?40次下載

    I2C總線在Linux系統(tǒng)中的驅(qū)動設(shè)計

    介紹I2C總線的基本概念和工作原理,敘述I2C總線擴展器件ZLG7290的功能特點。在以S3C2
    發(fā)表于 12-29 16:52 ?40次下載

    I2C總線工作原理與應(yīng)用

    I2C總線工作原理與應(yīng)用     I2C(Inter-Integrated Circuit)總線
    發(fā)表于 03-02 01:20 ?4598次閱讀
    <b class='flag-5'>I2C</b><b class='flag-5'>總線</b>的<b class='flag-5'>工作原理</b>與應(yīng)用

    電子整流器工作原理詳細分析

    電子整流器工作原理詳細分析
    發(fā)表于 02-27 10:43 ?2.5w次閱讀

    基于CPLD的I2C總線接口設(shè)計

    在電路設(shè)計中,I2C總線是比較常用的兩線式串行通信方式,大多數(shù)的CPU都擅長于并口操作,不具備直接操作I2C總線接口的能力。為了使不具備I2C
    發(fā)表于 02-12 16:11 ?95次下載
    基于CPLD的<b class='flag-5'>I2C</b><b class='flag-5'>總線</b>接口設(shè)計

    I2C串行總線的組成及工作原理的PPT課程

    I2C串行總線的組成及工作原理的PPT課程
    發(fā)表于 11-16 19:08 ?0次下載

    SPI總線I2C總線工作原理

    SPI總線I2C總線工作原理,本內(nèi)容詳細介紹了SPI總線
    發(fā)表于 12-08 16:55 ?0次下載

    I2C串行總線的組成及工作原理詳細資料說明

    常用的串行擴展總線有:I2C總線,SPI總線,單總線,Microwire/PLUS。 I2C
    發(fā)表于 07-31 17:35 ?6次下載
    <b class='flag-5'>I2C</b>串行<b class='flag-5'>總線</b>的組成及<b class='flag-5'>工作原理</b>的<b class='flag-5'>詳細</b>資料說明

    單片機的I2C總線工作原理和應(yīng)用等詳細資料說明

    1. I2C串行總線的組成及工作原理 采用串行總線技術(shù)可以使系統(tǒng)的硬件設(shè)計大大簡化、系統(tǒng)的體積減小、可靠性提高。同時,系統(tǒng)的更改和擴充極為容易。常用的串行擴展
    發(fā)表于 07-30 17:35 ?4次下載
    單片機的<b class='flag-5'>I2C</b><b class='flag-5'>總線</b>的<b class='flag-5'>工作原理</b>和應(yīng)用等<b class='flag-5'>詳細</b>資料說明

    I2C串行總線組成及工作原理

    電子發(fā)燒友網(wǎng)站提供《I2C串行總線組成及工作原理.ppt》資料免費下載
    發(fā)表于 11-16 09:23 ?1次下載
    <b class='flag-5'>I2C</b>串行<b class='flag-5'>總線</b>組成及<b class='flag-5'>工作原理</b>

    I2C總線協(xié)議的工作原理和尋址格式

    等特點,在嵌入式系統(tǒng)設(shè)計中得到了廣泛應(yīng)用。本文將詳細介紹I2C總線協(xié)議的工作原理和尋址格式,幫助讀者深入理解該協(xié)議。
    的頭像 發(fā)表于 05-27 15:47 ?1395次閱讀