>>> 4.4.1 中斷與事件驅(qū)動(dòng)
無論采用哪種總線都使用時(shí)鐘信號和數(shù)據(jù)/控制線,時(shí)鐘信號由 MCU 主機(jī)進(jìn)行控制。用于控制的信號線中的 SPI 為 4 根,除了具有傳輸?shù)男盘柾猓€具有片選信號,通過該信號的有效與否,主機(jī)指定哪個(gè)器件作為目標(biāo)對象。
>>> 4.6.1 SPI 總線簡介
在這里,以 LPC824 為例來介紹主機(jī) SPI 的原理和應(yīng)用設(shè)計(jì)。
-
SSEL:片選輸入
當(dāng) SPI 作為主機(jī)時(shí),則在串行數(shù)據(jù)啟動(dòng)前驅(qū)動(dòng) SSEL 信號,使之變?yōu)橛行顟B(tài),并在串行數(shù)據(jù)發(fā)送后釋放該信號,使之變?yōu)闊o效狀態(tài)。默認(rèn) SSEL 為低電平有效,也可將其選為高電平有效。當(dāng) SPI 作為從機(jī)時(shí),處于有效狀態(tài)的任意 SSEL 信號都表示該從機(jī)正在被尋址。
-
MOSI :主機(jī)輸出從機(jī)輸入
MOSI 信號可將串行數(shù)據(jù)從主機(jī)傳送到從機(jī)。當(dāng) SPI 作為主機(jī)時(shí),則串行數(shù)據(jù)從 MOSI輸出;當(dāng) SPI 作為從機(jī)時(shí),則串行數(shù)據(jù)從 MOSI 輸入。
-
MISO :主機(jī)輸入從機(jī)輸出
MISO 信號可將串行數(shù)據(jù)由從機(jī)傳送到主機(jī)。當(dāng) SPI 作為主機(jī)時(shí),則串行數(shù)據(jù)從 MISO輸入;當(dāng) SPI 作為從機(jī)時(shí),則串行數(shù)據(jù)輸出至 MISO。
-
SCK:時(shí)鐘信號
SCK 同步數(shù)據(jù)傳送時(shí)鐘信號。它由主機(jī)驅(qū)動(dòng)從機(jī)接收,使用 SPI 接口時(shí),則時(shí)鐘可編程為高電平有效或低電平有效。
>>> 4.6.2 74HC595 接口
在同一時(shí)鐘信號作用下,74HC595 實(shí)現(xiàn)數(shù)據(jù)的串行輸入/并行輸出轉(zhuǎn)換。除了 8 個(gè)并行輸出口之外,74HC595 還有 5 個(gè)輸入控制口,其中的Q 7 ~ Q 0 端輸出;同時(shí)將V CC ,從而保證 74HC595 處于永久選通狀態(tài)。另外還有 3 個(gè)輸入端:CP 時(shí)鐘信號端、D 數(shù)據(jù)輸入端與 STR 鎖存信號,其分別連接 MCU 的 SCK、MOSI 與 SSEL,詳見圖 4.18。
圖 4.18 74HC595 電路圖
在 CP 時(shí)鐘信號上升沿的作用下,保證將加載 D端的二進(jìn)制數(shù)據(jù)依次送入 74HC595 中。當(dāng)數(shù)據(jù)移位完成后,在 STR 上升沿的作用下,數(shù)據(jù)將一次性地在 Q 7 ~ Q 0 端輸出,從而保證在移位的過程中,輸出端的數(shù)據(jù)保持不變。
MiniPort-595 模塊采用 74HC595 擴(kuò)展 8 路 I/O,可以直接驅(qū)動(dòng) LED 顯示模塊,其對應(yīng)AM824-Core 的 MiniPort 接口 J4 功能定義詳見圖 4.19(b)。MiniPort-595 模塊輸出信號引腳J2 功能定義詳見圖 4.19(c)。
圖 4.19 595 模塊實(shí)物與控制接口定義
假設(shè)要將 1000 0000 串行傳送到 74HC595 的并行輸出端 Q 7 ~ Q 0,此數(shù)據(jù)在時(shí)鐘脈沖的作用下,從 Q 7 ~ Q 0逐位送到串行數(shù)據(jù)輸入端 D。待 8 個(gè)時(shí)鐘脈沖過后,10000000在Q 7 ~ Q 0并行輸出。AMetal針對 74HC595 提供了相應(yīng)的 hc595.h 接口,詳見程序清單 4.44。
程序清單 4.44 hc595.h 接口
由此可見,在初始化 74HC595 相關(guān)的操作后調(diào)用 hc595_send_data(),則串行輸入并行輸出一個(gè) 8 位二進(jìn)制數(shù),74HC595 的輸出管腳當(dāng)作 8位 I/O 口使用。此前控制 8 個(gè) LED 流水燈不得不使用 8 個(gè) I/O 口,現(xiàn)在有了 74HC595,則可以節(jié)省的更多 I/O 口留作其它用途。
顯然,只要將 AM824-Core 主機(jī)、MiniPort-595 模塊的 MiniPort A(排針)與 MiniPort-LED 模塊的 MiniPort B(排母)直接對插即可,其原理圖詳見圖 4.20,模塊的組合詳見圖 4.21(a),組合之后對應(yīng) MCU 的 MiniPort 接口 J4 端口功能定義詳見圖 4.21(b),MCU 通過 STR、CP和 D 這 3 個(gè)端口控制 74HC595 芯片驅(qū)動(dòng)8 個(gè) LED,詳見程序清單 4.45。
圖 4.20 8 路輸出 I/O 擴(kuò)展
圖 4.21 模塊組合實(shí)物與控制接口定義
程序清單 4.45 74HC595 通用接口范例程序
顯然,同樣可以用 74HC595 來驅(qū)動(dòng)數(shù)碼管的 8 個(gè)段,其原理圖詳見圖 4.22。
圖 4.22 2 位數(shù)碼管驅(qū)動(dòng)電路
將AM824-Core、MiniPort-595模塊的MiniPort A(排針)與MiniPort-View模塊的MiniPort B(排母)3 個(gè)模塊直接對插即可,詳見圖 4.23(a),組合之后對應(yīng) MCU 的MiniPort接口J4功能定義詳見圖4.23 (b)。MCU 除了使用 STR、CP 和 D 端口控制74HC595,還需要使用 COM0 和 COM1控制數(shù)碼管的位選。
圖 4.23 模塊組合實(shí)物與控制接口定義
其實(shí)使用 74HC595 與直接使用 I/O驅(qū)動(dòng)數(shù)碼管,唯一的不同是段碼的輸出方式不一樣,因此僅需修改段碼傳送函數(shù),并將實(shí)現(xiàn)代碼添加到digitron1.c 中,詳見程序清單 4.46。
程序清單 4.46 新增 74HC595 驅(qū)動(dòng)數(shù)碼管的相關(guān)函數(shù)
由于用戶不會(huì)直接調(diào)用 digitron_hc595_segcode_set(),因此僅將 digitron_hc595_init()和digitron_hc595_disp_scan()添加到程序清單 4.47 所示的 digitron1.h 接口中。
程序清單 4.47 digitron1.h
當(dāng)使用 74HC595 驅(qū)動(dòng)數(shù)碼管時(shí),只要調(diào)用相關(guān)函數(shù)即可,詳見程序清單 4.48。
程序清單 4.48 74HC595 驅(qū)動(dòng)數(shù)碼管實(shí)現(xiàn)秒計(jì)數(shù)器范例程序
4.7 I2C 總線
>>> 4.7.1 I2C 總線簡介
I2C 總線(Inter Integrated Circuit)是 NXP 公司開發(fā)的用于連接微控制器與外圍器件的兩線制總線,不僅硬件電路非常簡潔,而且還具有極強(qiáng)的復(fù)用性和可移植性。I2C 總線不僅適用于電路板內(nèi)器件之間的通信,而且通過中繼器還可以實(shí)現(xiàn)電路板與電路板之間長距離的信號傳輸,因此使用 I2C 器件非常容易構(gòu)建系統(tǒng)級電子產(chǎn)品開發(fā)平臺(tái)。其特點(diǎn)如下:
-
總線僅需 2 根信號線,減少了電路板的空間和芯片管腳的數(shù)量,降低了互連成本;
-
同一條 I2C 總線上可以掛接多個(gè)器件,器件之間按不同的編址區(qū)分,因此不需要任何附加的 I/O 或地址譯碼器;
-
非常容易實(shí)現(xiàn) I2C 總線的自檢功能,以便及時(shí)發(fā)現(xiàn)總線的異常情況;
-
總線電氣兼容性好,I2C 總線規(guī)定器件之間以開漏 I/O 互連,因此只要選取適當(dāng)?shù)纳侠?a target="_blank">電阻就能輕易實(shí)現(xiàn) 3V/5V 邏輯電平的兼容;
-
支持多種通信方式,一主多從是最常見的通信方式。此外還支持雙主機(jī)通信、多主機(jī)通信與廣播模式;
-
通信速率高,其標(biāo)準(zhǔn)傳輸速率為100Kbps (每秒100K位),在快速模式下為400Kbps,按照后來修訂的版本,位速率可高達(dá) 3.4Mbps。
>>> 4.7.2 LM75B 接口
AM824-Core 選擇與 LM75A 兼容的 LM75B 數(shù)字測溫傳感器,其關(guān)斷模式下消耗的電流僅為 1μA。
1. 特性
LM75B 是 NXP 半導(dǎo)體推出的具有 I2C 接口的數(shù)字溫度傳感器芯片,其關(guān)鍵特性如下:
-
器件地址 1001xxx,同一總線上可以外擴(kuò) 8 個(gè)器件;
-
供電范圍:2.8~5.5V,溫度范圍:-55~125℃;
-
11 位 ADC 提供溫度分辨率達(dá) 0.125℃;
-
精度:±2℃(-25~100℃),±3℃(-55~125℃)。
LM75B 的管腳排列詳見圖 4.24,從機(jī)地址為 0x90,A0~A2 分別為地址選擇位 0~2,且必須在 SCL 串行時(shí)鐘輸入與 SDA 串行數(shù)據(jù)信號線上添加上拉電阻。當(dāng)芯片過熱時(shí),則關(guān)斷輸出。
圖 4.24 LM75B 管腳圖
2. 應(yīng)用電路
LM75B 典型應(yīng)用電路詳見圖 4.25,R5 和 R6 是 I2C總線的上拉電阻。由于板載只有一片 LM75B,因此不用考慮芯片的地址問題,即可將芯片的 A0~A2 引腳直接接地。OS 為芯片的過熱輸出,可以外接繼電器等器件實(shí)現(xiàn)獨(dú)立溫控器的功能。由于是通過 MCU 實(shí)現(xiàn)測溫的,因此該引腳可以懸空。只要短接(J13_1、J13_2)與(J11_1、J11_2),則 SDA、SCL 分別與 PIO0_18、PIO0_16 相連。
圖 4.25 LM75B 應(yīng)用電路圖
如圖 4.26 所示為 AM824-Core 的加熱電路,R32 的阻值為 20~50Ω(2W)。短接 J14_2與J14_3即可將焊接在LM75B附近的加熱電阻R32與KEY相連,當(dāng) KEY 鍵按下時(shí),則 R32 開始發(fā)熱,此時(shí)電阻上產(chǎn)生的熱量會(huì)通過較粗的導(dǎo)線傳導(dǎo)到 LM75B 的下面,于是LM75B 也會(huì)跟著熱起來。如果電阻越小,則通過的電流越大,產(chǎn)生的熱量也就越大。當(dāng)按鍵按下時(shí)電路導(dǎo)通,這時(shí)可以通過測溫電路觀察溫度上升情況。
圖 4.26 加熱電路
3. 溫度測量
針對 LM75B,AMetal 提供了相應(yīng)的軟件包,其函數(shù)原型為:
顯然,使用這兩個(gè)通用接口,很容易讀取當(dāng)前的溫度值。由于只有兩位數(shù)碼管,因此只顯示整數(shù)部分;當(dāng)溫度為負(fù)數(shù)時(shí),也不顯示負(fù),僅顯示溫度值,詳見程序清單 4.49。
程序清單 4.49 LM75 溫度讀取和顯示范例程序
將程序編譯后下載到開發(fā)板上運(yùn)行,如果數(shù)碼管顯示 28,表示當(dāng)前溫度為 28℃。如果按下加熱按鍵,則低阻值加熱電阻 R32 開始發(fā)熱,那么顯示的溫度值會(huì)不斷升高。
在顯示溫度值時(shí),之所以將溫度值右移了 8 位,這是因?yàn)?lm75_read()讀取的數(shù)值是實(shí)際溫度的 256 倍,所以實(shí)際溫度應(yīng)該是讀取的值除以 256.0。同時(shí),由于不需要顯示小數(shù)部分,所以直接右移 8 位,就表示除以了 256,只剩下了整數(shù)部分。
>>> 4.7.3 溫控器
下面將結(jié)合此前編寫的程序,使用 LED、蜂鳴器、數(shù)碼管、矩陣鍵盤和溫度采集,實(shí)現(xiàn)一個(gè)簡易的溫控器。
1. 功能簡介
使用標(biāo)準(zhǔn)I2C接口LM75B溫度傳感器采集溫度在數(shù)碼管上顯示,由于只有兩位數(shù)碼管,因此只顯示整數(shù)部分;當(dāng)溫度為負(fù)數(shù)時(shí),也不顯示負(fù),僅顯示溫度值。
可設(shè)置溫度上限值和溫度下限值,當(dāng)溫度高于上限值或低于下限值時(shí),則蜂鳴器鳴叫。
2. 狀態(tài)指示
在調(diào)節(jié)過程中,使用兩個(gè) LED 用于狀態(tài)指示,用短路跳線器連接 J9 和 J10 即可。
-
LED0 亮:表明當(dāng)前值為上限值,數(shù)碼管顯示上限值;
-
LED1 亮:表明當(dāng)前值為下限值,數(shù)碼管顯示下限值;
-
兩燈閃爍:表明正常運(yùn)行狀態(tài),數(shù)碼管顯示環(huán)境溫度值。
3. 操作說明
設(shè)置上下限值時(shí),共計(jì)使用 4 個(gè)按鍵。即:
-
SET 鍵:用于進(jìn)入設(shè)置狀態(tài)。點(diǎn)擊后首先進(jìn)入溫度上限值設(shè)定,再次點(diǎn)擊可進(jìn)入溫度下限值設(shè)定,再次點(diǎn)擊回到正常運(yùn)行狀態(tài);
-
左移/右移鍵:用于切換當(dāng)前調(diào)節(jié)的位(個(gè)位/十位)。當(dāng)進(jìn)入設(shè)置狀態(tài)后,當(dāng)前調(diào)節(jié)的位會(huì)不斷的閃爍;點(diǎn)擊該鍵可以切換當(dāng)前調(diào)節(jié)的位,由個(gè)位切換到十位,或由十位切換到個(gè)位;
-
加 1 鍵:當(dāng)進(jìn)入設(shè)置狀態(tài)后,當(dāng)前調(diào)節(jié)的位會(huì)不斷的閃爍,按該鍵可以使該位上的數(shù)值增加 1;
-
減 1 鍵:當(dāng)進(jìn)入設(shè)置狀態(tài)后,當(dāng)前調(diào)節(jié)的位會(huì)不斷的閃爍,按該鍵可以使該位上的數(shù)值增減 1。
(1)設(shè)置上限值
首次按下 SET 鍵進(jìn)入上限值設(shè)置,此時(shí) LED0 點(diǎn)亮,數(shù)碼管顯示上限值溫度,個(gè)位不停閃爍。按“加 1 鍵”或“減 1 鍵”可以對當(dāng)前閃爍位上得值進(jìn)行調(diào)整,按下“左移/右移鍵”可以切換當(dāng)前調(diào)節(jié)的位。
(2)設(shè)置下限值
在設(shè)置上限值的基礎(chǔ)上,再次點(diǎn)擊 SET 鍵即可進(jìn)入下限值的設(shè)定,此時(shí) LED1 點(diǎn)亮,數(shù)碼管顯示下限值溫度,個(gè)位不停閃爍。按“加 1 鍵”或“減 1 鍵”可以對當(dāng)前閃爍位上的值進(jìn)行調(diào)整,按“左移/右移鍵”可以切換當(dāng)前調(diào)節(jié)的位。
4. 功能實(shí)現(xiàn)
如程序清單 4.50 所示為溫控器的范例程序,程序中比較繁瑣的是按鍵的處理程序。為了使程序結(jié)構(gòu)更加清晰,分別對 3 種按鍵:切換狀態(tài)(KEY0)、切換當(dāng)前調(diào)節(jié)位(KEY2)、調(diào)節(jié)當(dāng)前位的值(KEY1 和 KEY3)寫了 3 個(gè)函數(shù),各個(gè)函數(shù)直接在 key_process()按鍵處理程序中調(diào)用。其它部分均在 while(1)主循環(huán)中完成,主要完成 3 件事情:溫度值的采集,每隔 500ms 進(jìn)行一次;鍵盤掃描,每隔 10ms 進(jìn)行一次;數(shù)碼管掃描,每隔 5ms 進(jìn)行一次。
程序清單 4.50 綜合實(shí)驗(yàn)范例程序
-
SPI總線
+關(guān)注
關(guān)注
4文章
103瀏覽量
27589 -
IIC總線
+關(guān)注
關(guān)注
1文章
66瀏覽量
20304 -
接口編程
+關(guān)注
關(guān)注
0文章
9瀏覽量
8736
原文標(biāo)題:周立功:面向接口的編程——SPI 總線和IIC 總線
文章出處:【微信號:ZLG_zhiyuan,微信公眾號:ZLG致遠(yuǎn)電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論