0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用IIC去驅(qū)動(dòng)MPU6050時(shí)為什么總讀取失敗

strongerHuang ? 來(lái)源:知曉編程 ? 作者:Firefly ? 2021-11-06 10:10 ? 次閱讀

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)題

不賣(mài)關(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)漏輸出。

042908fa-3dfe-11ec-82a9-dac502259ad0.png

問(wèn)題2:

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

0464f400-3dfe-11ec-82a9-dac502259ad0.png

問(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ū)別。精通的大佬可以出門(mén)左轉(zhuǎn)了,想了解一下的同學(xué)歡迎繼續(xù)往下看。

03開(kāi)漏輸出

STM32F207的GPIO框圖如下

04c588b0-3dfe-11ec-82a9-dac502259ad0.png

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

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

推挽輸出:輸出寄存器是 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è)與門(mén),簡(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è)門(mén)的輸出端并聯(lián)連接使用,而一般TTL門(mén)輸出端并不能直接并接使用,否則這些門(mén)的輸出管之間由于低阻抗形成很大的短路電流(灌電流),而燒壞器件。

硬件上,可用集電極開(kāi)路門(mén)(OC門(mén))或三態(tài)門(mén)(TS門(mén))來(lái)實(shí)現(xiàn)。用OC門(mén)實(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的電平。

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

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

如果主設(shè)備A拉高SDA時(shí),已經(jīng)有其他主設(shè)備將SDA拉低了。由于1 & 0 = 0 那么主設(shè)備A在檢查SDA電平時(shí),會(huì)發(fā)現(xiàn)不是高電平,而是低電平,說(shuō)明其他主設(shè)備搶占總線的時(shí)間比它早,設(shè)備A只能放棄占用總線。如果是高電平, 則可以占用。

這就是IIC通信開(kāi)漏輸出的原因。上拉電阻的原因就是由于開(kāi)漏輸出的特性,需要上拉電阻在輸出1時(shí),提高驅(qū)動(dòng)力。

05最后補(bǔ)充

最后說(shuō)一下為什么之前使用推挽輸出的IIC讀取RTC沒(méi)有問(wèn)題,這個(gè)因?yàn)樯侠娮璧淖柚挡煌?,RTC的上拉電阻即使推挽輸出也可以正常拉高拉低電平。這個(gè)根據(jù)上文講述的,可以查MCU的datasheet,確認(rèn)IO的PMOS和NMOS的阻抗,計(jì)算一下電壓。

還有一個(gè)簡(jiǎn)單粗暴的辦法,直接使用示波器看波形也可以發(fā)現(xiàn)問(wèn)題。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 芯片
    +關(guān)注

    關(guān)注

    452

    文章

    50001

    瀏覽量

    419689
  • 通信
    +關(guān)注

    關(guān)注

    18

    文章

    5926

    瀏覽量

    135707
  • I2C
    I2C
    +關(guān)注

    關(guān)注

    28

    文章

    1468

    瀏覽量

    122791

原文標(biāo)題:I2C通信中的坑

