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