STM32F401 Discovery Board模擬I2C Master/Slave來互相傳收資料, 由於預設的I2C GPIO是
PB6和PB9, 因此我們必須將2塊Discovery Board的PB6/PB9互接.
2. Master Main Flow:
- I2C GPIO Init.
- write one byte(0xEF) to slave.
- write six bytes(0x12,0x34,0x56,0x78,0xAB,0xCD) to slave.
- read one byte(0x55) from slave.
- read six bytes(0x11,0x22,0x33,0x44,0x55,0x66) from slave.
3. Slave Main Flow:
- 除了設定I2C GPIO外, 還需要利用Start Condition一個特性, SDA會由High to Low, 因此我們可以在SDA GPIO設定一個Falling edge Interrupt來偵測何時發生I2C傳輸.
- slave discovery board address = 0x72.
4. Test Flow:(Logic analyzer)
- write one byte to slave:
5. Test Code Download Link:
感謝假濕汀大大提供程式碼參考!!
回覆刪除請問假濕汀大大,有試過多個slave連線嗎?
我目前參考您寫的程式,移植到stm32f103上面,能夠1組master與一組slave能夠對傳,
但我使用1組master與2組slave時,Master就無法收到slave回傳的值,有更改兩組不同的slave ADDRESS,目前有量示波器,發現接上第二組的SDA時,SCL就量測不到時脈波形。
想請教假濕汀大大有沒有遇過類似的問題?
Hello:
刪除真不敢相信真的有人會使用這邊的程式來進行測試啊, 由於我目前暫時還沒有測試過2個slave以上的情境, 不過我想先請你幫忙做一些實驗分析看看:
1. 第二個slave address為多少(8bit)?
2. 第二個slave board上面有加上上拉電阻嗎?
3. 有先使用master分別與第一個和第二個slave單獨進行測試嗎?
justinwang
假濕汀大大您好,我一個疑問不知道是否正確。就是在ACK的位置,我看到先拉了一個Clock才把SDA拉到High等待Slave拉為Low。是不是應該先在Clock拉成High之前就先把SDA拉成High會更好,因為Clock為Low時,SDA云許改變。如果觀念有錯,還請假濕汀大大告知,謝謝~
回覆刪除Hi:
刪除不好意思, 可以請你簡單的截圖並圈選起來是指哪一個部份嗎? 這樣我比較清楚去看哪一段的程式碼, 謝謝.
Have a nice day,
JustinWang
Hi Justin
刪除謝謝你這麼快的回覆~
https://drive.google.com/drive/folders/0ByGBULiiQqBQNmhMX3NKVS1aRzA
Hi:
刪除我剛剛數了一下你圈起來的部份, 剛好是第9個clock, 從這個圖形上看起來, 當第9個clock出現的時候, sda是為low, 也就是所謂的ack, 如果sda為high, 那就是non-ack, 也就是我們通常所講的沒有回應.
當第9個clock起來的時候, 由於slave有回應, 因此slave會先將sda拉low, 接著再把sda floating, 也就是後面看到的high準位, 所以至少就我的認知看起來, 應該是沒有問題才對, 若是你有其它想法, 歡迎再提出一起討論喔.
Have a nice day,
JustinWang
作者已經移除這則留言。
回覆刪除作者已經移除這則留言。
回覆刪除Hello:
刪除我有測試過2個link, 都可以下載, 若你還是無法正常下載的話, 我再另外上傳到其它的網雲讓你下載, 謝謝.
Have a nice day,
JustinWang
非常感謝王大大的回覆!
刪除Hi
回覆刪除首先先謝謝大大的解說
比較了解I2C Register包了哪些資料
start stop ack noack read write waitack的工作時機與動作
不好意思想請問一下王大大
SDA SCL一般在閒置的時候皆為high level
但我量測我的板子時候都為low level不知道怎麼辦
(我的主端從端皆為同一個開發板 device address會與401有所差別嗎?還是可以自行定義device address)
(已移植至stm32f429zit6官方出的discovery I的開發板上面)
Hello:
刪除記得SCL SDA這兩隻GPIO都要另外接上拉電阻喔(e.g. 1K歐姆), 否則I2C無法動作, 因為GPIO在I2C狀態時只能輸出Output Low和Input Floating, 所以要是沒有外接上拉電阻, 則無法有High準位產生.
Have a nice day,
JustinWang