91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

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

strongerHuang ? 來源:知曉編程 ? 作者:Firefly ? 2021-11-06 10:10 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

01概述

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

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

02問題

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

問題1:

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

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

問題2:

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

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

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

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

03開漏輸出

STM32F207的GPIO框圖如下

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

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

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

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

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

開漏輸出的作用:

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

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

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

04開漏輸出在IIC的應(yīng)用

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

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

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

在硬件上,可用集電極開路門(OC門)或三態(tài)門(TS門)來實(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è)問題,當(dāng)多個(gè)主機(jī)同時(shí)啟動(dòng)總線時(shí),如果仲裁的問題。線與邏輯就起到了作用。

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

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

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

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

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

05最后補(bǔ)充

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

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

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

    關(guān)注

    463

    文章

    54017

    瀏覽量

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

    關(guān)注

    18

    文章

    6392

    瀏覽量

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

    關(guān)注

    28

    文章

    1556

    瀏覽量

    131264

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    開源項(xiàng)目低功耗藍(lán)牙智能骰子總體介紹

    一款將傳統(tǒng)桌游道具與低功耗藍(lán)牙結(jié)合的創(chuàng)意!這款智能骰子基于 nRF52840 核心的低功耗模組打造,集成 MPU6050 六軸慣性測(cè)量單元,精準(zhǔn)檢測(cè)擲骰動(dòng)作與朝向,擲出后 LED 自動(dòng)點(diǎn)亮顯示點(diǎn)數(shù),藍(lán)牙 5.0 低能耗可與安卓設(shè)備配對(duì)聯(lián)動(dòng)。
    的頭像 發(fā)表于 02-27 09:08 ?309次閱讀
    開源項(xiàng)目低功耗藍(lán)牙智能骰子總體介紹

    CW32L012解算MPU6050姿態(tài)數(shù)據(jù)

    我們僅僅獲取了MPU6050的三軸加速度和角速度,要想得到姿態(tài)角,需要利用讀取的數(shù)據(jù)進(jìn)行姿態(tài)解算。
    的頭像 發(fā)表于 01-05 16:42 ?1376次閱讀
    CW32L012解算<b class='flag-5'>MPU6050</b>姿態(tài)數(shù)據(jù)

    CW32L012讀取MPU6050姿態(tài)數(shù)據(jù)

    隨著物聯(lián)網(wǎng)、可穿戴設(shè)備、工業(yè)傾角檢測(cè)等場(chǎng)景的普及,低成本、低功耗的姿態(tài)檢測(cè)方案成為嵌入式領(lǐng)域的研究熱點(diǎn)。MPU6050 作為集成三軸加速度計(jì)和三軸陀螺儀的六軸傳感器,憑借低成本、小體積的優(yōu)勢(shì)被
    的頭像 發(fā)表于 01-05 16:36 ?1090次閱讀
    CW32L012<b class='flag-5'>讀取</b><b class='flag-5'>MPU6050</b>姿態(tài)數(shù)據(jù)

    RA MCU眾測(cè)寶典 | IIC之【RA2E1】IIC通信的OLED顯示

    ,到OLED驅(qū)動(dòng)函數(shù)編寫、圖像文字取模與顯示,一起感受僅用SDA和SCL兩條線,就能實(shí)現(xiàn)設(shè)備間數(shù)據(jù)交互與可視化的便捷魅力。開啟寶典簡(jiǎn)介IIC通信協(xié)議IIC(Inte
    的頭像 發(fā)表于 01-01 10:04 ?1910次閱讀
    RA MCU眾測(cè)寶典 | <b class='flag-5'>IIC</b>之【RA2E1】<b class='flag-5'>IIC</b>通信的OLED顯示

    用dma加iic讀取mpu6050數(shù)據(jù)遇到的疑問求解

    我在用dma加iic讀取mpu6050數(shù)據(jù)時(shí),試著用dma傳輸4個(gè)數(shù),但是用freemaster查看數(shù)據(jù)以后,發(fā)現(xiàn)只有數(shù)組里面的第一個(gè)數(shù)有值,其他的都為0,而且發(fā)現(xiàn)沒進(jìn)dma傳輸完成中斷,把傳輸數(shù)量改成1以后,就能進(jìn)入dma傳輸
    發(fā)表于 12-09 07:41

    TT電機(jī),Arduino Uno,L298N 5AD ,MPU6050最簡(jiǎn)自平衡機(jī)器人資料

    ;MPU6050_6Axis_MotionApps20.h\" //https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050 MPU6050
    發(fā)表于 10-06 13:12

    請(qǐng)問IIC的設(shè)備驅(qū)動(dòng)兼容SMbus協(xié)議嗎?

    請(qǐng)問IIC的設(shè)備驅(qū)動(dòng)兼容SMbus協(xié)議么?
    發(fā)表于 09-29 09:53

    【RA4M2-SENSOR】串口傳輸MPU6050陀螺儀數(shù)據(jù)測(cè)評(píng)

    ); printf(\"hollow Acce\"); 接著配置mpu6050讀取數(shù)據(jù)代碼,將如下文件復(fù)制到工程中,并且添加到項(xiàng)目中: 配置I2C引腳: 代碼主要在bsp_iic.h中進(jìn)行修改
    發(fā)表于 09-14 11:41

    小安派BW21-CBV-Kit入門教程之DMP6讀取MPU6050數(shù)據(jù)

    本示例將演示使用 DMP6 從 MPU6050 獲取數(shù)據(jù)。MPU6050 配備了數(shù)字運(yùn)動(dòng)處理器 (DMP),用于處理運(yùn)動(dòng)算法的計(jì)算,如轉(zhuǎn)換為三軸偏航/俯仰/滾動(dòng)平面、轉(zhuǎn)換為四元數(shù)或轉(zhuǎn)換為歐拉角。
    的頭像 發(fā)表于 06-19 14:20 ?1023次閱讀
    小安派BW21-CBV-Kit入門教程之DMP6<b class='flag-5'>讀取</b><b class='flag-5'>MPU6050</b>數(shù)據(jù)

    通過control center上位機(jī)讀取USB芯片CY7C68013A數(shù)據(jù)失敗的原因?怎么解決?

    大家好,通過control center上位機(jī)讀取CY7C68013A芯片的數(shù)據(jù),連續(xù)讀取512個(gè)字節(jié)能夠成功,讀取2個(gè)字節(jié)失敗,錯(cuò)誤碼是997,一開始
    發(fā)表于 05-30 06:43

    如何從FX2LP設(shè)備的EEPROM讀取固件(.iic)?

    是否有任何工具可以從 FX2LP 設(shè)備的 EEPROM 讀取固件(.iic)? 我想備份舊固件來重新編程我的設(shè)備,但我丟失了舊的 IIC 固件。
    發(fā)表于 05-07 06:37

    MPU-6000和MPU-6050產(chǎn)品規(guī)格書

    電子發(fā)燒友網(wǎng)站提供《MPU-6000和MPU-6050產(chǎn)品規(guī)格書.pdf》資料免費(fèi)下載
    發(fā)表于 04-29 16:52 ?3次下載

    adxl382的iic讀取數(shù)據(jù)正常,但是spi似乎完全沒有響應(yīng),怎么解決?

    adxl382的iic讀取數(shù)據(jù)正常,但是spi似乎完全沒有響應(yīng),連id都讀不到,邏輯分析儀上看協(xié)議也正確,請(qǐng)問如何調(diào)試呢?
    發(fā)表于 04-29 08:08

    STM32F103對(duì)ADS1298和MPU6050同時(shí)采集數(shù)據(jù)會(huì)出現(xiàn)ADS1298數(shù)據(jù)丟失

    你好,請(qǐng)問我用STM32F103對(duì)ADS1298和MPU6050同時(shí)采集數(shù)據(jù)為何會(huì)出現(xiàn)ADS1298數(shù)據(jù)丟失,而單獨(dú)對(duì)期中任何一個(gè)傳感器單獨(dú)進(jìn)行數(shù)據(jù)采集就沒有任何問題
    發(fā)表于 03-22 17:29

    使用iic對(duì)mpu9250進(jìn)行讀取數(shù)據(jù),讀取磁力計(jì)數(shù)據(jù)時(shí)采用的是主控iic方式,但是讀取的速度特別慢,為什么?

    使用iic對(duì)mpu9250進(jìn)行讀取數(shù)據(jù),讀取磁力計(jì)數(shù)據(jù)時(shí)采用的是主控iic方式,但是讀取的速度特
    發(fā)表于 03-14 07:40