近段時間在調試i2c的模組。對於i2c,自己覺得是最熟悉的,一是因為它本身的協議比價簡單,二是因為在機頂盒中也有這個模組,多少有所接觸。不過就這麼熟悉的一個東西,卻讓我調了3天!總結其中的一些失敗教訓如下,以給自己和後來人學習。
1 當所有的時序都沒有問題的時候,我修改了I2C控制器初始化時本身的地址。後來想想,這一步其實對整個程式的影響也不大。不過就改了這一步後,8段數位管居然點亮了!(我是用來調試ZLG的8段數位管和鍵盤模組)
2 這一步可能十分重要。就是I2C的速度。到網上查了不少文章,不少前輩都說I2C出問題多半是在速度上。
如果你為了調試I2C到了這裡的話,就請看看你的速度吧!很多地方都有如下的速度:
I2C匯流排的傳輸速率:
在標準模式(Standard-mode)下最快可達100Kb/s。
在快速模式下可達 400Kb/s。
在高速模式下可達3.4Mbit/s。這個速度首先放慢一點,再自己慢慢調試,貌似只有調試到最佳狀態時所有的I2C資料就會一個不漏的傳送正確!這也太神奇了吧!3 注意在單主多從機的情況下,i2c匯流排只能初始化一次!不要在跟第二個裝置通訊時再初始化哦!不然那就鐵定失敗了!4 網上有人說讀寄存器值的時候,寫完器件地址後再次發開始地址之前要有多延時。這一步,我最初也做了,後來發現其實也沒大多用處。不過測試完了後就要延時一下,不然第一個資料就收不到了!可能i2c匯流排有時候是需要一些延時的吧,個人也搞不不清楚了。5 這一步就是有關時序問題。I2C write: Start--Slave address(W)--Slave Acknowledge--data-stop
I2C read: Start--slave address(R)--Slave Acknowledge--data-NON Acknowledge--stop大家看到沒有? NON Acknowledge--stop 這兩個東西不能少呢!筆者發現少了這兩個在讀的時候就會出20%的錯誤!所以先不應答再停止才可以!我先前做的就是忘了停止這一步了!還有一點自己也很奇怪!就是目前的程式是按照這種格式寫的:-NON Acknowledge--stop-data就是停止訊號發送出去後,再接收資料。居然也只有這樣才能行!汗一個!就這麼多吧! 下次有了什麼收穫再過來寫!