嚴(yán) 寒, 方振國, 汪 珺, 郭 偉, 毛春雨
(淮北師范大學(xué)物理與電子信息學(xué)院,安徽 淮北 235000)
I2C總線協(xié)議是由Philips公司開發(fā)的一種同步串行總線。相比于其它的串行協(xié)議來說,I2C總線擁有占用資源少、可以有多個(gè)主機(jī)控制和能掛載多個(gè)從機(jī)等優(yōu)點(diǎn),使得其被廣泛的應(yīng)用在系統(tǒng)內(nèi)多個(gè)IC之間的通信。對(duì)于I2C協(xié)議掛載多從機(jī)進(jìn)行數(shù)據(jù)傳輸也得到了業(yè)內(nèi)人士的廣泛應(yīng)用和研究。其中,孫靖實(shí)現(xiàn)了嵌入式控制器基于I2C總線體系的外圍設(shè)備擴(kuò)展應(yīng)用[1],但在設(shè)計(jì)中掛載在總線上的外圍設(shè)備是通過器件地址進(jìn)行區(qū)分,對(duì)器件地址相同的設(shè)備沒有進(jìn)行研究。邱永華通過PCF8574和數(shù)字開關(guān)實(shí)現(xiàn)了可連接器件地址相同的模塊的I2C接口擴(kuò)展器[2],但可連接數(shù)目受限,靈活擴(kuò)展配置性能較差?;诳芍貥?gòu)并行處理平臺(tái)ZYNQ對(duì)I2C協(xié)議進(jìn)行了擴(kuò)展設(shè)計(jì),有效的補(bǔ)充了了相同地址下的主從通信協(xié)議并解決了傳輸速率的自主選擇問題。
I2C總線是一種簡單的雙向二進(jìn)制同步串行總線,只需要使用一根時(shí)鐘線(SCL)和一根雙向數(shù)據(jù)線(SDA)即可在器件中進(jìn)行傳輸信息[3]。主機(jī)和從機(jī)之間以一個(gè)字節(jié)(8bit)為單位進(jìn)行雙向傳輸,根據(jù)通信速率的不同,主機(jī)和從機(jī)進(jìn)行數(shù)據(jù)傳輸時(shí)需要嚴(yán)格的遵循I2C的傳輸規(guī)范。讀寫操作如下:
寫數(shù)據(jù)操作分為Byte Write和Page Write兩種,Byte Write時(shí)序如圖1所示,根據(jù)時(shí)序圖單字節(jié)寫數(shù)據(jù)流程如下:主機(jī)發(fā)送起始信號(hào)->主機(jī)發(fā)送7位器件地址+1位寫命令R/W(0為寫)->主機(jī)發(fā)送8為字地址->從機(jī)返回響應(yīng)信號(hào)ACK(0表示數(shù)據(jù)寫入成功)->主機(jī)發(fā)送8位寫數(shù)據(jù)->從機(jī)返回響應(yīng)信號(hào)ACK->主機(jī)發(fā)送停止信號(hào)。
圖1 寫數(shù)據(jù)過程
讀數(shù)據(jù)操作分為Random Read和Sequential Read兩種,Random Read時(shí)序如圖2所示,根據(jù)時(shí)序圖單字節(jié)寫數(shù)據(jù)流程如下:主機(jī)發(fā)送起始信號(hào)->主機(jī)發(fā)送7位器件地址+1位寫命令R/W->主機(jī)發(fā)送8為字地址->從機(jī)返回響應(yīng)信號(hào)ACK->主機(jī)發(fā)送起始信號(hào)->主機(jī)發(fā)送7位器件地址+1位讀命令R/W(1為讀)->從機(jī)返回響應(yīng)信號(hào)ACK->從機(jī)發(fā)送8位數(shù)據(jù)->主機(jī)發(fā)送停止信號(hào)。
圖2 讀數(shù)據(jù)過程
I2C主從通信擴(kuò)展協(xié)議驅(qū)動(dòng)系統(tǒng)如圖3所示,設(shè)計(jì)主要包括參數(shù)配置、I2C總線接口、編碼片選器三個(gè)部分,其中參數(shù)配置中有從機(jī)切換裝置和I2C傳輸速率切換裝置。
圖3 I2C協(xié)議擴(kuò)展驅(qū)動(dòng)系統(tǒng)圖
由系統(tǒng)框圖可知,掛載在I2C總線上的從機(jī)擁有相同的器件地址,總線通過選通器對(duì)從機(jī)進(jìn)行區(qū)分。為了節(jié)約資源,總線對(duì)所有從機(jī)都發(fā)送時(shí)鐘信號(hào)(SCL),只對(duì)片選器選通的從機(jī)進(jìn)行雙向數(shù)據(jù)傳輸(SDA),為了防止數(shù)據(jù)誤發(fā),片選器一次只能對(duì)一個(gè)從機(jī)保持選通狀態(tài)(即參數(shù)配置中從機(jī)切換裝置每次只能選定一個(gè)從機(jī)進(jìn)行數(shù)據(jù)傳輸)。為了實(shí)現(xiàn)I2C總線傳輸速率調(diào)節(jié)便利,設(shè)計(jì)中設(shè)置了低速(100Kbps)、中速模式(400Kbps)和高速模式(3.4Mbps)三種傳輸速率[4],可通過參數(shù)配置中的傳輸速率切換裝置自由切換。
以I2C總線掛載4塊從機(jī)為例,從機(jī)片選真值表如表1所示,由表可知,4塊從機(jī)通過二進(jìn)制進(jìn)行編碼需要2根切換線,可以通過從機(jī)切換裝置控制切換線狀態(tài)從而完成I2C總線和切換從機(jī)進(jìn)行選通。
表1 從機(jī)片選真值表
設(shè)計(jì)中的FPGA采用的Xilinx公司ZYNQ-7000開發(fā)平臺(tái),該開發(fā)平臺(tái)集成了ARM處理器的軟件可編程性和FPGA的硬件可編程性[5-7],設(shè)計(jì)軟件采用Xilinx Vivado 2020.2,使用Verilog語言,并且使用Vivado軟件中的邏輯分析儀進(jìn)行設(shè)計(jì)驗(yàn)證。
設(shè)計(jì)驗(yàn)證中使用片選按鍵作為從機(jī)和傳輸速率切換裝置,4塊AT24C02 EEPROM模塊作為從機(jī),AT24C02器件地址為7’1010000。驗(yàn)證過程中往從機(jī)字地址8’b00110011中發(fā)送固定數(shù)據(jù)8’b01010101,通過對(duì)從機(jī)中發(fā)送的數(shù)據(jù)和讀取的數(shù)據(jù)進(jìn)行對(duì)比來驗(yàn)證本設(shè)計(jì)。
驗(yàn)證步驟如下:
1)配置傳輸速率為400Kbps,選定從機(jī)3;
2)寫入數(shù)據(jù)到從機(jī)3,再從從機(jī)3讀取寫入的數(shù)據(jù);
3)傳輸速率不變,選定從機(jī)4;
4)寫入數(shù)據(jù)到從機(jī)4,再從從機(jī)4讀取寫入的數(shù)據(jù);
5)選定從機(jī)4,分別切換傳輸速率切換為100Kbps,3.4Mbps,往從機(jī)寫入數(shù)據(jù)。
使用100Kbps傳輸速率對(duì)選通從機(jī)3進(jìn)行數(shù)據(jù)讀寫的時(shí)序圖如圖4,5所示,由圖可知,數(shù)據(jù)傳輸過程中I2C總線只對(duì)從機(jī)3的雙向數(shù)據(jù)線(sda)進(jìn)行數(shù)據(jù)傳輸,且寫入的數(shù)據(jù)和讀取的數(shù)據(jù)皆為8’b01010101,其余從機(jī)雙向數(shù)據(jù)線處于空閑狀態(tài)。
圖4 從機(jī)3數(shù)據(jù)寫入時(shí)序圖
使用100Kbps傳輸速率對(duì)選通從機(jī)4進(jìn)行數(shù)據(jù)讀寫的時(shí)序圖如圖6,7所示,由圖可知,數(shù)據(jù)傳輸過程中I2C總線只對(duì)從機(jī)4的雙向數(shù)據(jù)線(sda)進(jìn)行數(shù)據(jù)傳輸,且寫入的數(shù)據(jù)和讀取的數(shù)據(jù)皆為8’b01010101,其余從機(jī)雙向數(shù)據(jù)線處于空閑狀態(tài)。
圖5 從機(jī)3數(shù)據(jù)讀取時(shí)序圖
圖6 從機(jī)4數(shù)據(jù)寫入時(shí)序圖
圖7 從機(jī)4數(shù)據(jù)讀取時(shí)序圖
F= 1/Ts
(1)
傳輸速率計(jì)算公式如公式1所示,其中F表示傳輸速率,Ts表示單個(gè)時(shí)鐘信號(hào)周期消耗的時(shí)間。由圖6可知4個(gè)時(shí)鐘信號(hào)周期消耗1000個(gè)系統(tǒng)時(shí)間間隔,而系統(tǒng)時(shí)鐘為50Mhz(20ns),故系統(tǒng)時(shí)間間隔為10ns。因此此時(shí)傳輸速率為式(2):
F=4/(1000*10ns)= 400Kbps
(2)
使用傳輸速率為100Kbps往從機(jī)4寫入數(shù)據(jù)的時(shí)序如圖8所示,由圖可知5個(gè)時(shí)鐘信號(hào)周期消耗5000個(gè)系統(tǒng)時(shí)間間隔。因此此時(shí)傳輸速率為式(3):
圖8 傳輸速率100Kbps從機(jī)4數(shù)據(jù)寫入時(shí)序圖
F=5/(5000*10ns)= 100Kbps
(3)
使用傳輸速率為3.4Mbps往從機(jī)4寫入數(shù)據(jù)的時(shí)序如圖9所示,由圖9可知3.4個(gè)時(shí)鐘信號(hào)周期消耗100個(gè)系統(tǒng)時(shí)間間隔。因此此時(shí)傳輸速率為:
圖9 傳輸速率3.4Mbps從機(jī)4數(shù)據(jù)寫入時(shí)序圖
F=3.4/(100*10ns)= 3.4Mbps
(4)
為了使主機(jī)可以通過I2C總線對(duì)擁有器件地址相同的從機(jī)進(jìn)行數(shù)據(jù)傳輸和I2C總線可以自由切換傳輸速率,提出來一種基于FPGA的I2C擴(kuò)展驅(qū)動(dòng)設(shè)計(jì)方案,并通過ZYNQ-7000硬件開發(fā)平臺(tái),AT24C02 EEPROM模塊和Vivado軟件完成本設(shè)計(jì),通過Vivado軟件中的邏輯分析儀抓取的波形可以看出,主機(jī)可對(duì)任一從機(jī)進(jìn)行數(shù)據(jù)傳輸,并且可以自由切換I2C總線的傳輸速率。設(shè)計(jì)結(jié)構(gòu)簡單、擴(kuò)展性強(qiáng)、可移植性高,具有一定的實(shí)用價(jià)值,設(shè)計(jì)中若需要擴(kuò)展從機(jī)設(shè)備,只需要增加系統(tǒng)的管腳資源而不用消耗其它硬件資源。