?

主從可配置I2C總線接口IP及其應用*

2010-09-26 04:24龔向東黃虹賓2劉春平
電訊技術 2010年1期
關鍵詞:字節寄存器時鐘

龔向東,黃虹賓2,劉春平

(1.深圳大學 電子科學與技術學院,廣東 深圳 518060;2.深圳大學 機電與控制工程學院,廣東 深圳 518060)

1 引 言

I2C總線作為一種簡單、高效的二線制雙向串行傳輸總線,在電子器件及系統中應用非常普遍[1],其嚴格的通信規范[2]保證了數據傳輸的可靠性。在基于FPGA的可編程片上嵌入式系統的研究開發中,往往需要設計定制I2C總線控制器,并以IP核的形式集成到系統中。目前,文獻中介紹的關于I2C總線接口的設計或對第三方I2C總線接口IP核的應用研究[3~5],功能上局限于作為I2C主設備端口使用,或僅能用作I2C從設備端口。本文介紹一種I2C總線控制器IP,可以編程配置為主設備端口或從設備端口,因此,提供了更廣泛的應用選擇。這個IP核由美國SLS公司(System Level Solutions, Inc.)發布[6],具有完全兼容Philips I2C標準、支持多I2C主端口工作、寬輸入時鐘頻率范圍等特點。

本文首先簡要介紹該主從可配置I2C總線控制器IP的硬件結構,然后著重論述在Altera 的Nios II可編程片上嵌入式系統中該IP核的系統集成和應用編程技術,最后給出了實際應用例子。

2 IP核的硬件結構

SLS的I2C總線控制器IP的內部硬件結構如圖1所示,主要由波特率時鐘發生器、寄存器模塊、并行I/O編程接口、I2C編程接口以及I2C接口內核5個模塊組成,其它模塊用于連接Nios II系統的Avalon總線或用于臨時數據存儲。

圖1 I2C IP核的硬件結構Fig.1 Hardware architecture of the I2C IP core

在5個主要模塊中,波特率時鐘發生器模塊向I2C接口內核提供可編程設置的時鐘信號,以便后者產生合適的I2C移位時鐘SCL;寄存器模塊包括數據移位寄存器、本地地址寄存器、控制寄存器、狀態寄存器和時鐘寄存器以及這些寄存器的控制電路;并行I/O編程接口模塊用于訪問寄存器時的接口命令處理;I2C編程接口模塊則為上述寄存器以及波特率時鐘寄存器建立相應的訪問地址;而最核心的I2C接口內核模塊實現符合I2C串行協議的數據傳輸。

除了產生SCL時鐘信號外,為了確保數據傳輸符合嚴格的I2C規范,I2C接口內核模塊具有處理5種級別I2C總線活動的功能:

(1)握手命令處理,檢測來自并行接口的I2C傳輸開始命令和結束命令;

(2)工作模式處理,確定工作模式(包括從端口接收、從端口發送、主端口接收、主端口發送)和相應的傳輸方向;

(3)宏幀處理,檢測幀類型(地址幀或數據幀)以及幀內的不同階段;

(4)微幀處理,幀的移位過程處理;

(5)信號處理,確定I2C總線SDA上的start、stop信號以及SCL時鐘的躍遷變化條件。

3 IP核的系統集成

目前,在采用32位軟核處理器的可編程片上嵌入式系統中,Nios II[7]系統的應用最為廣泛。Nios II片上嵌入式系統通過Altera設計軟件Quartus II中的SOPC Builder工具構建,并在其FPGA器件上實現。Nios II 處理器、各種系統組件或外設接口IP通過系統內部Avalon總線互連,本I2C總線控制器IP核在系統中的應用結構如圖2(a)所示。用戶應用程序通過硬件抽象層(HAL)系統訪問硬件,作為軟件運行環境的HAL系統將C標準庫、應用程序接口(API)和設備驅動程序集成在一起,其關系如圖2(b)所示。

圖2 I2C IP核應用的硬件/軟件結構

Fig.2 Hardware/software schemes of the I2C IP core application

為了將I2C IP核封裝到系統中,需要的文件包括:

(1)硬件文件:IP核的HDL語言硬件設計文件;

(2)軟件文件:定義IP核內部寄存器映像的C語言頭文件以及設備驅動程序文件;

(3)組件描述文件:用SOPC Builder的組件編輯器編輯IP核組件時自動生成的文件,這個文件提供了將IP核集成到系統的信息。

當采用SOPC Builder創建了Nios II應用硬件系統后,就可以在Altera的Nios II集成開發環境(IDE)中創建相應的HAL系統庫,并進行IP核的應用編程。

4 IP核的應用編程

該I2C總線控制器的使用涉及到以下5個HAL API函數。

4.1 int open(const char* pathname,int flags)

該函數以指定的讀寫方式(O_RDONLY、O_WRONLY或O_RDWR)打開設備文件,并返回該設備文件號,如:

