新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM8S BUG的一點總結

        STM8S BUG的一點總結

        作者: 時間:2016-11-25 來源:網絡 收藏
        意法半導體STM8S 系列單片機價格很便宜,外圍資源很豐富,開始就果斷選擇了這款單片機(STM8S103F3P)沒使用不知道,使用后心里各種不爽。主要就是它的I2C熱的禍。不知道是不是專利原因,意法的I2C做的很復雜,很別扭。官網上公布的Erratasheet就不搬過來了。針對I2C總線總是被鎖死的情況,我目前采取的辦法是(功能是主機向從機發送一個字節的數據):
        主機:(STM32F103)
        1.開啟事件中斷,關閉緩存中斷。
        2.通過BTF被置位引起的中斷來寫下一字節的數據。
        中斷響應函數中僅僅判斷三個點:
        1.Start發送完后的SB置位,按手冊說的寫地址到DR寄存器后清除該事件;
        2.地址發送完后的ADDR位,按手冊說的,讀SR2寄存器清除改事件;然后寫第一字節的數據
        3.BTF觸發中斷,發送STOP
        4.關閉I2C外設,防止干擾信號導致I2C鎖死。如果中斷處理函數中遇到其他情況就RESET下I2C。
        從機:(STM8S103F3P)
        只開事件中斷
        中斷響應函數:
        static u8 progress來記下當前的進程,用Switch語句,有點類似于Verilog HDL里寫狀態機的那個,讓進程只能按照switch里的順序執行,如果有問題就RESET,看下面的。
        uchar dat;
        static uchar progress;
        EXIT_PD_DISABLE
        switch(progress)
        {
        case 0:
        if(I2C_SR1_ADDR==1) //地址匹配
        {
        if(I2C_SR3_TRA==1) //發送
        progress=1;
        else
        progress=2;
        }
        else //ERROR
        {
        Reset();
        progress=0;
        }
        break;
        case 1://發送模式
        Reset();
        progress=0;
        break;
        case 2://接收模式
        dat=I2C_DR;
        if(dat>0xa0) dat=0xa0;
        Reset();
        progress=0;
        break;
        }
        除了I2C本身的BUG 據我目前所知,I2C和外部中斷也有沖突,具體是I2C和GPIOA的外部中斷,這個在Erratasheet里也有提到。當這兩個中斷同事要響應時GPIOA的中斷不會被響應,而是等I2C的中斷結束一段時間后,才開始響應。
        另外還有一個,就是如果I2C的中斷被打開后GPIOD如果有設置為輸入口的,GPIOD的外部中斷會自動被打開,即使GPIOD的CR2寄存器全為0 不知道怎么回事,目前還沒更加具體的去查找是什么原因。但是這個在Erraratasheet里面沒有提及。
        總之,得出了一個結論
        //1、用STM8S 盡量不要去碰硬件I2C,好多麻煩,STM32還可以。
        2、以后再做什么東西,要先下載那個單片機的Erratasheet,大致翻下心里有個數,這樣至少不會讓自己一直陷入一個死胡同,最后卻發現是硬件BUG的原因。
        3、看英文原版的DataSheet,英文要練好啊,什么東西讓人翻譯過來反而更加難理解。甚至我用的STM8S里的寄存器手冊里還有致命的翻譯所悟,弄得我搞了半天沒搞好。


        關鍵詞: STM8SBU

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 莱西市| 刚察县| 海晏县| 望都县| 梓潼县| 繁峙县| 乐平市| 杨浦区| 昌乐县| 淄博市| 庄河市| 香港| 滕州市| 马关县| 贵南县| 德钦县| 汉源县| 珠海市| 内丘县| 西乡县| 台前县| 乌拉特前旗| 黄大仙区| 灵川县| 都兰县| 阜阳市| 托里县| 饶阳县| 福泉市| 哈巴河县| 永嘉县| 上犹县| 三门县| 洛阳市| 清水河县| 呼玛县| 体育| 西乡县| 衡南县| 山东省| 庆元县|