//Logo Image
作者:蔡宗成(2005-05-21);推薦:吳昌暉、徐業良(2005-06-06)

PIC_SERVER教材(14)PIC單晶片I2C通訊簡介與實例

單晶片有平行匯流排與串列匯流排兩種資料傳輸方式可與周邊設備溝通,常見的串列匯流排包括三線式的非同步串列通信(RS232)與同步串列通訊(SPI)、與兩線式同步串列通訊(I2C/USB)等等。本文介紹如何以PIC_SERVERMasterPIC_PROTOSlave,使用I2C界面互相溝通,包括硬體設定、範例程式、及應用實例。

1.     I2C規格簡介

I2CInter-Integrated Circuit的縮寫,原始目的是用於電路板上的IC之間的通訊,由Philips1980年代所發展的雙向兩線式串列匯流排標準[1],具有I2C界面的元件彼此只需要兩條線便能傳輸資料,較平行傳輸架構的可靠性與安全性更佳,且節省空間與成本,通訊速度可達1 MBit/sec,通訊距離一般低於數公尺,但加上放大器後亦可達數十公尺之遠。

如圖1所示,I2C的其中一條線是用於產生時脈clock,名為SCL,另一條線是資料傳輸DIDO,名為SDA。圖1中以PIC_SERVERMaster,其餘元件為Slave的工作模式下,每個Slave必須有自己唯一的位址(address,必須是偶數),Master先對I2C上所有元件廣播,並送出所要溝通元件的位址,所指定的Slave開始與Master連線進行溝通、資料傳遞,其餘Slave不作回應,溝通結束後回到初始狀態,等待下一次動作。表1MasterSlaveI2C溝通程序,當Master要對Slave寫入資料時,是先送出位址(送出一個偶數值),當Master要讀取Slave時,則送出位址+1(送出一個奇數值)。另一種說法是,用一個byte中的7個高位元表示位址,最低的一個位元表示讀或寫。

PIC_SERVER18F4620PIC_PROTO18F452單晶片具有硬體的I2C界面,且CCS Compiler有提供I2C的內建指令,表2CCS所提供的I2C內建指令說明。

1. I2C溝通示意圖

1. MasterSlaveI2C溝通方式

Master傳送資料給Slave

Master initiates transfer

Master (addresses) Slave

Master sends data to Slave

Master terminates transfer

MasterSlave接收資料

Master initiates Slave

Master (addresses + 1) Slave

Master receives data from Slave

Master terminates transfer

2. CCS提供I2C內建指令說明

指令

傳回值

說明

i2c_poll()

1 (TRUE) or 0 (FALSE)

暫存區是否接收到資料

data = i2c_read(1)
data = i2c_read(0)

data - 8 bit 整數

讀取一個byte

i2c_read(1)告知Salve讀完這個byte之後還要繼續讀

i2c_read(0)則告知Slave讀完這個byte之後就去休息

i2c_start()

None

發動I2C通訊,所有的Slave 進入待命狀態,準備接收隨後而來的位址,判別是否與Slave的位址相同,若是,則進入通訊狀態,若否,則回去休息

i2c_stop()

None

停止I2C通訊,所有的Salve 進入休息狀態

i2c_write (data)

ACK bit
0 = ACK
Slave還活著
1 = No ACK
Slave沒回應,若不是Slave當機就是線路故障

傳送一個byte

2.     PIC_SERVER使用I2CPIC_PROTO溝通-硬體設定

PIC_SERVER18F4620PIC_PROTO18F452單晶片具有硬體的I2C界面,但需要外加電源與提升電阻才能運作,連接方式如圖2PIC_SERVERPIC_PROTO都有提升電阻電路設計,圖3PIC_SERVER電路圖,RC3RC4接腳已連接到RP1(2.2k)排阻。圖4PIC_PROTO電路中RC3RC4連接RP4排阻,如果PIC_PROTO作為Slave,不需焊接RP4(2.2k)排阻。圖5(a)PIC_SERVERI2C位置,圖5(b)PIC_PROTOI2C位置,只要連接C3C4,且地線共接,便可完成I2C硬體連接。

2. I2C電路連接提升電阻

3. PIC_SERVER電路中RP1排阻作為I2C的提升電阻

4. PIC_PROTO電路中RP4排阻作為I2C的提升電阻

5(a). PIC_SERVERI2C位置

5(b). PIC_PROTOI2C位置

PIC_SERVER已使用I2C界面與存放網頁檔案的EEPROM元件進行溝通(如圖6),此EEPROM型號為24LC256,使用A0A1、與A2接腳作為設定位址,位址設定方法如表3A0A1、與A2共接到地,電位訊號為0,所以此EEPROM的位址為0xa0PIC_SERVER要寫入資料到24LC256元件時,是送出位址0xa0(偶數值),再送出要寫入的資料,當PIC_SERVER要由24LC256元件讀取資料時,要先送出位址0xa1(奇數值),再進行讀取。如果PIC_SERVER要同時連接其他I2C元件時,必須注意各元件所設定的位址。

