www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > strongerHuang
[導(dǎo)讀]關(guān)注星標(biāo)公眾號(hào),不錯(cuò)過(guò)精彩內(nèi)容轉(zhuǎn)自|知曉編程01概述在之前的文章中《I2C基礎(chǔ)原理及協(xié)議》中詳細(xì)講解了IIC協(xié)議,并且使用是NXP的官方手冊(cè),demo示例使用IIC讀取RTC芯片,運(yùn)行正常,沒(méi)有任何問(wèn)題。并且更新了《IIC踩過(guò)的坑》,講述了在使用IIC讀取RTC芯片時(shí)遇到的問(wèn)題,...


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


我以為我已經(jīng)完全學(xué)會(huì)了IIC,但現(xiàn)實(shí)卻打了臉,我在使用《STM32IIC詳解》文中的IIC驅(qū)動(dòng),去驅(qū)動(dòng)MPU6050時(shí),總是讀取失敗。這個(gè)驅(qū)動(dòng)明明是驗(yàn)證過(guò)的,為什么會(huì)有問(wèn)題。讓我一度很是郁悶。


02問(wèn)題
不賣關(guān)子,直接說(shuō)問(wèn)題,是我之前的IIC驅(qū)動(dòng)有問(wèn)題。


問(wèn)題1:


錯(cuò)誤將CLK信號(hào)GPIO設(shè)置為推挽輸出。應(yīng)該設(shè)置為開(kāi)漏輸出。



問(wèn)題2:


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



問(wèn)題2:這個(gè)就是純粹的bug了,大家應(yīng)該看出來(lái)了。在RTC的驅(qū)動(dòng)沒(méi)有觸發(fā)bug的原因是:在RTC的IIC接收數(shù)據(jù)中,實(shí)際應(yīng)用中最高位為0,觸發(fā)不了這個(gè)bug。而在MPU6050的IIC接收數(shù)據(jù)中就觸發(fā)了這個(gè)bug。我也在感慨,有時(shí)候不是程序沒(méi)有bug,而是可能沒(méi)有觸發(fā)。


問(wèn)題1:這個(gè)問(wèn)題,其實(shí)很簡(jiǎn)單,IIC協(xié)議中也提到過(guò),很多大神也知道需要將MCU的IIC引腳設(shè)置為開(kāi)漏輸出。這一方面我也了解,但是沒(méi)有在意,因?yàn)橐恢弊x取RTC一直“沒(méi)有bug”。接下來(lái)我將細(xì)細(xì)和大家分享一下IIC為什么需要開(kāi)漏輸出,開(kāi)漏輸出和推挽輸出有什么區(qū)別。精通的大佬可以出門左轉(zhuǎn)了,想了解一下的同學(xué)歡迎繼續(xù)往下看。


03開(kāi)漏輸出
STM32F207GPIO框圖如下



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


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


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


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


開(kāi)漏輸出的作用:


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



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


2:線與:開(kāi)漏輸出還能實(shí)現(xiàn)線與,減少一個(gè)與門,簡(jiǎn)化電路。這個(gè)問(wèn)題下文講到。



04開(kāi)漏輸出在IIC的應(yīng)用
IIC為什么需要開(kāi)漏輸出,除了上文說(shuō)的到的防止短路,還有一個(gè)重要的因素就是線與。


首先我們先說(shuō)一下線與功能:


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


在硬件上,可用集電極開(kāi)路門(OC門)或三態(tài)門(TS門)來(lái)實(shí)現(xiàn)。用OC門實(shí)現(xiàn)線與,應(yīng)同時(shí)在輸出端口加一個(gè)上拉電阻。



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


那么線與在IIC中的應(yīng)用是什么呢?


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


在之前IIC讀取RTC或IIC讀取MPU6050的情況,都是一個(gè)主機(jī),一個(gè)從機(jī)。但I(xiàn)IC設(shè)計(jì)中可以支持多主機(jī)模式,那么就面臨一個(gè)問(wèn)題,當(dāng)多個(gè)主機(jī)同時(shí)啟動(dòng)總線時(shí),如果仲裁的問(wèn)題。線與邏輯就起到了作用。


假設(shè)主設(shè)備A需要啟動(dòng)IIC,它需要在SCL高電平時(shí),將SDA由高電平轉(zhuǎn)換為低電平作為啟動(dòng)信號(hào)。主設(shè)備A在把SDA拉高后,它需要再檢查一下SDA的電平。


  1. SDA是高電平,說(shuō)明主設(shè)備A可以占用總線,然后主設(shè)備A將SDA拉低,開(kāi)始通信。


  2. SDA是低電平, 說(shuō)明有人已經(jīng)捷足先登了,主設(shè)備A不能占用總線, 結(jié)束通信。


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