基于VHDL/CPLD的I2C串行總線(xiàn)控制器設計及實(shí)現
主機發(fā)完第一個(gè)字節后,數據傳輸方向的變化可能存在三種情況。(1)傳輸方向不變,如主機向從機寫(xiě);(2)傳輸方向改變,如主機從從機讀數據;(3)傳輸方向改變多次,如主機對從機進(jìn)行多次讀寫(xiě)。
2 時(shí)鐘同步與仲裁
I2C總線(xiàn)在任何時(shí)刻只能有一個(gè)主機,當I2C總線(xiàn)同時(shí)有兩個(gè)或更多的器件想成為主機時(shí),就需要進(jìn)行仲裁;時(shí)鐘同步的目的就是為仲裁提供一個(gè)確定的時(shí)鐘。時(shí)鐘SCL的同步和仲裁通過(guò)“線(xiàn)與”來(lái)執行,SCL的低電平時(shí)間取決于低電平時(shí)間最長(cháng)的主機,高電平時(shí)間取決于高電平時(shí)間最短的主機。
仲裁過(guò)程在數據線(xiàn)SDA線(xiàn)上進(jìn)行,當SCL為高電平時(shí),如果SDA線(xiàn)上有主機發(fā)送低電平,則發(fā)送高電平的主機將關(guān)閉輸出級。因為總線(xiàn)的狀態(tài)和自身內部不一樣,于是發(fā)送低電平的主機贏(yíng)得仲裁。仲裁可以持續多個(gè)位,在實(shí)際通信過(guò)程中,仲裁的第一階段比較地址位,如果多個(gè)主機尋址同一個(gè)從機,則繼續比較數據位(主機是發(fā)送機)或響應位(主機是接收機)。由于I2C總線(xiàn)上的地址和數據由贏(yíng)得總線(xiàn)的主機決定,因此仲裁過(guò)程中不會(huì )丟失信息。如果一個(gè)主機具有從機功能,則當它失去仲裁時(shí),必須立即切換到從機狀態(tài),因為它可能正在被其他主機尋址。
I2C總線(xiàn)控制器的主要作用是提供微控制器(μC)和I2C總線(xiàn)之間的接口,為兩者之間的通信提供物理層協(xié)議的轉換。在串行應用系統中,外圍器件(如串行E2PROM、LCD、實(shí)時(shí)鐘等)連接在I2C總線(xiàn)上,再通過(guò)I2C總線(xiàn)控制器和μC連起來(lái)。其典型的應用,如現在許多彩電的控制系統都基于I2C總線(xiàn)。為了使設計清晰明了,本文將控制器的設計分成兩部分。一部分為微控制器(μC)接口,另一部分為I2C接口,如圖2所示。
μC接口部分主要包含狀態(tài)寄存器(MBSR)、控制寄存器(MBCR)、地址寄存器(MADR)、數據寄存器(MBDR)和地址譯碼/總線(xiàn)接口模塊。狀態(tài)寄存器指示I2C總線(xiàn)控制器的當前狀態(tài),如傳輸是否完成、總線(xiàn)是否忙等信息??刂萍拇嫫魇铅藽控制I2C總線(xiàn)控制器的主要途徑,通過(guò)置0/1完成I2C總線(xiàn)控制器使能、中斷使能、主/從(Master/Slave)模式選擇、產(chǎn)生起始位等操作。地址寄存器保存著(zhù)I2C總線(xiàn)控制器作為從機時(shí)的地址。數據寄存器用于保存接收的數據或是待發(fā)送的數據。
I2C接口的核心是主狀態(tài)機,它控制著(zhù)整個(gè)I2C接口的運作。和I2C總線(xiàn)直接相連的模塊有起始/停止位產(chǎn)生模塊、I2C Header寄存器、I2C數據寄存器和仲裁及起始/停止位檢測模塊。當控制器是Master時(shí),起始/停止位產(chǎn)生模塊用于在I2C總線(xiàn)上產(chǎn)生起始位和停止位;I2C數據寄存器用于保存總線(xiàn)上傳送的數據;仲裁及起始/停止位檢測模塊的作用是執行仲裁,并檢測I2C總線(xiàn)上的起始/停止位,以便為主狀態(tài)機提供輸入。其他模塊包括:I2C狀態(tài)寄存器,用于記錄I2C總線(xiàn)的狀態(tài);地址比較模塊,用于比較總線(xiàn)上傳送的地址和本機的從機地址是否一致,如果一致,說(shuō)明其他主機正在尋址本控制器,控制器必須立即切換到從機狀態(tài),同時(shí)發(fā)出響應位。
3.1 μC接口設計
μC接口用于連接I2C接口電路和μC,主要實(shí)現兩者之間的信號交互握手機制。設計時(shí)可以用VHDL提供的狀態(tài)機來(lái)描述信號交互機制中的工作狀態(tài)切換,如圖3(a)所示。
μC接口電路中使用的四組寄存器的地址是24位的,高16位為I2C總線(xiàn)控制器的基址(MBASE),占用μC的地址空間,低8位用于區別不同的寄存器。寄存器本身是8位的,圖3(b1)為控制寄存器,圖3(b2)為狀態(tài)寄存器。圖中示出了每一位的含義。
3.2 I2C接口設計
I2C接口用于連接μC接口電路和I2C總線(xiàn),由兩個(gè)狀態(tài)機構成:一個(gè)是I2C接口主狀態(tài)機,用于執行發(fā)送和接收操作;另一個(gè)為“SCL/SDA/ STOP 產(chǎn)生”狀態(tài)機,當I2C總線(xiàn)控制器為主機時(shí),這個(gè)狀態(tài)機產(chǎn)生SCL/START/STOP信號。
評論