2011-09-06

Arduino I2C Wire.h Multi-Masters功能實作(I2C Slave Device)



GravitechArduino
7SEG Shield
為具有三個I2C裝置的Arduino擴充板,包含:


(1) SAA1064晶片驅動的4位數7LED (I2C address: 0x38)

(2) TMP75數位溫度感應器 (I2C address:0x49)

(3) 24LC128 EEPROM (I2C address:0x50)


關於各I2C裝置的用法,可參考原廠Datasheet,同時也可以參照Gravitech所提供的Sample
Code
,示範由TMP75讀取溫度值然後顯示在LED的作法。




Arduino多功能I2C裝置實作




在前篇 NXTArduino多重I2C Master之實作測試對於Arduino Wire.h Library I2C Multi-Master功能的實作,這裡再以相同的應用方式改以Arduino UNO加上這個Shield組合而成為一個多功能I2C裝置作為實作範例,

並規劃
UNO兼具以下之I2C SlaveMaster雙角色功能:




UNO擔任Slave角色,負責接收與回應來自其他外部裝置對於多功能I2C裝置I2C操作需求。

UNO處理外部I2C訊息時,若需要控制擴充板裝置(SAA1064TMP75)的運作, UNO轉換成為Master角色,傳送I2C指令操作指定裝置。



因此就多功能I2C裝置而言,UNO就如同擔任代理人(Delegate) 角色,負責處理外部使用需求的介面。

依據這樣的應用,規劃多功能I2C裝置的功能如下:

 

(1)
UNO Sketch setup()先進行TMP75SAA1064的初始化設定(Master角色)

完成之後以0x31
address
加入I2C bus loop()即進入接收外部I2C通訊的待命狀態(Slave角色)




(2)
receiveEvent ()處理外部裝置使用LED顯示數字(Register
address: 0x42
)
字串(Register
address: 0x43
)
的功能,包含:數字、字母的LED字型轉換,以及字串以跑馬燈方式顯示。




(3)
requestEvent()處理回復裝置資訊的需求(Register
address: 0x00
)




(4)
對於TMP75數位溫度計考慮讀取效率,由外部裝置直接以Slave address(0x49)進行讀取(回復2Bytes),不間接透過UNO處理。




Arduino I2C
Slave Device
處理Master request須知




Arduino UNO作為Slave device,對於處理與回應外部I2C requestSketch程式碼,需要留意以下注意事項:



(1)
loop()中,應該專職於Slave的角色,除非是要處理來自Master的要求,不要主動去啟始對其他Slave DeviceI2C通訊,否則會造成外部裝置(Master)無法通訊的狀況。



(2)
receiveEvent ()中,只進行資料的接收,後續的需求處理,應該在接收完成後回到loop()再進行,以免干擾整體的通訊過程。



(3)
requestEvent()中,只處理資料的回復,必須維持以Slave角色完成通訊過程的完整性,如果要求回復的資料需要去向另一個Slave Device request,就必須拆分成兩次通訊過程來完成。




NANO作為外部裝置測試







(1)
要求UNO Slave (0x31)
回傳它的裝置資訊 (Register address: 0x00) ,會觸發requestEvent() 回傳UNO-Ox31的字串。




(2)
要求TMP75 (0x49)
回傳所測量的溫度值。




(3)
要求UNO Slave (0x31)
LED顯示數值資料(Register
address: 0x42
)
,會觸發receiveEvent() 接收顯示指令及數值,先判斷設定status flag (isDisplayNumber=true) 之後,回到loop () 即依據status flag啟始對SAA1064的數字顯示要求。




(4)
要求UNO Slave (0x31)
LED以跑馬燈方式顯示字串(Register
address: 0x43
)
,會觸發receiveEvent () 接收顯示指令及字串,先判斷設定status flag (isDisplayText=true) 之後,回到loop () 啟始對SAA1064的字串顯示要求。




Sketch程式:

(1)  Arduino I2C Slave Device -
Arduino_I2C_Device.pde

(2)  NANO
外部裝置 - NANO_CTRL_4SEG7.pde







沒有留言:

張貼留言