大部分的MCU(PIC16,PIC18)都有所謂的SSP(Synchronous Serial Port),SPI/I2C slave,這兩個功能只能二選一來使用,不過有些item的I2C是有問題的,如PIC16F689 在第一次R/W會出錯,第二次之後就OK了,詳細說明請參考PIC16F689 Errata 的 2.1 SSP 的說明及解決方式;
http://ww1.microchip.com/downloads/en/DeviceDoc/80243J.pdf

前幾天遇到一個問題,mainchip 連續讀取pic16f723(I2C slave),會發生scl & sda 皆被pic16f723 pull low 且不會被release(有斷開線,來確認),造成I2C的ISR無法再次發生,不過pic16f723其他功能都還是OK的,問題發生的機率似乎不一定,有時讀個幾十次就發生,有時要上千次才發生,因為CODE是別人寫的,所以I2C的ISR流程並沒有K的很仔細(人已壓在客戶那,時間緊迫,沒法K了...:p),不過可以確定離開ISR前SSPIF=0; & CPK=1; 都有做了,該清的ERROR bit 也都做了,這樣雖有將發生次數往後拉,不過一樣有機會發生錯誤,這樣的情況,既使用ICD2 debug也難做,況且mianchip端的I2C 也是用GPIO的SW I2C,也有可能是因為wait staut 的時間沒等所造成的,但即便如此,頂多該次的CMD無效,pic16f723  I2C fail 實在是說不過去,

後來想到如果I2C fail的原因是因為scl & sda 皆pull low,所以SSPIF就沒機會被設為1,當然就不可能再進去ISR去執行I2C的routine,所以只要利用TIMER(about 5ms)去做一個假的SSPIF=1;這樣強制執行I2C的routine,這樣就能release scl & sda,經測試結果問題真的解了...ㄏㄏㄏ

ps:或許用CPK=1;也能達到同樣的效果........//試過了,不行

文章標籤
全站熱搜
創作者介紹
創作者 iamqq 的頭像
iamqq

iAmqq

iamqq 發表在 痞客邦 留言(0) 人氣(856)