6. PIC_SERVER使用I2CEEPROM溝通

3. 24LC256I2C之位址設定方法

Control Code

Chip Select Bits

Read/Write

1

0

1

0

A2

A1

A0

R/W

Slave Address

 

3.     PIC_SERVER使用I2CPIC_PROTO溝通-範例程式

YZ_PIC\Samples\Serial_Devices資料夾提供i2c_hw_master.ci2c_hw_slave.c、與i2c_sw_master.c三個範例程式,其中i2c_hw_master.ci2c_hw_slave.c是四個PICI2C通訊之範例。本文介紹修改i2c_hw_master.ci2c_hw_slave.c兩程式,進行PIC_SERVERPIC_PROTO的一對一溝通,PIC_SERVERMasterPIC_PROTOSlave

7PIC_SERVER作為MasterI2C的範例程式,行數1~4為函數庫引用與基本設定,行數5為定義SlaveI2C的位址為0x04。主程式main裡分為兩部份,第一部份為程式第17~29行,PIC_SERVER寫入資料到PIC_PROTO,先使用i2c_start()指令初始化,再先寫入Slave的位址,接著使用i2c_write()指令寫入“happy”資料,並寫入“#”作為結束碼,接著使用i2c_stop()指令結束I2C溝通。

第二部份為程式第33~46行,PIC_SERVERPIC_PROTO讀取資料,先初始化,再寫入Slave的位址+1,接著使用i2c_read()指令讀取資料,將讀取的資料存入in_data矩陣變數裡,並顯示出來。注意此I2C範例程式沒有使用PIC_SERVER的網路功能。

7. PIC_SERVERMasterI2C範例程式

8PIC_PROTOSlaveI2C範例程式,程式第1~4行為函數庫引用與基本設定,第5行為定義Slave的位址為0x04,行數7CCS內建設定,行數9~10為變數定義,行數12為設定I2CPIC_SERVERpic_SERVER_lib.h檔案裡也有此設定。行數14~30為中斷副程式,當MasterSlave進行I2C溝通時,執行此INT_SSP中斷副程式,先使用i2c_poll()指令判斷暫存區裡是否有資料,如果有,使用i2C_read()指令讀取資料並依序存入i2c_data_rcv矩陣變數裡,直到讀取結束碼“#”停止。當暫存區裡沒有資料時,使用i2c_write()指令將i2c_data_rcv矩陣變數回傳給PIC_SERVER作為資料驗證。

主程式main行數36為設定A4_LED作為程式運作顯示,行數37為設定Port_C的接腳定義,行數38~39為啟動INT_SSP中斷設定。行數44~53while()迴圈,行數48~52為資料接收完畢並顯示。

8. PIC_PROTOSlaveI2C範例程式

9為使用終端機程式顯示PIC_SERVERPIC_PROTO的程式運作情形。

9(a). PIC_SERVERI2C溝通

9(b). PIC_PROTOI2C溝通

4.     PIC_SERVER使用I2C讀取LM75 Temperature sensor

LM75[2]是一顆具有I2C界面的溫度感測器,圖10LM75的接腳定義,+Vs供應5V電壓,量測溫度範圍在-25oC~100oC,精度為±2oC,在-55oC~125oC,精度為±3oCLM75使用A0A1、與A2接腳作為設定位址,位址設定方法如表4,將A0A1、與A2共接到5V,電位訊號為1,則LM75的位址為0x9eLM75的接腳1(SDA)PIC_SERVERRC4LM75的接腳2(SCL)PIC_SERVERRC3,且地線共接。LM75的接腳3(O.S.)不接,本文不多作介紹。

10. LM75溫度感測器接腳圖

4. LM75I2C之位址設定方法

Control Code

Chip Select Bits

Read/Write

1

0

0

1

A2

A1

A0

R/W

Slave Address

 

11PIC_SERVER使用I2C讀取LM75溫度感測器的範例程式,行數1~4為函數庫引用與基本設定,行數5為定義LM75的位址為0x9e,行數7為溫度變數定義,行數9~26主程式main,在while迴圈裡,同樣先初始化I2C,先送出LM75的位址+1,根據LM75的產品使用手冊,LM75會送出16bit的溫度值,所以連續使用兩次i2c_read()指令讀取並存入溫度變數裡,最後結束I2C通訊,然後顯示溫度變數。

11. PIC_SERVER使用I2C讀取LM75溫度感測器的範例程式

12為使用終端機程式顯示PIC_SERVER讀取LM75的程式運作情形。Temp_H變數顯示溫度整數,temp_L變數有0326492196224之遞增與遞減變化。

12. PIC_SERVER讀取LM75的程式運作情形

參考資料

[1]               http://www.semiconductors.philips.com/

[2]               http://www.semiconductors.philips.com/pip/LM75AD.html