亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

【STM32+cubemx】0011 HAL庫(kù)開(kāi)發(fā):I2C總線訪問(wèn)加速度傳感器ADXL345

paulli3 / 2545人閱讀

摘要:本節(jié)我們介紹總線,并使用的總線來(lái)訪問(wèn)加速度傳感器。主循環(huán)內(nèi)添加循環(huán)讀取的代碼編譯下載運(yùn)行,可以看到數(shù)據(jù)輸出變換傳感器方向,可以看到測(cè)出的重力加速度的數(shù)值變化。

本節(jié)我們介紹I2C總線,并使用stm32的I2C總線來(lái)訪問(wèn)加速度傳感器ADXL345。

1)I2C基礎(chǔ)知識(shí)

I2C總線通信比較適合設(shè)備內(nèi)部各芯片間的通信,它只需要兩根信號(hào)線。

I2C可以掛載多個(gè)主機(jī)和從機(jī),通信總是由主機(jī)發(fā)起。每個(gè)從機(jī)都有唯一的地址,主機(jī)通過(guò)地址決定訪問(wèn)哪個(gè)從機(jī)。

I2C總線的兩根線,SCL為時(shí)鐘線,SDA為數(shù)據(jù)線;所有的器件對(duì)這兩根線的輸出操作只能拉低,當(dāng)釋放總線時(shí),由總線上的上拉電阻將電平拉高。所以硬件連接上,上拉電阻是必須的,否則不能通信。

I2C空閑時(shí),所有器件釋放總線,SCL和SDA都被上拉電阻拉到高電平;

I2C的起始條件:SCL為高電平時(shí),SDA由高電平向低電平切換;表示開(kāi)始傳送數(shù)據(jù);一般是需要通信的主機(jī)發(fā)起,起始條件的圖示如下:

I2C的停止條件:SCL為高電平時(shí),SDA由低電平向高電平跳變;表示結(jié)束傳送數(shù)據(jù);一般也是主機(jī)最后結(jié)束通信,停止條件的圖示如下:

傳輸數(shù)據(jù)時(shí),在SCL時(shí)鐘線為高電平時(shí),SDA數(shù)據(jù)線上的電平不允許被修改;SCL時(shí)鐘線為低電平時(shí),SDA數(shù)據(jù)線上的電平可變?yōu)楦?低,如下圖所示:

I2C的ACK和NACK,都是回應(yīng),ACK是將SDA線拉低,NACK是將SDA總線釋放(拉高);ACK和NACK都是回應(yīng),可以是主機(jī)回應(yīng)從機(jī)、也可以是從機(jī)回應(yīng)主機(jī)。具體來(lái)說(shuō)(以ADXL345芯片為例):

主機(jī)發(fā)起通信后,如果要向從機(jī)寫入數(shù)據(jù),則每傳輸一個(gè)字節(jié)都需要等待從機(jī)回應(yīng)ACK,如下圖所示;具體到實(shí)際的操作,就是主機(jī)每發(fā)完一個(gè)字節(jié)的數(shù)據(jù),會(huì)釋放總線,等待從機(jī)回應(yīng)ACK(即等待從機(jī)把SDA線拉低)。最后通信完成后,主機(jī)發(fā)送停止條件:

主機(jī)發(fā)起通信后,如果要從從機(jī)處讀取數(shù)據(jù),則發(fā)送地址時(shí),需要等待從機(jī)回應(yīng)ACK;在從機(jī)向主機(jī)回復(fù)數(shù)據(jù)時(shí),主機(jī)要回應(yīng)ACK,當(dāng)主機(jī)讀完最后一個(gè)字節(jié)不再讀取時(shí),就回應(yīng)NACK;寫入數(shù)據(jù)的過(guò)程如下圖:

上面的例子是以加速度傳感器ADXL345芯片為例,其他芯片在使用I2C通信時(shí),可能有細(xì)微的不同,但基本上都是這幾種狀態(tài)組合起來(lái)的。

2)stm32的I2C總線使用

Stm32帶了硬件I2C,下面我們就使用stm32的硬件i2c讀取加速度傳感器ADXL345的數(shù)值。

我們?nèi)匀灰源诘墓こ虨榛A(chǔ),在它上面添加設(shè)置,如下圖,選擇I2C接口,其他都默認(rèn):

選擇之后可以發(fā)現(xiàn)引腳PB6和PB7被占用為I2C的引腳,其中PB6是SCL、PB7是SDA。

在硬件連接上,我們也需要將ADXL345芯片的SCL和SDA連接到PB6和PB7,并且SDA和SCL都要用電阻上拉到電源:

生成工程代碼,在keil中打開(kāi)。Stm32的hal庫(kù)已經(jīng)將i2c的初始化、i2c的讀寫操作封裝成了函數(shù),我們直接調(diào)用即可。

這里先需要修改一個(gè)bug,如下圖

__HAL_RCC_I2C1_CLK_ENABLE();這一句使能i2c時(shí)鐘的語(yǔ)句,cubemx生成的代碼在GPIO初始化之后,這樣不能設(shè)置成功,需要把它提前到GPIO初始化之前

Main函數(shù)中添加初始化ADXL345的代碼:

