日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > > strongerHuang
[導讀]關注星標公眾號,不錯過精彩內容轉自|知曉編程01概述在之前的文章中《I2C基礎原理及協(xié)議》中詳細講解了IIC協(xié)議,并且使用是NXP的官方手冊,demo示例使用IIC讀取RTC芯片,運行正常,沒有任何問題。并且更新了《IIC踩過的坑》,講述了在使用IIC讀取RTC芯片時遇到的問題,...


01概述
在之前的文章中《I2C基礎原理及協(xié)議》中詳細講解了IIC協(xié)議,并且使用是NXP的官方手冊,demo示例使用IIC讀取RTC芯片,運行正常,沒有任何問題。并且更新了《IIC踩過的坑》,講述了在使用IIC讀取RTC芯片時遇到的問題,并成功解決。


我以為我已經完全學會了IIC,但現(xiàn)實卻打了臉,我在使用《STM32IIC詳解》文中的IIC驅動,去驅動MPU6050時,總是讀取失敗。這個驅動明明是驗證過的,為什么會有問題。讓我一度很是郁悶。


02問題
不賣關子,直接說問題,是我之前的IIC驅動有問題。


問題1:


錯誤將CLK信號GPIO設置為推挽輸出。應該設置為開漏輸出。



問題2:


讀取函數(shù)有bug。1處應該先左移再讀取SDA的數(shù)據(jù),然后刪除2處的數(shù)據(jù)。



問題2:這個就是純粹的bug了,大家應該看出來了。在RTC的驅動沒有觸發(fā)bug的原因是:在RTC的IIC接收數(shù)據(jù)中,實際應用中最高位為0,觸發(fā)不了這個bug。而在MPU6050的IIC接收數(shù)據(jù)中就觸發(fā)了這個bug。我也在感慨,有時候不是程序沒有bug,而是可能沒有觸發(fā)。


問題1:這個問題,其實很簡單,IIC協(xié)議中也提到過,很多大神也知道需要將MCU的IIC引腳設置為開漏輸出。這一方面我也了解,但是沒有在意,因為一直讀取RTC一直“沒有bug”。接下來我將細細和大家分享一下IIC為什么需要開漏輸出,開漏輸出和推挽輸出有什么區(qū)別。精通的大佬可以出門左轉了,想了解一下的同學歡迎繼續(xù)往下看。


03開漏輸出
STM32F207GPIO框圖如下



普通輸入模式下,上拉和下拉電阻(微弱)的存在。主要是由于P-MOS和N-MOS的存在分為下列兩種模式


  1. 開漏模式:輸出寄存器是 0 時,激活 N-MOS, 而輸出寄存器是 1 時,端口保持高阻態(tài)(P-MOS 不會被使能)


  2. 推挽輸出: 輸出寄存器是 0 時,激活 N-MOS, 而輸出寄存器是 1 時,激活 P-MOS。


上面是我的在文章《STM32 GPIO詳解》中的說明,GPIO的其他模式請看文章《STM32 GPIO詳解》。上文說到開漏模式輸出1時,端口保持高阻態(tài),這個時候如果端口外上拉電阻,就可以輸出電平1。


開漏輸出的作用:


1:防止短路,在一些應用中,兩個GPIO鏈接在一起(中間沒有串電阻),或者在總線應用中,需要將MCU的多個GPIO連接在一起。如果都設置成推挽輸出,當一個GPIO輸出1,另一個輸出0,那么就短路了,直接涼涼。如下圖



如果換成開漏輸出,GPIO的高電平是靠上拉電阻的,也就是VCC和GND之間會有個電阻,不會出現(xiàn)短路的問題。這樣的電路就安全一些,所以部分總線采用開路輸出。


2:線與:開漏輸出還能實現(xiàn)線與,減少一個與門,簡化電路。這個問題下文講到。



04開漏輸出在IIC的應用
IIC為什么需要開漏輸出,除了上文說的到的防止短路,還有一個重要的因素就是線與。


首先我們先說一下線與功能:


線與邏輯,即兩個輸出端(包括兩個以上)直接互連就可以實現(xiàn)“AND”的邏輯功能。在總線傳輸?shù)葘嶋H應用中需要多個門的輸出端并聯(lián)連接使用,而一般TTL門輸出端并不能直接并接使用,否則這些門的輸出管之間由于低阻抗形成很大的短路電流(灌電流),而燒壞器件。


在硬件上,可用集電極開路門(OC門)或三態(tài)門(TS門)來實現(xiàn)。用OC門實現(xiàn)線與,應同時在輸出端口加一個上拉電阻。



上面是數(shù)電知識,我的個人簡單理解是:就是a,b兩條線,兩端接一塊做輸出,另兩端做輸入。如果輸入都是高電平,那輸出就是高電平,否則輸出就是低電平。


那么線與在IIC中的應用是什么呢?


答案是:多主設備搶占總線的仲裁。


在之前IIC讀取RTC或IIC讀取MPU6050的情況,都是一個主機,一個從機。但IIC設計中可以支持多主機模式,那么就面臨一個問題,當多個主機同時啟動總線時,如果仲裁的問題。線與邏輯就起到了作用。


假設主設備A需要啟動IIC,它需要在SCL高電平時,將SDA由高電平轉換為低電平作為啟動信號。主設備A在把SDA拉高后,它需要再檢查一下SDA的電平。


  1. SDA是高電平,說明主設備A可以占用總線,然后主設備A將SDA拉低,開始通信。


  2. SDA是低電平, 說明有人已經捷足先登了,主設備A不能占用總線, 結束通信。


如果主設備A拉高SDA時,已經有其他主設備將SDA拉低了。由于1
本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
關閉