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