除錯模擬I2C遇到的問題

2021-08-28 12:09:04 字數 1007 閱讀 1455

最近一直在調模擬i2c,使用的是rtt提供的模擬i2c的驅動,工作是從stm32f302移植到stm32f103,主要的改動在於定時器和gpio。除錯幾天之後發現總是沒有ack,一直懷疑是在讀ack的時候沒有把sda的gpio配置為輸入模式,但也沒有去深究(太不嚴謹了!)。

定時器確定沒有問題之後,問題肯定是出在gpio配置上了,經過看手冊發現,將stm32的gpio配置為開漏輸出,仍然可以使用讀取暫存器的方式讀到管腳的高、低電平(這就是開漏輸出和推挽輸出的區別啊)。而我將其配置為推挽輸出了,這樣從裝置是沒法將其拉低的。從中可以學些下開漏輸出和推挽輸出的區別。

簡單介紹下推挽輸出和開漏輸出的區別:

推挽輸出:可以輸出高,低電平,連線數字器件。

輸出 0 時,n-mos 導通,p-mos 高阻,輸出0。

輸出 1 時,n-mos 高阻,p-mos 導通,輸出1(不需要外部上拉電路)。

開漏輸出:輸出端相當於三極體的集電極. 要得到高電平狀態需要上拉電阻才行. 適合於做電流型的驅動,其吸收電流的能力相對強(一般20ma以內).

輸出 0 時,n-mos 導通,p-mos 不被啟用,輸出0。

輸出 1 時,n-mos 高阻, p-mos 不被啟用,輸出1(需要外部上拉電路);可以讀io輸入電平變化,此模式可以把埠作為雙向io使用。

最後,在操作eeprom的時候要注意晶元的大小,單位元組位址最大可以寫256個位元組。如果大於256的容量就要使用雙位址。\

eeprom在讀寫操作時,經測試即可以是單位元組位址(最大256bytes)操作,也可以是雙位元組位址(如果大於256)操作。

是都可以進行正常讀寫的。

也可以是device_control_write+ 0x00 + 0x00 + device_control_read(最大讀取2的16次方)

還要注意eeprom的wp管腳為寫保護管腳,高電平為寫保護狀態。要將其改為低電平。

i2c除錯記錄

i2c簡單時序關係 平時clk sda都為高電平 當clk為高,sda發生一次下降沿,觸發開始訊號 然後由clk的高電平期間取樣 sda資料,在clk高時候需要保持sda 先傳送7位位址和一位讀寫標誌 所以i2c位址一般是7位的 然後接收端回乙個ack 然後傳送8位reg位址,回乙個ack 然後就是...

模擬舵機除錯(I2C轉PWM輸出 )

平台 mt6737m 舵機 模擬舵機 知識儲備 舵機 介面 vcc,gnd,訊號 原理 乙個20ms左右的時基脈衝,該脈衝的高電平部分一般為0.5ms 2.5ms範圍內的角度控制脈衝。簡單講,就是乙個50hz的pwm波形,脈寬 高電平 範圍在0.5 2.5ms變化,控制角度的變化。我們平台用了10個...

I2C讀寫問題

a.完全不能進行讀寫 1 通訊協議不正確 有很多的i2c裝置,並不支援所有的i2c協議,同時也不是乙個比較標準的i2c裝置 軟體的通訊時序不正確。2 i2c裝置位址不正確 有很多的i2c裝置的位址是可以通過硬體設定的 也有器件資料提供的資料是錯誤的。3 i2c通訊線上沒有加上拉電阻 由於i2c的從裝...