簡(jiǎn)單說(shuō)明一下,前面寫入的4個(gè)值是設(shè)置芯片的工作模式,最后寫入的三個(gè)值是x、y、z三個(gè)方向的校準(zhǔn)參數(shù)。由于ADXL345傳感器有初始誤差(網(wǎng)上有說(shuō)法是X、Y方向誤差不大,Z軸可能誤差達(dá)到幾個(gè)g;我的這個(gè)芯片X、Y、軸基本正常,Z軸有大約0.6g左右的誤差),可以寫入一組測(cè)好的參數(shù),讓它輸出時(shí)自動(dòng)減掉這個(gè)值,達(dá)到去除初始誤差的目的,我這里在Z軸寫入了f0,校準(zhǔn)后基本正常。

主循環(huán)內(nèi)添加循環(huán)讀取ADXL345的代碼:

編譯下載運(yùn)行,可以看到數(shù)據(jù)輸出:

變換傳感器方向,可以看到測(cè)出的重力加速度的數(shù)值變化。

3)stm32的硬件I2C問(wèn)題備忘

在使用stm32的硬件i2c時(shí),查得很多資料都說(shuō)stm32的硬件i2c有問(wèn)題,我用的不多,但是匯總了一些網(wǎng)上的討論,以作為備忘,萬(wàn)一哪天必須用硬件i2c時(shí)也好排查:

a) cubemx生成的代碼,初始化i2c的時(shí)鐘要提到GPIO初始化之前;

b) I2c的速率不能過(guò)高,有說(shuō)法是50k以下基本無(wú)問(wèn)題,100k以上運(yùn)行時(shí)間久了會(huì)出問(wèn)題;

c) 某些帶FSMC模塊的stm32 型號(hào),和I2C1模塊共用了PB7引腳,會(huì)使得I2C1不能正常啟動(dòng);即使你沒(méi)有用到FSMC只是打開(kāi)了FSMC的時(shí)鐘也會(huì)影響,解決辦法是改用I2C2或者重定義I2C的時(shí)鐘線和數(shù)據(jù)線到PB8、9引腳;或者關(guān)掉FSMC的時(shí)鐘;

d)硬件i2c不能被中斷打斷,否則會(huì)出問(wèn)題;如果使用中斷,建議i2c的中斷設(shè)置為最高優(yōu)先級(jí)。

鑒于有些問(wèn)題確實(shí)不好驗(yàn)證,本人后面都盡量用軟件i2c了,效率低一些但可靠性高,并且移植到其他芯片上也方便很多。

好了,這一節(jié)就講到這里了。

歡迎關(guān)注我的公眾號(hào),可留言“資料”獲取相關(guān)資料和軟件:

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/123686.html

相關(guān)文章

  • STM32CubeMX學(xué)習(xí)教程之硬件I2C讀取光照度

    摘要:使用庫(kù)讀寫環(huán)境光照度傳感器本文將教大家如何快速使用庫(kù)讀取光照度數(shù)據(jù)。五實(shí)驗(yàn)樣機(jī)測(cè)試展示通過(guò)之前配置好的面板,通過(guò)涂鴉智能進(jìn)行配網(wǎng)實(shí)時(shí)采集光照度傳感器的數(shù)據(jù)。 使用STM32 HAL庫(kù)讀寫環(huán)境光照度傳感器(BH1750) 本文將教大家如何快速使用STM32HAL庫(kù)讀取光照度數(shù)據(jù)。 實(shí)現(xiàn)功能:通...

    tinylcy 評(píng)論0 收藏0
  • STM32學(xué)習(xí)筆記 第二章 STM32資源介紹

    摘要:總線掛載的外設(shè)有等。外設(shè)地址映射片上外設(shè)區(qū)分為三條總線,根據(jù)外設(shè)速度的不同,不同總線掛載著不同的外設(shè),掛載低速外設(shè),和掛載高速外設(shè)。 第二章 STM32資源介紹 2...

    G9YH 評(píng)論0 收藏0
  • 使用STM32CubeMX初始化STM32F031F6Px系列

    摘要:利用可視化界面來(lái)進(jìn)行的相關(guān)配置,所以時(shí)鐘滴答定時(shí)器串口等就不用根據(jù)數(shù)據(jù)手冊(cè)去操作標(biāo)準(zhǔn)庫(kù)甚至是寄存器了,可以通過(guò)軟件直接生成。 使用STM32CubeMX初始化ST...

    Zhuxy 評(píng)論0 收藏0
  • cubemx配置stm32(三)__GPIO的輸入輸出

    摘要:配置三的輸入輸出建立工程并進(jìn)行核心配置根據(jù)文章使用配置二核心配置進(jìn)行如下配置新建工程圖形配置調(diào)試時(shí)鐘信號(hào)圖形配置時(shí)鐘樹(shù)圖形配置調(diào)試接口檢查配置配置詳解配置選擇輸入輸出比如就要配置輸出,按鍵就要配置輸入配置為輸出時(shí)配置詳 ...

    WilsonLiu95 評(píng)論0 收藏0
  • STM32】標(biāo)準(zhǔn)庫(kù)HAL庫(kù)對(duì)照學(xué)習(xí)教程八--串口通信詳解

    摘要:異步通信與同步通信異步通信異步通信是指通信的發(fā)送與接收設(shè)備使用各自的時(shí)鐘控制數(shù)據(jù)的發(fā)送和接收過(guò)程。同步通信同步通信時(shí)要建立發(fā)送方時(shí)鐘對(duì)接收方時(shí)鐘的直接控制,使雙方達(dá)到完全同步。配置串口設(shè)置為異步通信基礎(chǔ)參數(shù)波特率為。 ...

    yck 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<