1. 程式人生 > >STM32F1與I2C從裝置通訊無應答?

STM32F1與I2C從裝置通訊無應答?

最近做了STM32F103與DAC的I2C通訊,起先使用的是硬體I2C來驅動,按照時序寫好程式通訊正常,但由於電路板需求,需要將I2C的SCL和SDA線拉長,導致硬體I2C通訊經常掛死,於是考慮採用模擬I2C,(硬體I2C和模擬I2C的程式在我另外兩篇部落格上有),但是也經常掛死,最後終於找到原因,也是下面的四點:

(1)時序,這個一定要按照DAC晶片的資料手冊來

(2)地址,從裝置地址

(3)IO模式,這裡的SCL和SDA的IO要配置成開漏輸出GPIO_Mode_Out_OD,一般來說,開漏是用來連線不同電平的器件,匹配電平用的,因為開漏引腳不連線外部的上拉電阻時,只能輸出低電平,如果需要同時具備輸出高電平的功能,則需要接上拉電阻,很好的一個優點是通過改變上拉電源的電壓,便可以改變傳輸電平。比如加上上拉電阻就可以提供TTL/CMOS電平輸出等。

(4)上拉電阻,開漏輸出提供了靈活的輸出方式,但是也有其弱點,就是帶來上升沿的延時。因為上升沿是通過外接上拉無源電阻對負載充電,所以當電阻選擇小時延時就小,但功耗大;反之延時大功耗小。所以如果對延時有要求,則建議用下降沿輸出。