簡體   English   中英

為 I2C 配置 STM32 輸出端口

[英]Configuring STM32 output ports for I2C

我目前正在嘗試使用一對 stm32l152(探索套件)通過 I2C 進行通信。 (我沒有使用 STM 提供的標准外設庫,因為我想嘗試自己實現 i2c ..)

我的配置如下:

  • 7位尋址方式(無雙地址,只有OAR1)

  • 100khz速度

  • ACK 啟用(在從機上)

  • ACK 禁用(在主機上,因為在任何時候主機/從機之間只傳輸 1 個字節)

  • 在主/從,使用 GPIOB (PB10) 作為 SCL 和 GPIOB (PB11) 作為 SDA

這是奇怪的部分:當我將 2 個 GPIOB 引腳配置為推挽(無上拉/下拉)時,我能夠在示波器上看到我的主機發送起始位、地址字節..。

但是我的奴隸沒有發回確認。 我肯定知道這一點,因為主機沒有斷言 SR1 中的 ADDR 位,我在示波器上看不到 ack,而且從機也沒有進入中斷(我在從機上啟用了 I2C 事件中斷)。

仔細觀察示波器上的波形,我意識到信號(SCL、SDA)沒有完全達到邏輯低電平的 0 伏,而是 1 伏。 我猜這可能是為什么從站無法從主站讀取地址字節,因此沒有發回 ack。

因此,我將 2 個 GPIO 引腳配置為漏極開路(無上拉/下拉)。但現在我的主機無法發送起始位。設置 START 位 .. 但我沒有看到示波器上的 SDA 和 SCL 信號有任何響應(兩者都為 3V 高)。

(我在每條線上使用 10kohms 將 SCL 和 SDA 拉至 3v)。

好的,我想我找到了答案..我查找了STM提供的標准外設庫並遵循了它們的配置順序。 在此之前,我使用了錯誤的 GPIO 端口配置順序...

測試工作的順序是:

  1. 啟用 i2c 和 GPIO 時鍾。

  2. 配置所需的端口 AF。 (stm32 中 i2c 的 AF4)。

  3. 配置 GPIO:

    3a. 將 GPIO 設置為 AF。

    3b. 設置端口速度。

    3c。 設置端口類型(開漏)。

    3d。 設置為無上拉/下拉。

  4. 配置 i2c。 (寄存器 CR2、CCR、CR1、OAR1、...)。

以前,我在第 2 步之前執行第 3 步,當我生成 START 位時,端口沒有輸出。

希望這可以幫助那些有同樣問題的人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM