一個(gè)布板方法就是采用菊鏈結(jié)構(gòu)。本文詳細(xì)講述了SPI系統(tǒng)的菊鏈配置,并展示如何使用軟件向串聯(lián)從器件發(fā)送命令。
標(biāo)準(zhǔn)SPI?/QSPI?/MICROWIRE?兼容微控制器通過(guò)3線/4線串口與從器件通信。典型接口包括片選信號(hào)(/CS)、串行時(shí)鐘(SCLK)和數(shù)據(jù)輸入信號(hào)(DIN),有時(shí)還會(huì)有數(shù)據(jù)輸出信號(hào)(DOUT)。如同I2C系統(tǒng)中一樣,單獨(dú)尋址的器件能輕易的和總線上的其它器件通信。
基本串行通信接口
很多SPI器件并不是單獨(dú)尋址的。因此,這些器件和總線上其它單個(gè)器件通信時(shí),就需要進(jìn)行額外的硬件或者軟件處理。圖1所示是一個(gè)微控制器和多個(gè)從器件通信的系統(tǒng)。圖1. 帶有多個(gè)從器件獨(dú)立片選信號(hào)的微控制器。
在上述系統(tǒng)中,微控制器通過(guò)一個(gè)串行時(shí)鐘輸出(SCLK)和一個(gè)主機(jī)輸出/從機(jī)輸入(MOSI)信號(hào)線向各從器件發(fā)送命令。主機(jī)為每個(gè)器件分配了一個(gè)獨(dú)立的片選信號(hào)(/SS_),從而實(shí)現(xiàn)各個(gè)從器件的獨(dú)立尋址。由于所有從器件共享同一個(gè)時(shí)鐘和數(shù)據(jù)線,只有/CS輸入變低的從器件才會(huì)應(yīng)答串行時(shí)鐘和數(shù)據(jù)線。當(dāng)從器件數(shù)目較少時(shí),該系統(tǒng)較易實(shí)現(xiàn)。如果系統(tǒng)中從器件數(shù)較多,微控制器需要提供和從器件一樣多的/SS_輸出,這種結(jié)構(gòu)就增加了硬件和布板的復(fù)雜程度。
菊鏈方法
硬件空間方面的限制往往會(huì)使圖1所示的電路無(wú)法實(shí)現(xiàn)或難以實(shí)現(xiàn)??刹捎镁真湻ㄌ娲鷮?shí)現(xiàn)串行接口。圖2是一個(gè)有N個(gè)從器件的菊鏈系統(tǒng)結(jié)構(gòu)。圖2. 微控制器連接多個(gè)從器件
采用一個(gè)/SS (或者/CS)信號(hào)控制所有從器件的/CS輸入;所有從器件接收同一個(gè)時(shí)鐘信號(hào)。只有鏈上的第一個(gè)從器件(SLAVE 1)從微控制器直接接收命令。其他所有從器件都從鏈上前一個(gè)器件的DOUT輸出獲得其DIN數(shù)據(jù)。
要保證菊鏈正常工作,每一個(gè)從器件就必須能在給定的命令周期內(nèi)(定義為每一個(gè)命令所需的時(shí)鐘數(shù))從DIN引腳讀入命令,而在下一個(gè)命令周期從DOUT引腳輸出同樣的命令。顯然,從DIN到DOUT會(huì)有一個(gè)命令周期的延遲。另外,各個(gè)從器件只能在/CS的上升沿執(zhí)行寫入的命令。這意味著只要/CS保持低電平,從器件將不會(huì)執(zhí)行命令,并且會(huì)在下一個(gè)命令周期將命令通過(guò)DOUT引腳輸出。如果在給定命令周期之后/CS變高,所有從器件將立即執(zhí)行寫入DIN引腳的命令。如果/CS變高,數(shù)據(jù)將不會(huì)從DOUT輸出,這就使得鏈上每個(gè)從器件可以執(zhí)行不同的命令。只要菊鏈的這些要求能夠滿足,微控制器只需三個(gè)信號(hào)(/SS、SCK和MOSI)就能控制網(wǎng)絡(luò)上的所有從器件。
如何實(shí)現(xiàn)菊鏈
在菊鏈系統(tǒng)中(圖2),SLAVE 1從微控制器直接接收數(shù)據(jù)。該數(shù)據(jù)在時(shí)鐘驅(qū)動(dòng)下進(jìn)入SLAVE 1的內(nèi)部移位寄存器。只要/CS (或/SS)仍然保持低電平,該數(shù)據(jù)將通過(guò)SLAVE 1的DOUT引腳輸出。SLAVE 1的DOUT引腳接至SLAVE 2的DI引腳,因此當(dāng)數(shù)據(jù)通過(guò)SLAVE 1的DOUT引腳端輸出時(shí),同時(shí)也被同步移入SLAVE 2的內(nèi)部移位寄存器。同理,當(dāng)SLAVE 2接收來(lái)自SLAVE 1的數(shù)據(jù)的時(shí)候,微控制器可同時(shí)向SLAVE 1發(fā)送另一個(gè)命令。該新命令將覆蓋SLAVE 1移位寄存器中原來(lái)的數(shù)據(jù)。只要/CS保持為低,數(shù)據(jù)會(huì)在整條菊鏈上傳遞,直到每一個(gè)從器件都接收了相應(yīng)的命令。存儲(chǔ)在每一個(gè)從器件移位寄存器中的命令將在/CS的上升沿執(zhí)行。下面例子使用MAX5233和MAX5290構(gòu)成菊鏈。電路圖范例#1
圖3給出的菊鏈結(jié)構(gòu)中連接了3個(gè)MAX5233。MAX5233為雙路、10位DAC (包含兩個(gè)DAC通道,通道A和B)。將RSTV接至VDD,模擬輸出的上電狀態(tài)被設(shè)置到中點(diǎn)。圖3. 菊鏈電路#1
圖4給出了將IC1 (A1和B1)、IC2 (A2和B2)和IC3 (A3和B3)的輸出分別設(shè)為零點(diǎn)、中點(diǎn)和滿刻度的命令序列圖。在這個(gè)例子中,使用了以下的命令:
- 0x7FF8—將滿刻度數(shù)據(jù)加載到IC3 DAC寄存器,并將兩路輸出(A3、B3)設(shè)置到滿刻度
- 0x7000—將滿刻度數(shù)據(jù)加載到IC2 DAC寄存器,并將兩路輸出(A2、B2)設(shè)置到中點(diǎn)
- 0x6000—將滿刻度數(shù)據(jù)加載到IC1 DAC寄存器,并將兩路輸出(A1、B1)設(shè)置到零點(diǎn)
圖4. 電路#1—命令時(shí)序A
在第一個(gè)命令周期(16個(gè)SCLK脈沖序列),將0x7FF8載入IC1的移位寄存器。當(dāng)/CS保持低電平,這一數(shù)據(jù)將在IC1內(nèi)傳遞,并且在下一個(gè)命令周期內(nèi)通過(guò)DOUT1輸出。在第二個(gè)命令周期內(nèi),IC1輸出端DOUT1上的數(shù)據(jù)輸入到DIN2,將0x7FF8載入IC2的移位寄存器中。同時(shí),新的命令0x7000將載入IC1移位寄存器,覆蓋了前一個(gè)命令。
第三個(gè)命令周期內(nèi),第一個(gè)命令0x7FF8將載入IC3的移位寄存器,而第二個(gè)命令0x7000將載入IC2的移位寄存器,同時(shí)IC1將接收到新的命令0x6000。此時(shí),三個(gè)IC都從菊鏈上接收到命令并存儲(chǔ)在他們的移位寄存器中。一旦/CS變高,將執(zhí)行已存儲(chǔ)的命令;A1和B1被設(shè)為零點(diǎn)、A2和B2被設(shè)為中點(diǎn)、A3和B3被設(shè)為滿刻度。
圖5給出了更為復(fù)雜的命令序列。在這個(gè)例子中,使用以下的命令(更多詳細(xì)信息,請(qǐng)參考MAX5233數(shù)據(jù)資料):
- 0x3FF8—將滿刻度數(shù)據(jù)加載到輸入寄存器A,不改變DAC寄存器和輸出
- 0x3000—將中點(diǎn)數(shù)據(jù)加載到輸入寄存器A,不改變DAC寄存器和輸出
- 0x2000—將零點(diǎn)數(shù)據(jù)加載到輸入寄存器A,不改變DAC寄存器和輸出
- 0xBFF8—將滿刻度數(shù)據(jù)加載到輸入寄存器B,不改變DAC寄存器和輸出
- 0xB000—將中點(diǎn)數(shù)據(jù)加載到輸入寄存器B,不改變DAC寄存器和輸出
- 0xA000—將零點(diǎn)數(shù)據(jù)加載到輸入寄存器B,不改變DAC寄存器和輸出
- 0x0000—空操作
圖5. 電路#1—命令序列B
在第一個(gè)三命令周期內(nèi),菊鏈上三個(gè)IC中的各個(gè)器件的移位寄存器軍接收到一條命令。IC1、IC2、IC3接收到的命令分別為0xB000、0xBFF8和0xBFF8。 器件將在/CS的上升沿執(zhí)行這些命令(第一次執(zhí)行)。執(zhí)行完之后,IC1、IC2、IC3的輸入寄存器B中分別加載了中點(diǎn)、滿刻度和滿刻度的數(shù)據(jù)。此時(shí),由于各IC的DAC寄存器B保持不變,因此B1、B2、B3均未改變。
在接下來(lái)的三命令周期內(nèi),每個(gè)IC的移位寄存器中均寫入了僅向輸入寄存器A加載數(shù)據(jù)的命令。DAC寄存器A和輸出保持不變。在/CS的上升沿,IC1、IC2、IC3的輸入寄存器A分別加載了滿刻度、零點(diǎn)和中點(diǎn)數(shù)據(jù)。此時(shí),由于只更新了輸入寄存器A而不是DAC寄存器A,因此A1、A2、A3均保持不變。
在第二次執(zhí)行命令之后,硬件/LDAC命令(驅(qū)動(dòng)/LDAC為低)將輸入寄存器中的數(shù)據(jù)加載到相應(yīng)的DAC寄存器中。這樣,DAC的輸出就被刷新為相應(yīng)的DAC寄存器中的數(shù)據(jù)。A1、B2和B3變?yōu)闈M刻度。A2變?yōu)榱泓c(diǎn)而A3仍為中點(diǎn)狀態(tài)。
在第三個(gè)命令周期,IC2和IC3接收了空操作命令(0x0000),而IC1接收0xA000命令,將零點(diǎn)數(shù)據(jù)加載到IC1的輸入寄存器B。第三次執(zhí)行命令之后,所有的輸出仍舊沒(méi)有改變。
在第四個(gè)命令周期內(nèi),IC1和IC2接收空操作命令,而IC3接收到0x3FF8命令。第四次執(zhí)行命令之后,IC3的輸入寄存器A加載滿刻度數(shù)據(jù)。另一個(gè)硬件/LDAC命令將輸入寄存器的數(shù)據(jù)加載到相應(yīng)DAC寄存器。這將使B1從中點(diǎn)變?yōu)榱泓c(diǎn),A3從中點(diǎn)變?yōu)闈M刻度。其他的輸出仍舊不變。
表1. 命令序列B中,上電后以及執(zhí)行硬件/LDAC命令后,IC1、IC2和IC3的輸出狀態(tài)
? | Analog Output Name |
| ||
After Power-Up (RSTV = VDD) | First Hardware Active-Low LDAC | Second Hardware Active-Low LDAC | ||
IC1 | A1 | Midscale | Full scale | Full scale |
B1 | Midscale | Midscale | Zero scale | |
IC2 | A2 | Midscale | Zero scale | Zero scale |
B2 | Midscale | Full scale | Full scale | |
IC3 | A3 | Midscale | Midscale | Full scale |
B3 | Midscale | Full scale | Full scale |
電路范例#2
圖6給出的菊鏈結(jié)構(gòu)中有三個(gè)MAX5290 (雙路12位DAC)。將PU接至DVDD,則上電時(shí)模擬輸出設(shè)置為滿刻度。MAX5290沒(méi)有專用于菊鏈的數(shù)字輸出。因此,需通過(guò)串口將兩個(gè)UPIO (用戶可編程輸入/輸出)引腳中的任意一個(gè)編程設(shè)置為DOUTDC_模式。更多詳細(xì)信息請(qǐng)見(jiàn)MAX5290數(shù)據(jù)資料。圖6. 菊鏈電路#2
圖7給出了命令序列示例,使用了以下的命令(更多詳細(xì)信息請(qǐng)見(jiàn)MAX5290數(shù)據(jù)資料)。
- 0xDFFF—將滿刻度數(shù)據(jù)加載到所有輸入寄存器和DAC寄存器,刷新DAC的A和B輸出
- 0xD800—將中點(diǎn)數(shù)據(jù)加載到所有輸入寄存器和DAC寄存器,刷新DAC的A和B輸出
- 0xD000—將零點(diǎn)數(shù)據(jù)加載到所有輸入寄存器和DAC寄存器,刷新DAC的A和B輸出
- 0xE400—將DAC的A和B輸出置于關(guān)斷模式
- 0xE40F—使DAC的A和B輸出跳出關(guān)斷模式
- 0xFFFF—空操作
圖7. 電路#2命令時(shí)序示例
器件在/CS上升沿時(shí)執(zhí)行已經(jīng)加載到每個(gè)器件移位寄存器中的命令。第一次執(zhí)行命令后,所有DAC輸出均刷新。IC1的DAC輸出為零點(diǎn),IC2的DAC輸出為中點(diǎn),而IC3的DAC輸出為滿刻度。
第二個(gè)命令周期時(shí),執(zhí)行命令0xE400,IC2的DAC的A和B輸出都進(jìn)入關(guān)斷模式。IC1和IC3由于執(zhí)行空操作命令而不受影響。第三個(gè)命令周期后,IC1的輸出變?yōu)闈M刻度,IC3的輸出變?yōu)榱泓c(diǎn)。而IC2的輸出仍處于關(guān)斷模式,其內(nèi)部輸入寄存器和DAC寄存器數(shù)據(jù)已被刷新。在最后的命令周期,IC2恢復(fù)正常工作模式,所有輸出變?yōu)闈M刻度。
表2. 命令序列示例中,上電后和執(zhí)行命令后,IC1、IC2、IC3的輸出狀態(tài)
? | Analog Output Name |
| ||||
After Power-Up (PU = VDD) | After First Excution | After Second Execution | After Third Execution | After Fourth Execution | ||
IC1 | A1 | Full scale | Zero scale | Zero scale | Full scale | Full scale |
B1 | Full scale | Zero scale | Zero scale | Full scale | Full scale | |
IC2 | A2 | Full scale | Midscale | Shutdown | Shutdown | Full scale |
B2 | Full scale | Midscale | Shutdown | Shutdown | Full scale | |
IC3 | A3 | Full scale | Full scale | Full scale | Zero scale | Zero scale |
B3 | Full scale | Full scale | Full scale | Zero scale | Zero scale |
評(píng)論
查看更多