int fd;

fd=open(I2C_MASTER_0_NAME,O_RDWR);

即以可讀可寫方式打開設備宏名為I2C_MASTER_0_NAME的I2C總線控制器IP核,設備宏名已在構建Nios II應用系統時生成的系統描述文件(system.h)中定義。

4.2 ioctl(int fd,int req,void*arg)

該函數用于對fd指定的已打開設備進行I/O操作管理,其中參數req給出操作請求、參數arg給出與req請求相應的信息。本I2C總線控制器定義了以下操作請求:

(1)INITBUS:用于設置I2C主/從工作方式和SCL時鐘頻率的操作請求,相應的arg是類型為InitData的一個結構變量指針。該InitData結構在I2C IP核的設備驅動程序頭文件中定義為:

struct InitData{

unsigned volatile char address;

unsigned volatile char clk;

unsigned volatile char Speed;

unsigned volatile char master_slave;

};

其中,address為此IP核的I2C設備地址,該地址以左移1位的形式寫入IP核的本地地址寄存器中,clk為波特率時鐘寄存器設置值,Speed為時鐘寄存器設置值,master_slave為主/從方式選擇:1選擇此IP核為主端口方式,0選擇為從端口方式。由clk和Speed確定的SCL頻率按下式計算:

例如,給出如下設置,這個I2C IP核將工作于主端口方式,當Nios II系統頻率為50 MHz時,其傳輸速率為100 kHz。

struct InitData InitI2C;

InitI2C.address=0x55;

InitI2C.clk=0x01;

InitI2C.master_slave=1;

InitI2C.Speed=0x7D;

ioctl(fd,INITBUS,&InitI2C);

(2)SETSLAVEADDR:I2C主端口采用該操作發送I2C從端口(或從設備)地址,此時的arg將以左移1位的形式寫入從端口的數據寄存器,并將與從端口的本地地址寄存器內容比較。例如,當從端口實際I2C設備地址為0xD0時,應給出如下編程命令:

ioctl(fd,SETSLAVEADDR,0x68);

(3)CHECKASS:從端口采用該操作請求檢查其狀態寄存器中的地址匹配位,當主端口發送的從端口地址與從端口的本地地址一致時,該位有效并允許從端口進行后續的數據收發工作,相應CHECKASS請求的arg缺省為0;

(4)CHECKDONEFLAG:主、從端口都可以使用這個操作請求檢查自己的數據讀寫操作是否完成,當數據傳送完成時,該ioctl()函數調用返回1,相應CHECKDONEFLAG請求的arg缺省為0;

(5)DATARD:采用該請求的ioctl()函數調用返回I2C IP核的數據寄存器內容,相應DATARD請求的arg缺省為0;

(6)STOPTYPE:該請求用于I2C主端口選擇產生停止條件或重復起始條件,前者相應的arg參數為0,后者相應的arg參數為1。

4.3 int read(int fd,void *ptr,int len)

該函數實現I2C IP核的數據接受操作,所讀入的len個字節數據存于ptr指針指向的數據緩沖區中。

4.4 int write(int fd,void *ptr,int len)

該函數實現I2C IP核的數據發送操作,ptr為發送數據緩沖區指針,len為待發送數據字節數。

4.5 int close(int fd)

該函數關閉fd指定的I2C IP核。

5 應用實例

眾多的電子器件及系統采用了I2C總線傳輸,如多種實時時鐘/日歷(RTC)芯片、音/視頻編解碼器件(CODEC)、LED/LCD驅動芯片以及MCU器件等。在EEPROM存儲器、CMOS圖像傳感器等器件中,I2C的應用更為普遍。我們采用本文所述的I2C控制器IP核對RTC器件M41T00、音頻CODEC器件WM8731、CMOS圖像傳感器MT9M011以及EEPROM器件24LC64分別進行了I2C傳輸測試,同時也對Nios II應用系統中集成多個I2C控制器IP核的情況進行了實驗驗證。為此構建的Nios II應用系統的Quartus II工程頂層模塊如圖3所示,其中包括一個I2C主端口(i2c_master_0)和一個I2C從端口(i2c_slave_0),硬件上只需將主端口的m_scl和m_sda線通過外部上拉電阻與I2C從設備(或從端口)的相應信號線相連,應用程序在外部SDRAM中運行。該Nios II系統中添加了一個1 MHz的信號源(tout),用作內嵌SignalTap II邏輯分析儀的采樣時鐘。

圖3 驗證I2C IP核的Quartus II工程頂層模塊Fig.3 Top block of Quartus II project for verifying the I2C IP core