文章出處:【微信號(hào):strongerHuang,微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    【龍芯2K0300蜂鳥(niǎo)板試用】+IIC設(shè)備讀取陀螺儀數(shù)據(jù)

    開(kāi)發(fā)板; 輸入i2cdetect -a 0進(jìn)行IIC設(shè)備檢測(cè),檢測(cè)到0x68,陀螺儀的設(shè)備地址,如下所示: 4代碼設(shè)計(jì) MPU6050初始化,打開(kāi)I2C設(shè)備 IIC讀取
    發(fā)表于 08-17 21:02

    硬件i2c讀寫(xiě)MPU6050

    本資料為MPU6050
    發(fā)表于 07-15 11:45 ?2次下載

    ESP32-S2的iic寫(xiě)入失敗如何排查?

    我在使用esp32-s2對(duì)mpu6050進(jìn)行配置時(shí),通過(guò)串口監(jiān)控發(fā)現(xiàn)寫(xiě)入時(shí)一直返回-1也就是失敗讀取ID時(shí)的數(shù)據(jù)也同mpu6050的id相差極大...串口監(jiān)控具體如圖一所示: 可以
    發(fā)表于 06-21 06:56

    求助求助,MPU6050模塊用DMP時(shí)的自檢問(wèn)題

    我在mpu6050的DMP自檢始終不通過(guò),我通過(guò)debug發(fā)現(xiàn)里面的兩個(gè)值st_shift_cust,st_shift_var不對(duì),讀出來(lái)數(shù)值很大。st_shift_var讀出來(lái)5.幾
    發(fā)表于 05-18 17:27

    請(qǐng)問(wèn)MPU6050可以做振動(dòng)探測(cè)器使用嗎?

    MPU6050可以做振動(dòng)探測(cè)器使用嗎?
    發(fā)表于 05-08 07:54

    MPU6050休眠后如何配置重力加速度喚醒MPU6050?

    MPU6050休眠后如何配置重力加速度喚醒MPU6050自己?
    發(fā)表于 05-07 06:19

    MPU6050 dmp庫(kù)定時(shí)查詢讀取偶爾獲取失敗的原因?

    在玩mpu6050 dmp庫(kù)的時(shí)候遇到了一些問(wèn)題,dmp設(shè)置fifo頻率20Hz,每50ms程序中讀取一次,但是偶爾會(huì)有都不到數(shù)據(jù)的情況,mpu_read_fifo_stream讀取
    發(fā)表于 04-30 06:37

    FPGA實(shí)現(xiàn)IIC協(xié)議的設(shè)計(jì)

    今天給大家?guī)?lái)的是IIC通信,IIC協(xié)議應(yīng)用非常廣泛,例如與MPU6050進(jìn)行通信,配置OV5640攝像頭、驅(qū)動(dòng)OLED屏幕等等,都需要使用到IIC
    的頭像 發(fā)表于 03-04 10:49 ?1122次閱讀
    FPGA實(shí)現(xiàn)<b class='flag-5'>IIC</b>協(xié)議的設(shè)計(jì)

    什么是姿態(tài)傳感器MPU6050

     MPU6050是6軸運(yùn)動(dòng)處理傳感器,它集成了3軸MEMS陀螺儀,3軸MEMS加速度計(jì),以及一個(gè)可擴(kuò)展的數(shù)字運(yùn)動(dòng)處理器DMP。使用它就是為了得到待測(cè)物體(如四軸飛行器、平衡小車(chē))x、y、z軸的傾角(俯仰角Pitch、翻滾角Roll、偏航角Yaw)。
    發(fā)表于 02-15 10:53 ?2844次閱讀
    什么是姿態(tài)傳感器<b class='flag-5'>MPU6050</b>

    ADXL345和MPU6050的區(qū)別

    ADXL345和MPU6050是兩種常見(jiàn)的加速度計(jì)和陀螺儀傳感器,用于測(cè)量物體的加速度和旋轉(zhuǎn)速度。它們?cè)谠O(shè)計(jì)、性能和應(yīng)用方面有一些區(qū)別。在本文中,我們將對(duì)ADXL345和MPU6050的區(qū)別進(jìn)行詳細(xì)
    的頭像 發(fā)表于 01-04 11:30 ?6476次閱讀

    mpu6050mpu6500哪個(gè)性能好

    MPU6050MPU6500都是InvenSense公司生產(chǎn)的高性能六軸陀螺儀和加速度計(jì)傳感器。它們被廣泛應(yīng)用于各種領(lǐng)域,如移動(dòng)設(shè)備、虛擬現(xiàn)實(shí)、機(jī)器人、汽車(chē)等。雖然它們之間有一些區(qū)別,但是無(wú)法簡(jiǎn)單
    的頭像 發(fā)表于 12-21 16:54 ?7387次閱讀

    MPU-6000和MPU-6050產(chǎn)品說(shuō)明書(shū)

    mpu6050模塊介紹?
    發(fā)表于 11-30 09:17 ?0次下載

    MPU6050數(shù)據(jù)偏差有點(diǎn)大,怎么消除?

    MPU6050出來(lái)的數(shù)據(jù)波動(dòng)很大,不知道怎么去處理?有沒(méi)有知道的麻煩請(qǐng)教一下
    發(fā)表于 11-09 07:33

    mpu6050無(wú)法獲取絕對(duì)角度嗎?

    之前用ADXL345是可以獲得相對(duì)于世界坐標(biāo)的絕對(duì)傾角角度但用MPU6050(原子的例程),似乎只能獲得相對(duì)于初始化時(shí)的角度。 也就是初始化時(shí)候如果不是水平,而是傾斜30度(比如拿俯仰角來(lái)說(shuō)),那么
    發(fā)表于 11-06 08:02

    MPU6050能用來(lái)測(cè)試速度嗎?

    MPU6050能用來(lái)測(cè)試速度么?
    發(fā)表于 10-25 08:15