STM8S BUG的一點(diǎn)總結(jié)
主機(jī):(STM32F103)
1.開啟事件中斷,關(guān)閉緩存中斷。
2.通過BTF被置位引起的中斷來寫下一字節(jié)的數(shù)據(jù)。
中斷響應(yīng)函數(shù)中僅僅判斷三個(gè)點(diǎn):
1.Start發(fā)送完后的SB置位,按手冊(cè)說的寫地址到DR寄存器后清除該事件;
2.地址發(fā)送完后的ADDR位,按手冊(cè)說的,讀SR2寄存器清除改事件;然后寫第一字節(jié)的數(shù)據(jù)
3.BTF觸發(fā)中斷,發(fā)送STOP
4.關(guān)閉I2C外設(shè),防止干擾信號(hào)導(dǎo)致I2C鎖死。如果中斷處理函數(shù)中遇到其他情況就RESET下I2C。
從機(jī):(STM8S103F3P)
只開事件中斷
中斷響應(yīng)函數(shù):
static u8 progress來記下當(dāng)前的進(jìn)程,用Switch語句,有點(diǎn)類似于Verilog HDL里寫狀態(tài)機(jī)的那個(gè),讓進(jìn)程只能按照switch里的順序執(zhí)行,如果有問題就RESET,看下面的。
除了I2C本身的BUG 據(jù)我目前所知,I2C和外部中斷也有沖突,具體是I2C和GPIOA的外部中斷,這個(gè)在Erratasheet里也有提到。當(dāng)這兩個(gè)中斷同事要響應(yīng)時(shí)GPIOA的中斷不會(huì)被響應(yīng),而是等I2C的中斷結(jié)束一段時(shí)間后,才開始響應(yīng)。
另外還有一個(gè),就是如果I2C的中斷被打開后GPIOD如果有設(shè)置為輸入口的,GPIOD的外部中斷會(huì)自動(dòng)被打開,即使GPIOD的CR2寄存器全為0 不知道怎么回事,目前還沒更加具體的去查找是什么原因。但是這個(gè)在Erraratasheet里面沒有提及。
總之,得出了一個(gè)結(jié)論
//1、用STM8S 盡量不要去碰硬件I2C,好多麻煩,STM32還可以。
2、以后再做什么東西,要先下載那個(gè)單片機(jī)的Erratasheet,大致翻下心里有個(gè)數(shù),這樣至少不會(huì)讓自己一直陷入一個(gè)死胡同,最后卻發(fā)現(xiàn)是硬件BUG的原因。
3、看英文原版的DataSheet,英文要練好啊,什么東西讓人翻譯過來反而更加難理解。甚至我用的STM8S里的寄存器手冊(cè)里還有致命的翻譯所悟,弄得我搞了半天沒搞好。
評(píng)論