2015年12月12日 星期六

STM32F4xx Software I2C Slave Test Code

1. 既然有使用GPIO模擬的I2C Master, 當然也會有使用GPIO模擬的I2C Slave, 本範例是使用2塊
    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.

  • 由於我們是使用SDA(PB9)來偵測Falling edge Interrupt, 所以我們必須使用STM32的EXTI9_5_IRQn來進行傳輸.

4. Test Flow:(Logic analyzer)
  • write one byte to slave:

  • write six bytes to slave:
  • read one byte from slave:
  • read six bytes from slave:

5. Test Code Download Link:

     Master

     Slave

12 則留言:

  1. 感謝假濕汀大大提供程式碼參考!!
    請問假濕汀大大,有試過多個slave連線嗎?
    我目前參考您寫的程式,移植到stm32f103上面,能夠1組master與一組slave能夠對傳,
    但我使用1組master與2組slave時,Master就無法收到slave回傳的值,有更改兩組不同的slave ADDRESS,目前有量示波器,發現接上第二組的SDA時,SCL就量測不到時脈波形。
    想請教假濕汀大大有沒有遇過類似的問題?

    回覆刪除
    回覆
    1. Hello:
      真不敢相信真的有人會使用這邊的程式來進行測試啊, 由於我目前暫時還沒有測試過2個slave以上的情境, 不過我想先請你幫忙做一些實驗分析看看:
      1. 第二個slave address為多少(8bit)?
      2. 第二個slave board上面有加上上拉電阻嗎?
      3. 有先使用master分別與第一個和第二個slave單獨進行測試嗎?

      justinwang

      刪除
  2. 假濕汀大大您好,我一個疑問不知道是否正確。就是在ACK的位置,我看到先拉了一個Clock才把SDA拉到High等待Slave拉為Low。是不是應該先在Clock拉成High之前就先把SDA拉成High會更好,因為Clock為Low時,SDA云許改變。如果觀念有錯,還請假濕汀大大告知,謝謝~

    回覆刪除
    回覆
    1. Hi:

      不好意思, 可以請你簡單的截圖並圈選起來是指哪一個部份嗎? 這樣我比較清楚去看哪一段的程式碼, 謝謝.

      Have a nice day,
      JustinWang

      刪除
    2. Hi Justin
      謝謝你這麼快的回覆~
      https://drive.google.com/drive/folders/0ByGBULiiQqBQNmhMX3NKVS1aRzA

      刪除
    3. 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

      刪除
  3. 作者已經移除這則留言。

    回覆刪除
    回覆
    1. Hello:

      我有測試過2個link, 都可以下載, 若你還是無法正常下載的話, 我再另外上傳到其它的網雲讓你下載, 謝謝.

      Have a nice day,
      JustinWang

      刪除
    2. 非常感謝王大大的回覆!

      刪除
  4. Hi
    首先先謝謝大大的解說
    比較了解I2C Register包了哪些資料
    start stop ack noack read write waitack的工作時機與動作

    不好意思想請問一下王大大
    SDA SCL一般在閒置的時候皆為high level
    但我量測我的板子時候都為low level不知道怎麼辦
    (我的主端從端皆為同一個開發板 device address會與401有所差別嗎?還是可以自行定義device address)
    (已移植至stm32f429zit6官方出的discovery I的開發板上面)

    回覆刪除
    回覆
    1. Hello:

      記得SCL SDA這兩隻GPIO都要另外接上拉電阻喔(e.g. 1K歐姆), 否則I2C無法動作, 因為GPIO在I2C狀態時只能輸出Output Low和Input Floating, 所以要是沒有外接上拉電阻, 則無法有High準位產生.

      Have a nice day,
      JustinWang

      刪除