精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用IIC去驅動MPU6050時為什么總讀取失敗

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

01概述

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

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

02問題

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

問題1:

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

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

問題2:

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

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

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

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

03開漏輸出

STM32F207的GPIO框圖如下

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

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

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

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

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

開漏輸出的作用:

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

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

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

04開漏輸出在IIC的應用

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

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

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

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

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

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

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

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

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

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

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

如果主設備A拉高SDA時,已經有其他主設備將SDA拉低了。由于1 & 0 = 0 那么主設備A在檢查SDA電平時,會發現不是高電平,而是低電平,說明其他主設備搶占總線的時間比它早,設備A只能放棄占用總線。如果是高電平, 則可以占用。

這就是IIC通信開漏輸出的原因。上拉電阻的原因就是由于開漏輸出的特性,需要上拉電阻在輸出1時,提高驅動力。

05最后補充

最后說一下為什么之前使用推挽輸出的IIC讀取RTC沒有問題,這個因為上拉電阻的阻值不同,RTC的上拉電阻即使推挽輸出也可以正常拉高拉低電平。這個根據上文講述的,可以查MCU的datasheet,確認IO的PMOS和NMOS的阻抗,計算一下電壓。

還有一個簡單粗暴的辦法,直接使用示波器看波形也可以發現問題。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 芯片
    +關注

    關注

    454

    文章

    50427

    瀏覽量

    421860
  • 通信
    +關注

    關注

    18

    文章

    5973

    瀏覽量

    135862
  • I2C
    I2C
    +關注

    關注

    28

    文章

    1481

    瀏覽量

    123302

原文標題:I2C通信中的坑

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    CW32模塊使用 MPU6050六軸傳感器

    MPU6050 是 InvenSense 公司推出的整合性 6 軸運動處理組件,其內部整合了 3 軸陀螺儀和 3 軸加速度傳感器,并且含有一個IIC 接口, 可用于連接外部磁力傳感器,并利用自帶
    的頭像 發表于 11-14 17:54 ?177次閱讀
    CW32模塊使用 <b class='flag-5'>MPU6050</b>六軸傳感器

    【龍芯2K0300蜂鳥板試用】+IIC設備讀取陀螺儀數據

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

    硬件i2c讀寫MPU6050

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

    如何利用中斷從Mpu6050讀取數據?

    我正在使用延遲從 psoc 5LP CY8C5888LTI-LP097 中的 mpu-6050 imu 讀取數據。 我不想用延時器,我想用帶中斷的定時器代替它。 下面附上我的項目文件。 請幫我創建中斷函數。
    發表于 07-03 06:18

    ESP32-S2的iic寫入失敗如何排查?

    我在使用esp32-s2對mpu6050進行配置時,通過串口監控發現寫入時一直返回-1也就是失敗,讀取ID時的數據也同mpu6050的id相差極大...串口監控具體如圖一所示: 可以
    發表于 06-21 06:56

    求助求助,MPU6050模塊用DMP時的自檢問題

    我在mpu6050的DMP自檢始終不通過,我通過debug發現里面的兩個值st_shift_cust,st_shift_var不對,讀出來數值很大。st_shift_var讀出來5.幾
    發表于 05-18 17:27

    請問MPU6050可以做振動探測器使用嗎?

    MPU6050可以做振動探測器使用嗎?
    發表于 05-08 07:54

    mpu6050芯片的INT中斷信號引腳和單片機之間需要接電阻嗎?

    mpu6050芯片的INT中斷信號引腳和單片機之間需要接電阻嗎? 我見有的電路圖里面沒有接,有的卻說需要接,到底是怎樣的?
    發表于 05-07 07:21

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

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

    MPU6050 dmp庫定時查詢讀取偶爾獲取失敗的原因?

    在玩mpu6050 dmp庫的時候遇到了一些問題,dmp設置fifo頻率20Hz,每50ms程序中讀取一次,但是偶爾會有都不到數據的情況,mpu_read_fifo_stream讀取
    發表于 04-30 06:37

    FPGA實現IIC協議的設計

    今天給大家帶來的是IIC通信,IIC協議應用非常廣泛,例如與MPU6050進行通信,配置OV5640攝像頭、驅動OLED屏幕等等,都需要使用到IIC
    的頭像 發表于 03-04 10:49 ?1181次閱讀
    FPGA實現<b class='flag-5'>IIC</b>協議的設計

    什么是姿態傳感器MPU6050

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

    ADXL345和MPU6050的區別

    ADXL345和MPU6050是兩種常見的加速度計和陀螺儀傳感器,用于測量物體的加速度和旋轉速度。它們在設計、性能和應用方面有一些區別。在本文中,我們將對ADXL345和MPU6050的區別進行詳細
    的頭像 發表于 01-04 11:30 ?7111次閱讀

    mpu6050mpu6500哪個性能好

    MPU6050MPU6500都是InvenSense公司生產的高性能六軸陀螺儀和加速度計傳感器。它們被廣泛應用于各種領域,如移動設備、虛擬現實、機器人、汽車等。雖然它們之間有一些區別,但是無法簡單
    的頭像 發表于 12-21 16:54 ?8342次閱讀

    MPU-6000和MPU-6050產品說明書

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