徐中龍,華竹平,李 佳,王瑋冰
(1.中國(guó)科學(xué)院微電子研究所,北京100029;2.江蘇物聯(lián)網(wǎng)研究發(fā)展中心智能傳感器工程中心,江蘇無錫214135;3.無錫(太湖)國(guó)際科技園管理委員會(huì),江蘇無錫214135)
隨著物聯(lián)網(wǎng)的興起,傳感器之間的通信起到了關(guān)鍵的作用。針對(duì)特定的物聯(lián)網(wǎng)應(yīng)用,合理的選擇傳感器通信協(xié)議,有利于改善傳感器系統(tǒng)的設(shè)計(jì)。傳感器系統(tǒng)中一般對(duì)傳感器數(shù)據(jù)傳輸速率要求不高,傳感器中廣泛使用的是同步串行數(shù)據(jù)接口:I2C總線接口和SPI總線接口。
I2C總線協(xié)議是PHILIPS公司于1987年開發(fā)的雙向兩線制同步串行總線協(xié)議。由于它具有連線少、允許多主機(jī)控制、具有總線仲裁和同步等特點(diǎn),被廣泛應(yīng)用到各個(gè)領(lǐng)域,并已經(jīng)成為一種世界性的工業(yè)標(biāo)準(zhǔn)[1]。I2C總線上數(shù)據(jù)的傳輸速率在標(biāo)準(zhǔn)模式下可達(dá)100 kbit/s,在快速模式下可達(dá) 400 kbit/s,在高速模式下可達(dá) 3.4 Mbit/s[2]。
SPI總線協(xié)議是Motorola公司開發(fā)的高速、同步串行總線協(xié)議,一般需要3~4根總線完成數(shù)據(jù)傳輸,SPI接口的傳輸速度可以達(dá)到5 Mbit/s。SPI接口技術(shù)是一種高速高效率的串行接口技術(shù),主要用于擴(kuò)展外設(shè)和進(jìn)行數(shù)據(jù)交換[3]。
目前廣泛使用的從機(jī)同步串行接口電路大多不具有兼容I2C總線和SPI總線數(shù)據(jù)傳輸?shù)墓δ?。有些從機(jī)同時(shí)具有I2C總線接口電路和SPI總線接口電路,但兩種接口電路不僅浪費(fèi)了內(nèi)部邏輯資源,而且占用較多的信號(hào)接口。
本文通過分析I2C總線協(xié)議和SPI總線協(xié)議的特點(diǎn),提出并設(shè)計(jì)了一種兼容I2C總線和SPI總線的通用從機(jī)同步串行接口電路,首先將該接口電路進(jìn)行模塊劃分,然后對(duì)劃分后的模塊利用Verilog-HDL進(jìn)行編碼并通過Modelsim進(jìn)行功能仿真,最終在Quartus II中下載到FPGA中進(jìn)行驗(yàn)證,為傳感器中的接口電路設(shè)計(jì)提供參考。
以一款目標(biāo)物體溫度探測(cè)傳感器為例,本文設(shè)計(jì)并實(shí)現(xiàn)了一種通用從機(jī)同步串行接口電路。為了滿足數(shù)據(jù)精度的需要,此傳感器中內(nèi)部寄存器數(shù)據(jù)為16 bit。此傳感器中有5個(gè)寄存器,分別為物體電壓寄存器、本地溫度寄存器、配置寄存器、制造商ID寄存器、器件ID寄存器,其中物體電壓寄存器、本地溫度寄存器、制造商ID寄存器、器件ID寄存器為只讀寄存器,配置寄存器的高八位為可讀寫部分,低八位為只讀部分。
通用從機(jī)同步串行接口電路引腳如圖1所示。其中CS為從機(jī)片選信號(hào),A1、A0為從機(jī)地址選擇端口,SCL為串行時(shí)鐘線,SDA為串行數(shù)據(jù)線。
圖1 通用從機(jī)同步串行接口電路引腳
1.1.1 接口電路用于I2C總線數(shù)據(jù)傳輸時(shí)的設(shè)計(jì)要求
發(fā)送到SDA線上的每個(gè)字節(jié)必須為8位,每次傳輸可以發(fā)送的字節(jié)數(shù)量不受限制,但是每個(gè)字節(jié)后必須跟一個(gè)應(yīng)答位[4]。主機(jī)發(fā)送起始條件后,首先發(fā)送一個(gè)7位從機(jī)地址(用于選中當(dāng)前要使用的從器件),緊接著發(fā)送1位的數(shù)據(jù)傳輸方向位(R/W)以指示是從從器件讀取數(shù)據(jù)還是把數(shù)據(jù)寫入從器件,數(shù)據(jù)傳輸由主機(jī)產(chǎn)生的停止條件結(jié)束[5]。當(dāng)讀寫位即數(shù)據(jù)傳輸方向位(R/W)為1時(shí),主機(jī)從傳感器讀取數(shù)據(jù);當(dāng)讀寫位即數(shù)據(jù)傳輸方向位(R/W)為0時(shí),主機(jī)向傳感器寫入數(shù)據(jù)。
其中A1、A0與I2C總線從機(jī)地址的對(duì)應(yīng)關(guān)系如表1所示。
表1 A1、A0與I2 C總線從機(jī)地址的對(duì)應(yīng)關(guān)系
為了滿足主機(jī)同傳感器內(nèi)部多個(gè)寄存器之間進(jìn)行數(shù)據(jù)傳輸,主機(jī)對(duì)傳感器進(jìn)行寫數(shù)據(jù)操作之前,必須首先向地址指針寄存器寫入地址,指定寫操作對(duì)應(yīng)的寄存器,然后再向地址對(duì)應(yīng)的寄存器寫入數(shù)據(jù);而主機(jī)對(duì)傳感器進(jìn)行讀數(shù)據(jù)操作時(shí),不向地址指針寄存器寫入地址,直接讀取地址指針寄存器相對(duì)應(yīng)的寄存器數(shù)據(jù)。地址指針與傳感器內(nèi)部寄存器的對(duì)應(yīng)關(guān)系如表2所示。接口電路將接收的8位地址指針數(shù)據(jù)存入地址指針寄存器,對(duì)傳感器內(nèi)部寄存器進(jìn)行尋址。
表2 利用I2 C總線進(jìn)行數(shù)據(jù)傳輸?shù)牡刂分羔樑c寄存器的對(duì)應(yīng)關(guān)系
1.1.2 接口電路用于SPI總線數(shù)據(jù)傳輸時(shí)的設(shè)計(jì)要求
本次設(shè)計(jì)中采用的時(shí)鐘極性CPOL和時(shí)鐘相位CPHA[6]都為 1。
主機(jī)通過SPI總線接口與傳感器內(nèi)多個(gè)寄存器進(jìn)行通信時(shí),主機(jī)利用不同的讀寫指令來識(shí)別傳感器內(nèi)部不同寄存器。傳感器先向主機(jī)發(fā)送地址寄存器對(duì)應(yīng)的寄存器數(shù)據(jù),緊接著傳感器接收主機(jī)發(fā)送的讀寫指令,如果為讀指令,傳感器則將對(duì)應(yīng)的寄存器數(shù)據(jù)發(fā)送給主機(jī);如果為寫指令,傳感器則將接收的數(shù)據(jù)存入相應(yīng)的寄存器。
利用SPI總線對(duì)該傳感器內(nèi)部寄存器進(jìn)行讀操作時(shí),接口電路將讀指令的低8位存入到相應(yīng)的地址寄存器,然后再讀取對(duì)應(yīng)寄存器數(shù)據(jù);利用SPI總線對(duì)該傳感器內(nèi)部寄存器進(jìn)行寫操作時(shí),由于該傳感器中只有配置寄存器可以寫,因此將寫狀態(tài)字的中間8位數(shù)據(jù)存入到配置寄存器。讀指令與內(nèi)部寄存器的對(duì)應(yīng)關(guān)系如表3所示,寫指令與寄存器的對(duì)應(yīng)關(guān)系如表4所示。
表3 利用SPI總線進(jìn)行數(shù)據(jù)傳輸時(shí)讀指令與寄存器的對(duì)應(yīng)關(guān)系
表4 利用SPI總線進(jìn)行數(shù)據(jù)傳輸時(shí)寫指令與寄存器的對(duì)應(yīng)關(guān)系
根據(jù)上述通用從機(jī)接口電路的設(shè)計(jì)要求,本設(shè)計(jì)中對(duì)該傳感器接口電路劃分為3個(gè)模塊:起始和停止檢測(cè)模塊、并串和串并轉(zhuǎn)化模塊、控制模塊。該接口電路的結(jié)構(gòu)框圖如圖2所示。
圖2 通用從機(jī)同步串行接口電路結(jié)構(gòu)框圖
起始和停止檢測(cè)模塊:I2C總線或SPI總線數(shù)據(jù)傳輸起始位和停止位檢測(cè)。
并串和串并轉(zhuǎn)換模塊:利用此模塊接收主機(jī)發(fā)送的串行數(shù)據(jù)和向主機(jī)發(fā)送串行數(shù)據(jù)。
控制模塊:在起始和停止位的控制下向主機(jī)發(fā)送應(yīng)答位和對(duì)并串和串并轉(zhuǎn)換模塊的并串和串并轉(zhuǎn)換控制。
根據(jù)接收和發(fā)送數(shù)據(jù)時(shí)序分析,利用SCL上升沿接收主機(jī)發(fā)送的數(shù)據(jù),利用SCL下降沿向主機(jī)發(fā)送數(shù)據(jù)。
起始和停止模塊設(shè)計(jì):在CS為1且SCL為1的情況下,SDA的下降沿為從機(jī)接口電路利用I2C總線數(shù)據(jù)傳輸?shù)钠鹗嘉?,SDA的上升沿為從機(jī)接口電路利用I2C總線數(shù)據(jù)傳輸停止位;在CS為0的情況下,從機(jī)接口電路利用SPI總線進(jìn)行數(shù)據(jù)傳輸。
并串和串并轉(zhuǎn)換模塊設(shè)計(jì):利用SCL時(shí)鐘的上升沿讀入主機(jī)串行數(shù)據(jù)并轉(zhuǎn)化為并行數(shù)據(jù)存入傳感器內(nèi)部相應(yīng)的寄存器;利用SCL時(shí)鐘的下降沿將傳感器內(nèi)部寄存器數(shù)據(jù)串行輸出。
控制模塊設(shè)計(jì):該通用傳感器同步串行接口電路利用I2C總線進(jìn)行數(shù)據(jù)傳輸時(shí),每次只能傳輸一個(gè)字節(jié)和接收或發(fā)送一位應(yīng)答位;利用SPI總線進(jìn)行數(shù)據(jù)傳輸時(shí),每次可以傳輸16 bit數(shù)據(jù)。因此,控制模塊可以利用計(jì)數(shù)器來實(shí)現(xiàn)。
由于本文傳感器內(nèi)部的寄存器為16 bit,因此該接口電路用于I2C總線數(shù)據(jù)傳送需要分為高低字節(jié)分別進(jìn)行傳送。傳感器接口電路用于I2C總線數(shù)據(jù)傳輸支持的數(shù)據(jù)格式如下:
a起始位+8 bit從機(jī)地址和讀標(biāo)志位+8 bit高字節(jié)數(shù)據(jù)+8 bit低字節(jié)數(shù)據(jù)+停止位
b起始位+8 bit從機(jī)地址和寫標(biāo)志位+8 bit地址指針+停止位
c起始位+8 bit從機(jī)地址和寫標(biāo)志位+8 bit地址指針+8 bit高字節(jié)數(shù)據(jù)+停止位
該接口電路用于SPI總線數(shù)據(jù)傳輸支持的數(shù)據(jù)格式如下:
a 16 bit讀數(shù)據(jù)
b 16 bit讀數(shù)據(jù)+16 bit寫指令
c 16 bit讀數(shù)據(jù)+16 bit讀指令
d 16 bit讀數(shù)據(jù)+16 bit讀指令+16 bit讀數(shù)據(jù)
該接口電路控制模塊電路的狀態(tài)機(jī)如圖3所示。
圖4所示為該接口電路用于I2C總線數(shù)據(jù)傳輸時(shí)格式a的功能仿真結(jié)果,圖5所示為該接口電路用于I2C總線數(shù)據(jù)傳輸時(shí)格式c的功能仿真結(jié)果。
圖3 通用從機(jī)同步串行接口電路控制模塊狀態(tài)機(jī)
圖4 I2 C總線數(shù)據(jù)傳輸格式a的仿真結(jié)果(截圖去彩)
圖5 I2 C總線數(shù)據(jù)傳輸格式c的仿真結(jié)果(截圖去彩)
圖4、圖5中所示的信號(hào)從上向下為片選信號(hào)CS,從機(jī)地址選擇信號(hào)A1、A0,串行時(shí)鐘信號(hào)SCL,串行數(shù)據(jù)信號(hào)SDA,地址指針寄存器PntrReg,配置寄存器Confg。從圖4中可以看出,CS為1且A1和A0都為0時(shí),主機(jī)向傳感器發(fā)送起始位之后,緊接著發(fā)送的是7位從機(jī)地址7’b100_0000和讀標(biāo)志位1’b1,對(duì)傳感器執(zhí)行讀操作;下一個(gè)SCL時(shí)鐘下降沿傳感器向主機(jī)發(fā)送低電平應(yīng)答位;接下來傳感器在SCL下降沿傳感器向主機(jī)發(fā)送地址指針寄存器PntrReg數(shù)據(jù)8’b0000_0010對(duì)應(yīng)的配置寄存器Confg 16 bit數(shù)據(jù)16’b1100_1010_0111_0011。從圖5中可以看出,CS為0且A1和A0都為0時(shí),主機(jī)向傳感器發(fā)送起始位之后,緊接著發(fā)送的是7位從機(jī)地址7’b1000000和寫標(biāo)志位1’b0,對(duì)傳感器執(zhí)行寫操作;;下一個(gè)SCL時(shí)鐘下降沿傳感器向主機(jī)發(fā)送低電平應(yīng)答位;接下來主機(jī)向傳感器寄存器地址指針寄存器寫入數(shù)據(jù)8’b0000_0010;傳感器發(fā)送應(yīng)答位之后,主機(jī)向該地址指針對(duì)應(yīng)的配置寄存器的高8位寫一個(gè)字節(jié)數(shù)據(jù)8’b1100_1010。
以上結(jié)果說明,該接口電路利用該I2C總線進(jìn)行數(shù)據(jù)傳輸時(shí),可以正確實(shí)現(xiàn)數(shù)據(jù)格式a和數(shù)據(jù)格式c。由于I2C總線數(shù)據(jù)傳輸中數(shù)據(jù)格式b可以被包含在數(shù)據(jù)格式c中,因此可以利用該接口電路實(shí)現(xiàn)本文中的I2C總線數(shù)據(jù)傳輸。
圖6所示為該接口電路用于SPI總線數(shù)據(jù)傳輸時(shí)格式b的功能仿真結(jié)果,圖7所示為該接口電路用于SPI總線數(shù)據(jù)傳輸時(shí)格式d的功能仿真結(jié)果。
圖6 SPI總線數(shù)據(jù)傳輸格式b的仿真結(jié)果(截圖去彩)
圖7 SPI總線數(shù)據(jù)傳輸格式d的仿真結(jié)果(截圖去彩)
圖6中所示的信號(hào)從上向下為片選信號(hào)CS,串行時(shí)鐘信號(hào)SCL,串行數(shù)據(jù)信號(hào)SDA,電壓寄存器Vobj,配置寄存器Confg。從上圖中可以看出,傳感器先向主機(jī)發(fā)送默認(rèn)地址8’b0000_0000對(duì)應(yīng)的電壓寄存器Vobj16位數(shù)據(jù)16’b1000_1010_0010_0101,然后將接收16位寫配置寄存器指令16’b0000_1011_0101_0000,最后可以看出將8 bit數(shù)據(jù)8’b1011_0101存到配置寄存器的高八位中。圖7中所示的信號(hào)從上向下為片選信號(hào)CS,串行時(shí)鐘信號(hào)SCL,串行數(shù)據(jù)信號(hào)SDA,電壓寄存器Vobj,本地溫度寄存器Tamb。從圖7中可以看出傳感器內(nèi)部電壓寄存器Vobj數(shù)據(jù)為16’b1000_1010_0010_0101,本地溫度寄存器Tamb數(shù)據(jù)為16’b1000_0000_0000_1000。傳感器先通過SPI總線接口向主機(jī)發(fā)送Vobj寄存器數(shù)據(jù)16’b1000_1010_0010_0101,然后接收16位讀Tamb數(shù)據(jù)指令16’b1000_0000_0000_1000,然后傳感器將16位Tamb數(shù)據(jù)16’b 1000_0000_0000_1000發(fā)送出去。
以上結(jié)果說明,該接口電路用于SPI總線數(shù)據(jù)傳輸時(shí),可以正確實(shí)現(xiàn)SPI總線數(shù)據(jù)格式b和數(shù)據(jù)格式d。由于SPI總線數(shù)據(jù)傳輸中數(shù)據(jù)格式a和c可以被包含在數(shù)據(jù)格式d中,因此可以利用該接口電路實(shí)現(xiàn)本文所述的SPI總線數(shù)據(jù)傳輸。
本設(shè)計(jì)選用ALTERA公司的EP4CE15F17C8N器件。整個(gè)設(shè)計(jì)采用Verilog-HDL編碼,利用Quartus II軟件編譯后,將生成的pof文件通過AS口下載到FPGA中。通過單片機(jī)模擬I2C總線數(shù)據(jù)傳輸時(shí)的數(shù)據(jù)格式a、b、c 和 SPI總線數(shù)據(jù)傳輸時(shí)的數(shù)據(jù)格式 a、b、c、d,可以成功實(shí)現(xiàn)單片機(jī)通過I2C總線和SPI總線與FPGA同步串行通信。
本文根據(jù)I2C總線協(xié)議和SPI總線協(xié)議的要求,設(shè)計(jì)了一種兼容I2C和SPI總線通用從機(jī)同步串行接口電路。首先將其進(jìn)行模塊劃分,然后對(duì)各個(gè)模塊分別設(shè)計(jì)與實(shí)現(xiàn),最后對(duì)電路進(jìn)行仿真、驗(yàn)證。與I2C總線接口電路、SPI總線接口電路相比,既可實(shí)現(xiàn)高速率數(shù)據(jù)傳輸,又可組成多主機(jī)、多從機(jī)的傳感器網(wǎng)絡(luò)。通用從機(jī)同步串行接口電路可通過I2C總線或SPI總線進(jìn)行數(shù)據(jù)傳輸?shù)撵`活性的特點(diǎn),在傳感器中具有應(yīng)用價(jià)值。
[1]陳穗光,葛建華.I2C總線接口協(xié)議設(shè)計(jì)及FPGA的實(shí)現(xiàn)[J].山西電子技術(shù),2006(6):20-38.
[2]沈華,王俞心.基于FPGA的I2C總線主控器的設(shè)計(jì)與實(shí)現(xiàn)[J].航空計(jì)算技術(shù),2007(6):109-111.
[3]易志明,林凌,郝麗宏,等.SPI串行總線接口及其實(shí)現(xiàn)[J].自動(dòng)化與儀器儀表,2002(6):47-50.
[4]趙輝,董德存.I2C總線技術(shù)及其應(yīng)用實(shí)例[J].微型電腦應(yīng)用,2005(4):61-63.
[5]胡文靜,李外云,劉錦高.I2C總線接口的FPGA實(shí)現(xiàn)研究[J].計(jì)算機(jī)工程與應(yīng)用,2005(12):116-118.
[6]王玨文,金偉信,蔡兵,等.基于FPGA的SPI總線接口的實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2010(14):102-104.