限于篇幅,在此僅給出對24LC64的測試結果。24LC64是Microchip公司的一款64K位I2C串行EEPROM器件[8],當該器件內部控制寄存器的3位芯片選擇位(A2A1A0)置0時,該器件的I2C設備寫地址為0xA0,其I2C設備讀地址為0xA1。24LC64共有8K字節存儲單元,故存儲單元需要通過2個地址字節尋址。24LC64的寫方式包括字節寫和頁寫(連續32個存儲字節為1頁),其讀取方式包括當前位置讀、隨機讀和順序讀,圖4給出了隨機寫/讀一個數據字節的I2C總線時序要求。隨機寫過程如圖4(a)所示,I2C主端口首先發出低電平start位,然后發出寫控制字節(I2C從設備寫地址),在收到從設備的應答信號(ACK)后,發送待寫入單元的2個地址字節和待寫入數據字節,從設備每接收到一個字節都需返回一個ACK位到主端口,最后主端口發出高電平stop信號結束寫過程。在圖4(b)所示的隨機讀過程中,至地址字節的寫入部分與圖4(a)類似。此后,主端口在重復起始條件下發出一個讀控制字節(I2C從設備讀地址),在從設備的ACK認可后,從設備將所尋址地址單元里的數據發送到SDA線上,主端口接收該數據字節后返回非應答信號(NO ACK)并以stop信號結束讀過程。

圖4 24LC64的隨機寫/讀時序

Fig.4 Timing diagrams for random write/read of 24LC64

作為一個驗證例子,將I2C時鐘SCL速率設置為100 kHz,并以隨機寫/讀方式向24LC64的第2 500(即0x09c4)個存儲單元寫入數據0x56后再從中讀出,并通過Quartus II內嵌的SignalTap II邏輯分析工具捕獲I2C時鐘線m_scl和I2C數據線m_sda信號,所得到的這一寫入、讀出過程時序分別如圖5所示,可見與圖4要求的I2C總線時序一致。

圖5 24LC64的0x09c4單元寫入/讀出數據0x56Fig.5 Timing diagrams showing write/read data 0x56 to/from Cell0x09c4 of 24LC64

6 結束語

本文介紹了一種新的I2C總線控制器IP核,該IP核既可以I2C主端口形式也可以I2C從端口形式集成到基于FPGA的可編程片上嵌入式系統中,且在一個系統中可以定制封裝多個這樣的IP,因此為各種I2C總線傳輸的應用提供了靈活性。采用這個IP核,通過本文設計Nios II應用系統,對多種電子器件的I2C總線傳輸進行了測試。實驗結果表明,與其它I2C總線接口IP相比,該I2C總線控制器IP核在應用上更具有先進性。

參考文獻:

[1] 何立民.I2C總線應用系統設計[M].北京:北京航空航天大學出版社,1995.

HE Li-min.Design of I2C bus application systems[M].Beijing:Beijing University of Aeronautics & Astronautics Press,1995.(in Chinese)

[2] Philips Semiconductors.The I2C-bus Specification,Version 2.1[EB/OL].2000.http://www.nxp.com/acrobat_download/literature/9398/39340011.pdf.

[3] 錢敏,黃秋萍,李富華,等.基于VHDL/ CPLD的I2C串行總線控制器設計及實現[J].電子技術應用,2006,32(8):109-112.

QIAN Min,HUANG Qiu-ping,LI Fu-hua,et al.Design and implementation of I2C serial bus controller based on VHDL/CPLD [J]. Application of Electronic Technique,2006,32(8):109-112.(in Chinese)

[4] 段沛沛,鄧曄.基于VHDL的I2C總線從模式控制核設計[J].火控雷達技術,2008,37(4):86-89.

DUAN Pei-pei,DENG Ye.Design of I2C bus slave mode control core based on VHDL[J].Fire Control Radar Technology,2008,37(4):86-89.(in Chinese)

[5] 康文崢.基于NiosⅡ的I2C主設備接口的設計[J].艦船電子工程,2009,29(3):118-120.

KANG Wen-zheng.Design of I2C master device interface based on Nios II[J].Ship Electronic Engineering,2009,29(3):118-120.(in Chinese)

[6] System Level Solutions,Inc..IP Core I2C Controller [EB/OL].2009.http://www.slscorp.com/pages/ipi2ccontrollersls.php.

[7] Altera Corporation. Nios II Processor Reference Handbook[EB/OL].[2009]http://www.altera.com/literature/hb/nios2/n2cpu_nii5v1.pdf.

[8] Microchip Technology,Inc..24AA64/24LC64 64K I2C Serial EEPROM[EB/OL].[2002]http://ww1.microchip.com/downloads/en/devicedoc/21189f.pdf.

猜你喜歡
字節寄存器時鐘
STM32和51單片機寄存器映射原理異同分析
No.8 字節跳動將推出獨立出口電商APP
別樣的“時鐘”
古代的時鐘
Lite寄存器模型的設計與實現
No.10 “字節跳動手機”要來了?
簡談MC7字節碼
有趣的時鐘
時鐘會開“花”
高速數模轉換器AD9779/AD9788的應用
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合